Joined: Wed Mar 08, 2006 6:25 pm Posts: 3952
|
Так нагляднее. Code: typedef unsigned int SNDBUF;
int _stdcall InitSound(int *version);
int _stdcall CreateBuffer(unsigned int format,int size,SNDBUF *buf); int _stdcall DestroyBuffer(SNDBUF hBuff);
int _stdcall SetFormat(SNDBUF hBuff, unsigned int format); int _stdcall GetFormat(SNDBUF hBuff, unsigned int *format);
int _stdcall ResetBuffer(SNDBUF hBuff, unsigned int flags); int _stdcall SetBufferPos(SNDBUF hBuff, int offset); int _stdcall GetBufferPos(SNDBUF hBuff, int *offset); int _stdcall GetBufferSize(SNDBUF hBuff, int *size); int _stdcall GetBufferFree(SNDBUF hBuff, int *free);
int _stdcall SetBuffer(SNDBUF hBuff,void* buff, int offs, int size); int _stdcall WaveOut(SNDBUF hBuff,void *buff, int size); int _stdcall PlayBuffer(SNDBUF hBuff,unsigned int flags); int _stdcall StopBuffer(SNDBUF hBuff);
int _stdcall SetVolume(SNDBUF hBuff, int left, int right); int _stdcall GetVolume(SNDBUF hBuff, int *left, int *right); int _stdcall SetPan(SNDBUF hBuff, int pan); int _stdcall GetPan(SNDBUF hBuff, int *pan);
int _stdcall GetMasterVol(int* vol); int _stdcall SetMasterVol(int vol);
int _stdcall SetTimeBase(SNDBUF hBuff, double base); int _stdcall GetTimeStamp(SNDBUF hBuff, double *stamp);
Инициализируем звук Code: #include <sound.h>
int err; int version =-1;
if((err = InitSound(&version)) !=0 ){ goto epic_fail; };
if( (SOUND_VERSION>(version&0xFFFF)) || (SOUND_VERSION<(version >> 16))){ goto epic_fail; }
Создаём звуковой буфер. Есть три вида буферов - статические (PCM_STATIC), потоковые (PCM_OUT) и кольцевые (PCM_RING). Самый простой для программирования - потоковый. Статический буфер не сильно отличается от буфера в DirectSound. SetBuffer заполняет буфер, GetBufferPos и SetBufferPos получают и устанавливают текущую позицию в буфере. Кольцевой буфер позволяет выводить звук с минимальной задержкой. Это аналог Direct Sound буфера с событиями, поделённого на две части. snd_format одна из констант вида PCM_X_Y_Z где X- число каналов Y- разрядность в битах на канал Z- частота в КГц из фиксированного набора 11025Гц, 12000Гц, 16000Гц, 22050Гц, 24000Гц, 32000Гц, 44100Гц, 48000Гц Если формат не известен заранее используется константа PCM_ALL. Окончательно формат устанавливается вызовом SetFormat. Code: SNDBUF hBuff; void* buffer; //семплы в формате snd_format int buffer_size; // размер буфера в байтах
if((err = CreateBuffer(snd_format|PCM_OUT, 0, &hBuff)) != 0) { goto epic_fail; }; выводим звук WaveOut(hBuff,buffer,buffer_size);
Для статического буфера размером 1Mб if((err = CreateBuffer(snd_format|PCM_STATIC, 1024*1024, &hBuff)) != 0) { goto epic_fail; };
заполняем буфер int offset; // смещение от начала звукового буфера SetBuffer(hBuff, buffer, offset, buffer_size);
выводим звук асинхронно - функция возвращает управление немедленно if((err = PlayBuffer(hBuff, 0)) !=0 ){ goto exit_whith_error; }; синхронно - поток блокируется пока весь буфер не будет воспроизведён if((err = PlayBuffer(hBuff, PLAY_SYNC)) !=0 ){ goto exit_whith_error; };
Изменение параметров воспроизведения SetFormat(hBuff, snd_format); Устанавливает новый формат звукового буфера. Применимо для PCM_OUT и PCM_STATIC буферов. SetVolume(hBuff, left, right); Устанавливает уровень громкости для правого и левого каналов. Уровень задаётся как ослабление сигнала в сотых долях децибела в диапазоне 0 - -10000, где 0 - максимальная громкость -10000 (-100dB) - полная тишина SetPan(hBuff, pan); Устанавливает баланс левого и правого каналов. Баланс задаётся в сотых долях децибела в диапазоне -10000 - 10000, где -10000 - тишина в правом канале 10000 - тишина в левом канале 0 - нормальный баланс каналов
Last edited by Serge on Sun Apr 22, 2012 10:48 pm, edited 6 times in total.
|
|