Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.139.90.131] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Уважаемые форумчане. Есть задача: вывести звук с микрофона на колонки. Реализую с помощью стандартных апи.
Столкнулся с такой проблемой: при одновременной работе waveIn и WaveOut работает только прием сообщений от либо от waveIn, либо от WaveOut (в зависимости от того, кого первого инициировали). По отдельности (если инициировать либо только снятие с микрофона либо только воспроизведение) все сообщения (MM_WIM_DATA или MM_WOM_DONE соответственно) проходят нормально. Что за странные дела? Спасибо за помощь. Исходник привожу. Прикреплённый файлwaveInOut.rar (2 Кбайт, скачиваний: 372) |
Сообщ.
#2
,
|
|
|
Мозг, у тебя карта не full-duplex? Хотя таких вроде давно не выпускают.
|
Сообщ.
#3
,
|
|
|
Ага,таких не выпускают уже лет 10 наверное.
У меня нэтбук Asus. Добавлено Цитата MIF @ Мозг... Это в хорошем смысле или нет? |
Сообщ.
#4
,
|
|
|
Виктор
Отладил твой код. waveOutWrite возвращается с WAVERR_STILLPLAYING. Если верить сообщению то что-то уже воспроизводится. Можно предположить что при записи звук уже воспроизводится через колонки. И ручками ничго делать не надо. А да ну при этом звук с микрофона может фильтроваться драйвром звуковой(там настройка есть). |
Сообщ.
#5
,
|
|
|
Цитата Виктор @ (в зависимости от того, кого первого инициировали). А когда второго инициируешь - все нормально? В плане возврата функцией открытия устройства результата (который ты не проверяешь, а проверку закоментировал и удалил за "ненадобностью"). Добавлено О...уже разобрались... |
Сообщ.
#6
,
|
|
|
А да еще как вариант попробовать выводить звук через микшер.
|
Сообщ.
#7
,
|
|
|
Цитата Виктор @ Это в хорошем смысле или нет? Канешна, в харошем! |
Сообщ.
#8
,
|
|
|
В аттаче пример организации сквозного канала. Но. Вешать обработку аудио на оконную процедуру нехорошо. Лучше и правильнее в отдельном потоке. Чтобы события от мышки, клавы, отрисовка компонентов формы, не "затыкали" аудио. И наоборот, аудио не тормозило обработку событий формы.
В примере показан учет количества активных буферов. Можно обойтись и без него. Processmessages перед закрытием устройств успешно обрабатывает все сообщения wim_data wom_done, так что перед waveinclose/waveoutclose сообщения уже обработаны(память под заголовки и буферы совобождена). Но так, имхо, легче проследить механизм перекидывания буферов друг другу, обработчиками событий wim_data и wom_done. Прикреплённый файл______________.zip (14,33 Кбайт, скачиваний: 450) |
Сообщ.
#9
,
|
|
|
Хороший пример, спасибо
|
Сообщ.
#10
,
|
|
|
Prince
Если судить по примеру то там записывается половина потом воспроизводится. Что не плохо. Только надо переделать чтобы буферы чередовались. А как насчёт потери данных пока буферы воспроизводятся? |
Сообщ.
#11
,
|
|
|
Цитата Только надо переделать чтобы буферы чередовались. В каком смысле чередовались? Буфер, вернувшийся из очереди записи, ставится в очередь воспроизведения. Буфер, вернувшийся из очереди воспроизведения, ставится в очередь записи. Такой себе дружественный обмен. Буферов может быть хоть до сотни. И в очереди всегда находится примерно половина. Цитата А как насчёт потери данных пока буферы воспроизводятся? Данные не теряются, разрыва в данных нет, а на слух, разрывы в воспроизводимом звуке могут быть, например, во время сворачивания формы, поскольку события аудио в оконной процедуре обрабатываются. Разрывы есть, во время манипуляций с формой, перемещения, сворачивания. Механизм "затыкания" звука", как там и чего происходит, я не могу объяснить. Понимаю, что связано с обработкой сообщений аудио в общей очереди сообщений, если перенести обработчик аудио в отдельный поток с уведомлением callback_event, разрывов быть не должно. Может, я что-то не учел, замечания, указания на ошибки, или ошибочность решения в целом, с благодарностью принимаю. |
Сообщ.
#12
,
|
|
|
Prince
Да проверил потери нет. А вот возьмем 100 буферов и сразу будет заметна задержка в воспроизведение. Её бы уменьшить. При 16 тоже заметно, а уменьшать не хотелось бы. По хорошему надо запас буферов на 4 секунды. |
Сообщ.
#13
,
|
|
|
Мининальнео количество буферов, при котором нет разрывов(на слух), у меня получилось 6. Размер буфера можно попробовать уменьшить вдвое.
Цитата По хорошему надо запас буферов на 4 секунды. А для чего? Кстати, объясните кто-нибудь практическое применение сквозного канала вообще. |
Сообщ.
#14
,
|
|
|
Prince
На 1024 у меня уже система не справляется приходит одно сообщение на 2 буфера. Приходилось усложнять обработку. Уменьшать число буферов не хочу что бы не заикалось. Так как в виндоусе вытесняющая многозадачность, то главный поток забирает все и чисто теоретически наша программа если не главная может получать сообщение раз в 4 секунды. Поэтому и хочу запас. Цитата Prince @ Кстати, объясните кто-нибудь практическое применение сквозного канала вообще. Как известно если A+(-A) будет 0. То есть если подать на выход, то что поступило на вход но с обратным знаком, то получим тишину. Известный факт. Хочу попробовать фокус сделать человек говорит программа выделяет признаки конкретного человека и выдает его звук, но в обратном порядке. Разумеется нужна некоторое предсказание. А другие люди должны говорить свободно. Типо лишаем голоса одного человека. Правда уверен что не получится. |
Сообщ.
#15
,
|
|
|
Цитата Pavia @ Уменьшать число буферов не хочу что бы не заикалось. Так как в виндоусе вытесняющая многозадачность, то главный поток забирает все и чисто теоретически наша программа если не главная может получать сообщение раз в 4 секунды. Поэтому и хочу запас. Вообще-то стандартное решение - повысить приоритет звукового потока. |