Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа со звуком на низком уровне 
:(
    Опции темы
GavriKos
Дата 2.10.2008, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 8.8.2007
Где: Донецк, Украина

Репутация: нет
Всего: 1



Доброго времени суток! Понадобилось работать со звуком. Пока что работа заключается в том, что надо записать звук с микрофона и воспроизвезти его. Покопал инет, нашел несколько примеров. К сожалению, многие оказались так или иначе не рабочие. Перебрав их собрал следующий код:

Код

void CtestDlg::OnBnClickedButton1()
{
    //auxSetVolume(WAVE_MAPPER,100);
    hWnd = CreateEvent(0, FALSE, FALSE, 0);
    WaveFormat.wFormatTag = WAVE_FORMAT_PCM;
    WaveFormat.nChannels = 1;
    WaveFormat.nSamplesPerSec = 16000L;
    WaveFormat.nBlockAlign = 2;
    WaveFormat.nAvgBytesPerSec = WaveFormat.nSamplesPerSec*WaveFormat.nBlockAlign;
    WaveFormat.wBitsPerSample = 16;
    WaveFormat.cbSize = 0;

    

    MMRESULT mmRes =waveInOpen(&hWaveIn, WAVE_MAPPER, &WaveFormat,0 , 0, CALLBACK_NULL);
    
    ULONG BufferSize = WaveFormat.nBlockAlign*WaveFormat.nSamplesPerSec*100;
    WaveHdr.lpData = (LPSTR)malloc(BufferSize);
    WaveHdr.dwBufferLength = BufferSize;
    
    waveInPrepareHeader(hWaveIn, &WaveHdr, sizeof(WAVEHDR));

    waveInAddBuffer(hWaveIn, &WaveHdr, sizeof(WAVEHDR));
    waveInStart(hWaveIn);
    waveInClose(hWaveIn);
    LPSTR buf="";
    waveInGetErrorText(mmRes,buf,100);

    
    
}

void CtestDlg::OnBnClickedButton2()
{
    waveInStop(hWaveIn);
    MMRESULT mmRes = waveOutOpen(&hWaveOut, WAVE_MAPPER, &WaveFormat, 0, 0, CALLBACK_NULL);    
    waveOutPrepareHeader(hWaveOut, &WaveHdr, sizeof(WAVEHDR));
    waveOutWrite(hWaveOut, &WaveHdr, sizeof(WAVEHDR));
    waveOutClose(hWaveOut);
    LPSTR buf="";
    waveInGetErrorText(mmRes,buf,100);
}


Код использует один буффер и по описанию на каком-т сайте прочитанному должен рабоать (т.е. необязательно подкидывать болше одного буфера). По идее логика такая - нажимаем первую кнопку - идет запись. Нажимаем вторую - запись останавливается и все записанное тут же воспроизводится. Но УВЫ оно так не работает. Подскажите пожалуйста, в чем может быть косяк. Еще интересуют следующие вопросы:
1) С какого устройства/входа будет писать прога при использовнаии WAVE_MAPPER? 
2) Как сделать так чтоб писалось четко с микрофона?
3) Можно ли обходится одним буфером?

И еще может кто знает где в электронке можно найте Гордеева "Програмирование звука в Windows"? Или может поделится может кто?
--------------------
Донецкая группа IT - присоединяемся
PM MAIL ICQ   Вверх
xvr
Дата 2.10.2008, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Для waveOutPrepareHeader и waveInPrepareHeader читаем

Цитата

The lpData, dwBufferLength, and dwFlags members of the WAVEHDR structure must be set before calling this function (dwFlags must be zero).


Далее, про комбинацию
Код

    waveInAddBuffer(hWaveIn, &WaveHdr, sizeof(WAVEHDR));
    waveInStart(hWaveIn);
    waveInClose(hWaveIn);
читаем:
Цитата

If there are input buffers that have been sent with the waveInAddBuffer function and that haven't been returned to the application, the close operation will fail. Call the waveInReset function to mark all pending buffers as done.
Аналогично для
Код

    waveOutWrite(hWaveOut, &WaveHdr, sizeof(WAVEHDR));
    waveOutClose(hWaveOut);
читаем
Цитата

If the device is still playing a waveform-audio file, the close operation fails. Use the waveOutReset function to terminate playback before calling waveOutClose.


Что касается WAVE_MAPPER и записи с микрофона, то это управляется миксером (см. функции mixer*), там все сложнее  smile 

PM MAIL   Вверх
GavriKos
Дата 2.10.2008, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 8.8.2007
Где: Донецк, Украина

Репутация: нет
Всего: 1



спасибо будем разбираться. А в принципе с одним буфером все будет работать?

Цитата

Что касается WAVE_MAPPER и записи с микрофона, то это управляется миксером (см. функции mixer*), там все сложнее  


А откуда он тогда будет писать? Откуда указано в настройках микшера системы?
--------------------
Донецкая группа IT - присоединяемся
PM MAIL ICQ   Вверх
Alexeis
Дата 2.10.2008, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 7
Всего: 459



GavriKos, 2 буфера нужно для того чтобы запись происходила непрерывно. Т.е. буфер закончился, подставили ему второй, а в это время 1й можно обрабатывать по своему вкусу, а после обработки заново ставить в очередь, но до того как заполниться 2й иначе будет пауза.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
GavriKos
Дата 2.10.2008, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 8.8.2007
Где: Донецк, Украина

Репутация: нет
Всего: 1



Спасибо, исрпвил на ресеты - заработало!
--------------------
Донецкая группа IT - присоединяемся
PM MAIL ICQ   Вверх
xvr
Дата 2.10.2008, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(GavriKos @ 2.10.2008,  16:45)
спасибо будем разбираться. А в принципе с одним буфером все будет работать?

Цитата

Что касается WAVE_MAPPER и записи с микрофона, то это управляется миксером (см. функции mixer*), там все сложнее  


А откуда он тогда будет писать? Откуда указано в настройках микшера системы?

Да. Вот немного сорцов по управлению миксером (и вводу звука)


Присоединённый файл ( Кол-во скачиваний: 33 )
Присоединённый файл  mixer.zip 3,18 Kb
PM MAIL   Вверх
GavriKos
Дата 2.10.2008, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 8.8.2007
Где: Донецк, Украина

Репутация: нет
Всего: 1



Благодарю за сырцы
--------------------
Донецкая группа IT - присоединяемся
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0641 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.