На главную Наши проекты:
Журнал   ·   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
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
> Как программа записи звука с микрофона прерывает запись?
    Простая проверка показывает, что если в обработчик wim_open/сlose воткнуть sleep(10000), основной поток зависает на заданные 10 с. В то время как обработчик wim_data основной поток не блокирует. Отладчик показывает выполнение callback, в случае wim_data, в побочном потоке.
    Механизм мне неизвестен. :-?

    Добавлено
    Цитата
    А перечислять все 10 000 функций которые можно вызывать и которые нельзя тоже не целесообразно. Отсюда автор просто упомянул то что считает наиболее важным.

    Логично. Но всё-таки в callback-е возвращается заголовок буфера, и майкрософт мог бы сообщить, что с ним, на их взгляд, можно делать.
    Перечислить waveinaddbuffer и пр. было бы несложно. midiOutLongMsg они же в описание впихнули, хотя необходимость его использования в callback менее очевидна, чем waveinaddbuffer. Мне так кажется.
    Цитата
    Просто это дюже не удобно.

    Как раз очень удобно. Основной поток не блокируется, и есть куча времени на обработку буферов, при вменяемой их длительности.
    Сообщение отредактировано: Prince -
      Цитата Prince @
      Уберите из callback вывод в консоль.

      Закоментируйте waveinreset и waveinstop в main.

      numBufCyr-- в callback при завершении записи перенесите в конец блока.

      Все сделал, не помогло. Видимо, причина в чем-то другом
        У меня тоже не получилось. Проект прикрепил.
        Прикреплённый файлПрикреплённый файлMySound.zip (5,16 Кбайт, скачиваний: 170)
          Если сделать volatile для numBufCyr, то работает и с циклом do. Программа зависает при включении waveInReset, почему - не понятно.
            Все заработало, видимо, был сбой
              Цитата
              Программа зависает при включении waveInReset, почему - не понятно.

              Ещё раз проверил. После waveinreset виснет waveinunprepareheader в сallback.
              Варианты:
              1. не использовать waveinreset, подождать, пока все буферы будут заполнены и уничтожены в callback.
              2. при использовании waveinreset, вынести waveinunprepareheader из callback в основной поток.
              Во втором случае могут быть тоже несколько вариантов. Самый простой, наверное - это хранить массив headers. И после того, как цикл по numBufCyr завершится, выполнить в цикле unpreapre/free/free для всех элементов headers.

              После waveinreset, дополнительный поток, в котором обрабатывается очередь сообщений wim_data - уничтожается. Получается, дедлок наступает...когда waveinreset("кто-то" другой после выполнения waveinreset) собирается уничтожить поток, ожидая, когда очистится очередь сообщений потока (?), в то время как в нём происходит вызов waveinunprepare...в общем, нельзя вызывать waveinunprepareheader внутри callback после waveinreset.
              Сообщение отредактировано: Prince -
                А вы проверяли c volatile numBufCyr?
                  Я проверял код из первого поста, компилил в wxDev-C++. Также повторил в delphi.
                  Работает без нареканий.
                  Уже говорил, waveinreset и waveinstop в таком контексте лишние. Поскольку все буферы ко времени вызова фунций уже уничтожены, функции фактически ничего не делают(полезного). Работает и с waveinreset/stop и без.
                  В общем, программа не виснет. Как исходный вариант, так и допиленый.

                  Если поставить waveinreset перед циклом while(numBufCyr != 0)(там вызов waveinreset имеет смысл: не нужно ожидать, пока будут записаны все буферы в очереди) - см. выше, сообщение #21.

                  Цитата
                  А вы проверяли c volatile numBufCyr?

                  Работает и так и эдак.

                  А, да, winXP.
                  Сообщение отредактировано: Prince -
                    Спасибо за объяснения, очень полезно.
                      Так у вас программа виснет или нет? :unsure:
                      Win7/8/.. ?
                      Сообщение отредактировано: Prince -
                        В Windows 7 и 8 я по сравнению с исходным текстом (в 1 сообщении) сделал volatile для nunBufCyr, больше ничего не менял. Программа не виснет. Посоветовали это решение в теме Почему в релиз-версии программа зависает?
                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0337 ]   [ 17 queries used ]   [ Generated: 19.03.24, 10:24 GMT ]