visiste: 1429
//WIN Audio Class //by mamo139 //dipendenze: windows.h #ifndef _WIN_AUDIO_H_ #define _WIN_AUDIO_H_ 1 #define WIN_AUDIO_CLASS_VERSION "0.01.01" #include <stdio.h> #include <tchar.h> #include <math.h> #include <iostream> #include <windows.h> #pragma comment(lib,"Winmm.lib") #define WA_CAMPIONI_PER_SECONDO 8000 #define WA_BIT_PER_CAMPIONE 8 class win_audio { private: int campioni_per_secondo; int bit_per_campione; int canali; int recording_event; int playing_event; HWAVEIN input_device; WAVEHDR wave_in_struct; HWAVEOUT output_device; WAVEHDR wave_out_struct; char *audio_buffer; long audio_buffer_size; int audio_buffer_setted; int err, err_size; char *err_buffer; public: win_audio(); ~win_audio(); //registrare da microfono a buffer int input_open_device(); //impostiamo dispositivo di registrazione int input_set_buffer(long lBuffer); //settiamo il buffer audio_buffer int input_record(); //iniziamo la registrazione int input_close_device(); //chiudiamo il dispositivo di registrazione //riproduzione di un buffer int output_open_device(); //impostiamo dispositivo di riproduzione int output_set_buffer(char *buffer, long lBuffer); //settiamo il buffer da riprodurre int output_play(); //iniziamo la riproduzione int output_close_device(); //chiudiamo dispositivo di riproduzione //altri metodi char * get_audio_buffer(); long get_audio_buffer_size(); //callbacks friend void CALLBACK waveOutProc(HWAVEOUT hwo, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2); friend void CALLBACK waveInProc(HWAVEIN hwi, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2); }; #endif
#include "win_audio.h" win_audio::win_audio(){ campioni_per_secondo = WA_CAMPIONI_PER_SECONDO; bit_per_campione = WA_BIT_PER_CAMPIONE; canali = 1; playing_event = 0; recording_event = 0; input_device = NULL; output_device = NULL; audio_buffer = NULL; audio_buffer_size = 0; audio_buffer_setted = 0; err = 0; err_size = 2000; err_buffer = new char[err_size]; } win_audio::~win_audio(){ delete [] err_buffer; if(audio_buffer_setted == 1) delete [] audio_buffer; printf("win_audio distrutta...\n"); } int win_audio::input_open_device(){ WAVEFORMATEX formato_wave; formato_wave.wFormatTag = WAVE_FORMAT_PCM; formato_wave.nChannels = canali; formato_wave.nSamplesPerSec = campioni_per_secondo; formato_wave.nAvgBytesPerSec = campioni_per_secondo*bit_per_campione*canali/8; formato_wave.nBlockAlign = canali*bit_per_campione/8; formato_wave.wBitsPerSample = bit_per_campione; formato_wave.cbSize = sizeof(WAVEFORMATEX); err = waveInOpen(&input_device, WAVE_MAPPER, &formato_wave, (DWORD_PTR)waveInProc, (DWORD_PTR)this, CALLBACK_FUNCTION); if(err != MMSYSERR_NOERROR ){ waveInGetErrorText(err, err_buffer, err_size); printf("waveInOpen err: %d %s\n",err, err_buffer); getchar(); return 0; } return 1; } int win_audio::input_set_buffer(long lBuffer){ if(audio_buffer_setted == 1) delete [] audio_buffer; audio_buffer = new char[lBuffer]; audio_buffer_size = lBuffer; audio_buffer_setted = 1; memset(&wave_in_struct, 0, sizeof(WAVEHDR)); wave_in_struct.lpData = audio_buffer; wave_in_struct.dwBufferLength = lBuffer; err = waveInPrepareHeader(input_device, &wave_in_struct, sizeof(WAVEHDR)); if(err != MMSYSERR_NOERROR ){ waveInGetErrorText(err, err_buffer, err_size); printf("err: %d %s\n",err, err_buffer); getchar(); return 0; } return 1; } int win_audio::input_record(){ recording_event = 1; err = waveInAddBuffer(input_device, &wave_in_struct, sizeof(WAVEHDR)); if(err != MMSYSERR_NOERROR ){ waveInGetErrorText(err, err_buffer, err_size); printf("waveInAddBuffer err: %d %s\n",err, err_buffer); getchar(); return 0; } err = waveInStart(input_device); if(err != MMSYSERR_NOERROR ){ waveInGetErrorText(err, err_buffer, err_size); printf("waveInStart err: %d %s\n",err, err_buffer); getchar(); return 0; } while(recording_event == 1){ Sleep(5); } err = waveInStop(input_device); if(err != MMSYSERR_NOERROR ){ waveInGetErrorText(err, err_buffer, err_size); printf("waveInStop err: %d %s\n",err, err_buffer); getchar(); return 0; } return 1; } int win_audio::input_close_device(){ err = waveInClose(input_device); if(err != MMSYSERR_NOERROR ){ waveInGetErrorText(err, err_buffer, err_size); printf("waveInClose err: %d %s\n",err, err_buffer); getchar(); return 0; } return 1; } int win_audio::output_open_device(){ WAVEFORMATEX formato_wave; formato_wave.wFormatTag = WAVE_FORMAT_PCM; formato_wave.nChannels = canali; formato_wave.nSamplesPerSec = campioni_per_secondo; formato_wave.nAvgBytesPerSec = campioni_per_secondo*bit_per_campione*canali/8; formato_wave.nBlockAlign = canali*bit_per_campione/8; formato_wave.wBitsPerSample = bit_per_campione; formato_wave.cbSize = sizeof(WAVEFORMATEX); err = waveOutOpen(&output_device, WAVE_MAPPER, &formato_wave, (DWORD_PTR)waveOutProc, (DWORD_PTR)this, CALLBACK_FUNCTION); if(err != MMSYSERR_NOERROR ){ waveOutGetErrorText(err, err_buffer, err_size); printf("waveOutOpen err: %d %s\n",err, err_buffer); getchar(); return 0; } return 1; } int win_audio::output_set_buffer(char *buffer, long lBuffer){ memset(&wave_out_struct, 0, sizeof(WAVEHDR)); wave_out_struct.lpData = buffer; wave_out_struct.dwBufferLength = lBuffer; err = waveOutPrepareHeader(output_device, &wave_out_struct,sizeof(WAVEHDR)); if(err != MMSYSERR_NOERROR ){ waveOutGetErrorText(err, err_buffer, err_size); printf("waveOutPrepareHeader err: %d %s\n",err, err_buffer); getchar(); return 0; } return 1; } int win_audio::output_play(){ playing_event = 1; err = waveOutWrite(output_device, &wave_out_struct,sizeof(WAVEHDR)); if(err != MMSYSERR_NOERROR ){ waveOutGetErrorText(err, err_buffer, err_size); printf("waveOutWrite err: %d %s\n",err, err_buffer); getchar(); return 0; } //waveOutWrite non è bloccante, quindi aspettiamo while(playing_event == 1){ Sleep(5); } return 1; } int win_audio::output_close_device(){ err = waveOutClose(output_device); if(err != MMSYSERR_NOERROR ){ waveOutGetErrorText(err, err_buffer, err_size); printf("waveOutClose err: %d %s\n",err, err_buffer); getchar(); return 0; } return 1; } char * win_audio::get_audio_buffer(){ return audio_buffer; } long win_audio::get_audio_buffer_size(){ return audio_buffer_size; } void CALLBACK waveOutProc(HWAVEOUT hwo, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2){ win_audio *classe; classe = (win_audio *) dwInstance; if(uMsg == WOM_OPEN) printf("waveOutProc: WOM_OPEN\n"); else if(uMsg == WOM_DONE){ //avvisiamo che la registrazione è terminata classe->playing_event = 0; printf("waveOutProc: WOM_DONE\n"); } else if(uMsg == WOM_CLOSE) printf("waveOutProc: WOM_CLOSE\n"); else printf("waveOutProc: messaggio non riconosciuto...\n"); } void CALLBACK waveInProc(HWAVEIN hwi, UINT uMsg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2){ win_audio *classe; classe = (win_audio *) dwInstance; if(uMsg == WIM_OPEN) printf("waveInProc: WIM_OPEN\n"); else if(uMsg == WIM_DATA){ //avvisiamo che la registrazione è terminata classe->recording_event = 0; printf("waveInProc: WIM_DATA\n"); } else if(uMsg == WIM_CLOSE) printf("waveInProc: WIM_CLOSE\n"); else printf("waveInProc: messaggio non riconosciuto...\n"); }