На главную Наши проекты:
Журнал   ·   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]  все  ( Перейти к последнему сообщению )  
> Создание прямоугольных импульсов разной длительности , На звуковом разьеме под WM
    Спасибо!
    ExpandedWrap disabled
       waveOutWrite(hWaveOut, &whdr1, sizeof(whdr1));
      //сюда добавить WaveOutWrite(hWaveOut, &whdr2, sizeof(whdr2));

    Это сильно помогло! :)
    Цитата
    Очередь буферов устроена по принципу FIFO.
    ....
    WaveOutWrite не "начинает играть такой-то буфер", а ставит буфер в конец очереди

    А это очень интересно.
      Цитата
      Точные "координаты" буфера в lparam обрабатываемого месседжа MM_WOM_DONE.

      А доставать lparam как-то заморочисто надо? Что то у меня не получается.
        static INT_PTR CALLBACK MainDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
        Как оно там в си может выглядеть, я не в курсе.
        А вообще, вытягиваение координат из lparam и доступ к элементам буфера(семплам) выглядит(может выглядеть) так:
        ExpandedWrap disabled
          var pb:pbyte:// указатель на байт, который будем использовать для доступа к содержимому буфера;
          //устанавливаем указатель на начало буфера(допустим, буфер 8 битный, один канал):
          pb:=pbyte(pwavehdr(lparam).lpdata); // приведение типов, сначала lparam к wavehdr, затем lpdata к pbyte;
          // дальше чё-то делаем с ним:
          for i:=0 to pwavehdr(lparam).dwBufferLength-1 do
          Begin
          pb:=128;// заполняем текущий семпл "тишиной"
          inc(pb)// переходим к следующему семплу
          end;
          "Семен Семеныч"(с) . Это я тормозил, надо заправлять тот же буфер который только что отыграл...
          ExpandedWrap disabled
               case MM_WOM_DONE:
                    waveOutWrite(hWaveOut,(PWAVEHDR) lParam, sizeof(WAVEHDR));
            И предварительно заправлять несколько буферов в очередь. И позаботиться о том, чтобы после отыгрывания буфера, он был возвращен в очередь до того, как отыграет следующий за ним. Этот пункт накладывает ограничения на минимальный размер буфера.
            Цитата
            я нашел здесь ,неподалеку , программку на ВБ . Она прекрасно играет без разрывов. У нее два буфера по 44100(1 сек) . Я помучил ее , она не трещит, если уменьшать до 1800 байт. Кстати, это ~40мС

            Постепенно уменьшая размер буфера, всё больше и больше нагружаем проц и систему, сообщения MM_WOM_DONE сыпятся всё чаще и чаще. Уменьшаем, уменьшаем дальше, и опа, в какой-то момент, приложение не успевает обработать очередной MM_WOM_DONE, и добавить новый буфер в очередь до окончания воспроизведения текущего. Звук рвётся. Этот момент(и минимальный размер буфера, при котором разрывов не будет) зависит от кванта времени, выделяемого приложению виндой, производительности системы и загруженности её работающими параллельно другими процессами.
            Почему я говорил про 100 мс. С буфером такой длительности приложение в штатной ситуации никогда не порвёт звук и не сильно нагружает систему. На "больших" компах.
              Снова реанимировался вопрос про то , как узнать какой буфер только что отыграл.
              Цитата
              Параметр lParam содержит адрес структуры WAVEHDR, соответствующей проигранному блоку.
              Это из интернета.
              Действительно содержит, только есть небольшое отличие с тем что я отправляю.
              Вскрытие показало, что у обоих младшие 64р-да совпадают, но у lParam старшие 64 равны 0, а у адреса отправленной структуры в младшем -1. Можно ее , конечно, придушить, но...
                В винмобайл? Вот прям 64 бита? Да ещё и старшие/младшие?
                Цитата
                младшие 64р-да совпадают, но у lParam старшие 64 равны 0, а у адреса отправленной структуры в младшем -1.

                Ничего непонятно.
                  Цитата Prince @
                  В винмобайл?

                  Нет. 8.1 (64)
                    Цитата
                    младшие 64р-да совпадают, но у lParam старшие 64 равны 0, а у адреса отправленной структуры в младшем -1.

                    Осталось эту странную лексическую конструкцию осилить.
                      Не надо ее осиливать, это какие-то проблемы с 64.
                      А у меня проблема я не знаю как сравнить :
                      lParam с &whdr(структура WAVEHDR)
                      Ругается, что я сравниваю не то не с тем. :)
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0355 ]   [ 16 queries used ]   [ Generated: 28.03.24, 12:43 GMT ]