На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела "Программирование звука"
0) Данный раздел предназначен для обсуждения проблем, возникающих при программировании задач, связанных с записью, обработкой, воспроизведением звука. Перед созданием темы подумайте, не будет ли она уместнее в разделах Разработка и тестирование программ, Наши исходники, а особенно Разовые заказы и подработки
1) На Раздел распространяются все Правила форума.Огромная просьба с ними внимательно ознакомиться.
2) Запрещается давать бессмысленные ответы вроде: "Снеси Мастдай", "ХП рулит", "Поставь Линукс" и т.д.
3) Запрещается создавать темы, в которых Вы намереваетесь получить ссылку на кряки, серийники и т.п. Также запрещено любое обсуждение p2p (peer-to-peer) сетей (BitTorrent, eDonkey и т.д.).
4) Реклама всякого рода пресекается беспощадно.
5) Используйте тэг [CODE] для выделения кода программы (непременно с указанием языка программирования - выбрать из списка. В противном случае бессмысленно!). Уважайте тех, кто будет читать ваш код!
6) Если решение вашей проблемы найдено, то не забываем помечать тему специальной функцией "Вопрос решён". Вам всего лишь требуется при написании последнего ответа поставить одну единственную галочку прямо над формой ответа.
7) Если вы хотите получить совет для конкретной платформы/языка программирования, обязательно укажите их в вопросе

8) Если не прикрепляются/не скачиваются файлы, читаем Не прикрепляется / не скачивается файл. Любые обсуждения в данном разделе проблем с приложением файлов считаются оффтопиком! Со всеми вытекающими.

9) NEW! Уважаемые новички! Мы приветствуем Ваше желание научить всех посетителей раздела правильному программированию. Но огромная просьба, перед тем, как писать поучения в старых (последний ответ - "старее" месяца, а особенно, если вопрошавший не появляется на форуме уже не первый месяц, в чем можно убедиться в его профиле) темах, хорошо подумать, будет ли кому-нибудь, кроме Вас cамих, это интересно. Попытки накрутки количества тематических сообщений за счёт поднятия древних неактуальных тем ("некрофилия") будут наказываться по велению левой пятки модераторского состава (см. пп.12, 13 Правил)



Нарушение Правил может повлечь наказание со стороны модераторов.



user posted imageFAQ Раздела user posted imageПоиск в Разделе user posted imageMSDN Library Online | Ваше мнение о модераторах: user posted imageBarazuk user posted imageRikkie
  
> waveInReset вешает прогу, а waveInStop работает нормально
    Столкнулся с такой проблемой: при необходимости остановки записи вызов waveInReset вешает прогу (через раз), а waveInStop работает нормально.
    Хотя, в другой проге всё ок.
    Почему такое может быть?
    p.s. Понимаю, что по-хорошему нужно бы код выложить, но пока не могу...

    Добавлено
    Разобрался.
    Блин, магия какая-то. Возишься-возишься, понять не можешь в чём проблема.
    Как только создашь тему на форуме, сразу находишь ошибку сам :)

    Короче, в waveInProc было добавление буфера (причём, при uMsg = WIM_DATA).
    Т.о. waveInReset вызывал waveInProc с uMsg = WIM_DATA для каждого буфера. Процедура добавляла новый буфер и процесс зацикливался...

    Добавлено
    А, нет. вру. Не зацикливается. Просто зависает при попытке добавить буфер.
      waveinproc и waveinaddbuffer вызывается в отдельном потоке, если используется сallback function. ресет этот поток убивает. При таком раскладе, да, возникают сюрпризы. Где-то тут этот ньюанс обсуждался уже.

      Отказался от функции ресет вообще в свое время. Только стоп.
      Сообщение отредактировано: Prince -
        Как же waveInReset может убить поток, который потом вызывает (это я про waveInProc)?
        Если не добавлять буферы, то всё ок.

        Добавлено
        Где обсуждалось – это я вчера перечитывал, я же и создавал тему (почти 4 года назад): waveInStop, waveInUnprepareHeader :)
          Может после обработки сообщений, но убивает поток, в котором эта самая очередь сообщений обрабатывается.
          Такая же ернуда как c waveinaddbuffer будет, если waveoutwrite в callback использовать или да, waveInUnprepareHeader. Майкрософт сам же и говорит, что из callback нельзя вызывать никаких функций, кроме...
          Поэтому от waveinreset отказался. Меньше мороки. waveinstop не уничтожает объекты, а потому алгоритм дальнейших действий получается просчитываемым и предсказуемым.
            Цитата Prince @
            Может после обработки сообщений, но убивает поток, в котором эта самая очередь сообщений обрабатывается.
            Тогда добавление буфера из callback-процедуры не должно вешать софт :)

            Цитата Prince @
            Майкрософт сам же и говорит, что из callback нельзя вызывать никаких функций, кроме...
            Кроме...? По крайней мере, waveInAddBuffer кроме как из callback-функции вызывать неоткуда.

            Цитата Prince @
            waveinstop не уничтожает объекты, а потому алгоритм дальнейших действий получается просчитываемым и предсказуемым.
            :good:

            Добавлено
            Цитата Jin X @
            Кроме...?
            Applications should not call any system-defined functions from inside a callback function, except for EnterCriticalSection, LeaveCriticalSection, midiOutLongMsg, midiOutShortMsg, OutputDebugString, PostMessage, PostThreadMessage, SetEvent, timeGetSystemTime, timeGetTime, timeKillEvent, and timeSetEvent. Calling other wave functions will cause deadlock.

            Откуда же тогда вызывать waveInAddBuffer?
              Цитата
              Откуда же тогда вызывать waveInAddBuffer?

              Задавался тем же вопросом. Ведь вызов из обработчика как бы сам собой напрашивается. Майкрософт хранит эту тайну.

              Цитата
              Цитата
              Может после обработки сообщений, но убивает поток, в котором эта самая очередь сообщений обрабатывается.

              Тогда добавление буфера из callback-процедуры не должно вешать софт

              Помню, что waveinopen создает один дополнительный поток, и он не убивается вплоть до завершения работы приложения. Т.е., он не убивается даже после waveinclose . А после первого вызова waveinaddbuffer создавался еще один поток, в котором и крутился цикл обработки сообщений . waveinreset этот пооток прибивал.

              Интуитивно, при вызове waveinreset уничтожается очередь заголовков буферов, поэтому waveinaddbuffer из обработчика после waveinreset - это как добавить элемент в динамический массив, когда самого массива уже нет. Ну это так, догадка.
              Сообщение отредактировано: Prince -
                Цитата Prince @
                Задавался тем же вопросом. Ведь вызов из обработчика как бы сам собой напрашивается. Майкрософт хранит эту тайну.
                Короче, нужно использовать поточный или оконный колбэк, вот что напрашивается :)
                При этом, если прога не оконная, придётся создавать поток и в нём крутить цикл GetMessage (и создавать окно, если привязываемся к окну).
                Я тут тоже тупанул: создал окно в текущем потоке + новый поток, в котором крутил цикл GetMessage. И думал: чего же это окно не получает сообщения? А ведь GetMessage получает сообщения только для окон, созданных в текущем потоке :facepalm:
                В колбэк-функцией, кстати, есть ещё один неприятный момент. Если используется WAVE_MAPPER, то при смене аудиоустройства по умолчанию прога виснет. У меня, по крайней мере, такая канитель. Это WAVE_MAPPER, про другие не помню, вроде не должно.
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0269 ]   [ 15 queries used ]   [ Generated: 28.03.24, 18:36 GMT ]