Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.01.2013, 17:38   #1
qwertyk
Пользователь
 
Регистрация: 15.07.2009
Сообщений: 52
По умолчанию Работа со звуком

Код:
void __stdcall MyAudioStreamCallback(UINT32 Channel,CONST FLOAT *Buffer,CONST FLOAT *BufferFiltered,UINT32 NumberOfSamples,DWORD_PTR UserData)
{
 CONST FLOAT *Input;
 WAVEHDR *WaveHdr;
 SHORT *Output;

    //alocate memory for waveout audio buffer and WAVEHDR structure
    WaveHdr=(WAVEHDR*)VirtualAlloc(NULL,sizeof(WAVEHDR)+NumberOfSamples*sizeof(SHORT),MEM_COMMIT,PAGE_READWRITE);

    ZeroMemory(WaveHdr,sizeof(WAVEHDR));

    WaveHdr->lpData=(LPSTR)(WaveHdr+1); //audio buffer starts after WAVEHDR structure
    WaveHdr->dwBufferLength=NumberOfSamples*sizeof(SHORT);

    //retype Buffer to INT32, because bits per sample of DDC type 1 (specified by SetDDCType) is 32 - signed
    Input=(CONST FLOAT*)Buffer;

    //retype audio buffer ptr to signed 16bit
    Output=(SHORT*)WaveHdr->lpData;

    //convert samples from 32bit IEEE float to 16bit integer
    while(NumberOfSamples--)
    {
        *Output++=(SHORT)((*Input++)*32767.0);
    }

    waveOutPrepareHeader(hWaveOut,WaveHdr,sizeof(WAVEHDR));

    //increase number of buffers sent to waveout
    BufferCount++;

    if(waveOutWrite(hWaveOut,WaveHdr,sizeof(WAVEHDR))!=MMSYSERR_NOERROR)
    {
        //decrease number of buffers sent to waveout because an error
        BufferCount--;
        VirtualFree(WaveHdr,0,MEM_RELEASE);
    }
}
Зачем здесь используются CONST FLOAT *Input и SHORT *Output. Если их закомментировать то звука не будет.
qwertyk вне форума Ответить с цитированием
Старый 01.02.2013, 09:59   #2
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

Input устанавливается на входной буфер 32-битных сэмплов, а Output - выходной буфер 16-битных. Цикл while - перевод из 32-х в 16-битные. Можно было оперировать с буферами, как с массивами, например
Код:
for( int i = 0; i < NumberOfSamples; i++ )
{
  WaveHdr->lpData[ i ] = ( SHORT )( Buffer[ i ] * 32767.0 );
}
но в данном случае сделали дополнительные указатели. А так - одно и то же...
FataLL вне форума Ответить с цитированием
Старый 01.02.2013, 12:55   #3
qwertyk
Пользователь
 
Регистрация: 15.07.2009
Сообщений: 52
По умолчанию

Спасибо, немного разобрался. А переход к 16-и битному выходному буферу осуществляется умножением на 32767.0, т.к. Buffer типа float и его значения лежат от -1.0 до 1.0, то мы умножаем его значения на ((2^16)/2)-1 (т.к. у нас могут быть как положительные так и отрицательные значения + ноль), верно?

Последний раз редактировалось qwertyk; 01.02.2013 в 13:13.
qwertyk вне форума Ответить с цитированием
Старый 01.02.2013, 15:36   #4
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

Цитата:
Сообщение от qwertyk Посмотреть сообщение
верно?
Ну... Видимо, так
FataLL вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа со звуком ддимочка C++ Builder 0 09.12.2011 21:31
Работа со звуком.. MixNez Мультимедиа в Delphi 1 15.05.2011 09:12
С# работа со звуком Oldcentre Помощь студентам 9 13.03.2011 12:46
Работа со звуком boo_mago Общие вопросы C/C++ 2 19.09.2010 11:06
Работа со звуком Mirik Мультимедиа в Delphi 1 05.06.2009 09:33