Salve,
sono ancora preso dalla programmazione di un applicazione console che registri l'audio dal device scelto e ne salvi il contenuto su file in real time.
Il programma deve aprire in input il device scelto, aggiungere buffers alla waveIn e iniziare a registrare. La callback relativa si occuperà di salvare i dati in arrivo.
Questo è la parte principale del mio codice:
mio codice
Mi sono imbattuto in un codice simile in rete, dove però viene usata una diversa maniera di allocare i buffers:codice:int main() { // Definisco la struttura WAVEFORMATEX WAVEFORMATEX waveFormat; waveFormat.wFormatTag = WAVE_FORMAT_PCM; waveFormat.wBitsPerSample = 16; waveFormat.nChannels = 1; waveFormat.nSamplesPerSec = 8000; waveFormat.nBlockAlign = (waveFormat.nChannels * waveFormat.wBitsPerSample) / 8; waveFormat.nAvgBytesPerSec = (waveFormat.nSamplesPerSec * waveFormat.nBlockAlign); waveFormat.cbSize = 0; MMRESULT mmres; // ... HWAVEIN phvi; // Handle for the input device UINT uDevice = 0; // Device id "Gruppo Microfoni" // waveInOpen mmres = waveInOpen(&phvi, uDevice, (LPWAVEFORMATEX)&waveFormat, (DWORD)waveInProc, 0, CALLBACK_FUNCTION ); // Prepare Buffer int i=0; int num_buff = 3; WAVEHDR *buffer = (WAVEHDR *) malloc(sizeof(WAVEHDR)*num_buff); for (i=0; i<num_buff; i++) { buffer[i].lpData = (LPSTR) malloc(system_buf_len); buffer[i].dwBufferLength = system_buf_len; buffer[i].dwBytesRecorded = 0; buffer[i].dwUser = 0; buffer[i].dwFlags = 0; buffer[i].dwLoops = 0; waveInPrepareHeader(phvi, &buffer[i], sizeof(WAVEHDR)); waveInAddBuffer(phvi, &buffer[i], sizeof(WAVEHDR)); } //waveInStart; waveInStart(phvi); system("pause"); //waveInClose; waveInClose(phvi); return 0; }
altro codice
Mi domandavo qual'era la differenza sostanziale dei due metodi!codice:/* Preparing system buffers */ sb = (WAVEHDR**) malloc(sizeof(WAVEHDR**) * system_buf_num); if(!sb) goto problem; for (i = 0; i < system_buf_num; i++) sb[i] = NULL; for (i = 0; i < system_buf_num; i++) { count = i; sb[i] = (WAVEHDR*) malloc(sizeof(WAVEHDR)); if (sb[i] == NULL) { put_debug_message("malloc() error!\n"); goto problem; } sb[i]->lpData = (LPBYTE) malloc(system_buf_len); sb[i]->dwBufferLength = system_buf_len; sb[i]->dwBytesRecorded = 0; sb[i]->dwUser = 0; sb[i]->dwFlags = 0; sb[i]->dwLoops = 0; if(!sb[i]->lpData) goto problem; if (waveInPrepareHeader(rip->hwi, sb[i], sizeof(WAVEHDR))) { put_debug_message("waveInPrepareHeader problem!\n"); goto problem; } if (waveInAddBuffer(rip->hwi, sb[i], sizeof(WAVEHDR))) { put_debug_message("waveInAddBuffer problem!\n"); goto problem; } }
Inoltre nel mio codice posso solo accedere ai dati della struttura solo tramite punto, nell'altro codice invece usano ->. Perchè il compilatore non mi permette lo stesso tipo di accesso? Inoltre la struttura WAVEHDR nel mio codice viene passata per riferimento, nell'altro no
nella riga:
sb = (WAVEHDR**) malloc(sizeof(WAVEHDR**) * system_buf_num);
come viene dichiarato "sb" ?? non credo tramite WAVEHDR *sb!
Grazie



Rispondi quotando