PDA

Visualizza la versione completa : [C++ Win32] waveInGetDevCaps (argomenti)


gianvituzzi
19-12-2009, 04:08
Salve,

mi piacerebbe ottenere delle informazioni riguardanti i dispositivi di audio in input nel mio pc. Per ottenere questi dati devoi fare ricorso alla API di Win32 "Waveform" (winmm.lib). Per adesso l'unica funzione dell'api in questione che so usare la seguente:

waveInGetNumDevs


#include <windows.h>
#pragma comment (lib, "winmm.lib")
#include <mmsystem.h>
#include <iostream>

int main()
{
UINT nDevices = waveInGetNumDevs();
std::cout << nDevices <<std::endl;
return 0;
}


che mi ritorna quanti dispositivi audio in input sono disponibili. Ora mi piacerebbe espandere il mio programma ed ottenere pi info su ognuno di questi dispositivi, usando quindi la funzione waveInGetDevCaps che ha la seguente struttura:



MMRESULT waveInGetDevCaps(
UINT uDeviceID, // Identifier of the waveform-audio output device.
LPWAVEINCAPS pwic, // Address of a WAVEINCAPS structure to be filled with information about the capabilities of the device.
UINT cbwic // Size, in bytes, of the WAVEINCAPS structure.
);


quindi questa funzione ha bisogno in un parametro il passaggio ad una struttura del genere WAVEINCAPS



typedef struct {
WORD wMid; // Manufacturer identifier for the device driver
WORD wPid; // Product identifier for the waveform-audio input device.
MMVERSION vDriverVersion; // Version number of the device driver.
CHAR szPname[MAXPNAMELEN]; // Product name in a null-terminated string.
DWORD dwFormats; // Standard formats that are supported.
WORD wChannels; // Number specifying whether the device supports mono or stereo
WORD wReserved1; // Padding. (?)
} WAVEINCAPS;


ho provato quindi il seguente codice:



#include <windows.h>
#pragma comment (lib, "winmm.lib")
#include <mmsystem.h>
#include <iostream>

int main()
{
UINT nDevices = waveInGetNumDevs();
WAVEINCAPS wcps;
waveInGetDevCaps(1,wcps,sizeof(wcps));
std::cout << nDevices <<std::endl;
return 0;
}


e questo l'errore che ottengo:

error C2664: 'waveInGetDevCapsA' : cannot convert parameter 2 from 'WAVEINCAPS' to 'LPWAVEINCAPSA'

qual' lo sbaglio??

grazie

XWolverineX
19-12-2009, 10:39
Devi passargli l'indirizzo della struttura.

gianvituzzi
19-12-2009, 11:49
che svista :nonono:

ora funziona!



#include <windows.h>
#pragma comment (lib, "winmm.lib")
#include <mmsystem.h>
#include <iostream>

int main()
{
UINT nDevices = waveInGetNumDevs();
WAVEINCAPS wcps;
for (int k=0; k<nDevices; k++)
{
waveInGetDevCaps(k,&wcps,sizeof(wcps));
char * devname = wcps.szPname;
std::cout << devname << std::endl;
}
return 0;
}

gianvituzzi
19-12-2009, 11:54
Il codice che ho postati funziona ma il compilatore mi ritorna questo warning nella riga della FOR:

warning C4018: '<' : signed/unsigned mismatch

come mai??

oregon
19-12-2009, 11:57
for (UINT k=0; k<nDevices; k++)

gianvituzzi
19-12-2009, 12:06
ok, ora funziona perfettamente senza warnings:



#include <windows.h>
#pragma comment (lib, "winmm.lib")
#include <mmsystem.h>
#include <iostream>

int main()
{
UINT nDevices = waveInGetNumDevs();
WAVEINCAPS wcps;
for (UINT k=0; k<nDevices; k++)
{
waveInGetDevCaps(k,&wcps,sizeof(wcps));
std::cout << "uDevice" << k << std::endl;
std::cout << "wMid:" << wcps.wMid << std::endl;
std::cout << "wPid:" << wcps.wPid << std::endl;
std::cout << "vDriverVersion:" << wcps.vDriverVersion << std::endl;
std::cout << "szPname:" << wcps.szPname << std::endl;
std::cout << "dwFormats:" << wcps.dwFormats << std::endl;
std::cout << "wChannels:" << wcps.wChannels << std::endl;
std::cout << "wReserved1:" << wcps.wReserved1 << std::endl << std::endl;
}
return 0;
}

Loading