Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.20.205.228] |
|
Страницы: (2) 1 [2] все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Спасибо!
waveOutWrite(hWaveOut, &whdr1, sizeof(whdr1)); //сюда добавить WaveOutWrite(hWaveOut, &whdr2, sizeof(whdr2)); Это сильно помогло! Цитата Очередь буферов устроена по принципу FIFO. .... WaveOutWrite не "начинает играть такой-то буфер", а ставит буфер в конец очереди А это очень интересно. |
Сообщ.
#17
,
|
|
|
Цитата Точные "координаты" буфера в lparam обрабатываемого месседжа MM_WOM_DONE. А доставать lparam как-то заморочисто надо? Что то у меня не получается. |
Сообщ.
#18
,
|
|
|
static INT_PTR CALLBACK MainDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Как оно там в си может выглядеть, я не в курсе. А вообще, вытягиваение координат из lparam и доступ к элементам буфера(семплам) выглядит(может выглядеть) так: 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; |
Сообщ.
#19
,
|
|
|
"Семен Семеныч"(с) . Это я тормозил, надо заправлять тот же буфер который только что отыграл...
case MM_WOM_DONE: waveOutWrite(hWaveOut,(PWAVEHDR) lParam, sizeof(WAVEHDR)); |
Сообщ.
#20
,
|
|
|
И предварительно заправлять несколько буферов в очередь. И позаботиться о том, чтобы после отыгрывания буфера, он был возвращен в очередь до того, как отыграет следующий за ним. Этот пункт накладывает ограничения на минимальный размер буфера.
Цитата я нашел здесь ,неподалеку , программку на ВБ . Она прекрасно играет без разрывов. У нее два буфера по 44100(1 сек) . Я помучил ее , она не трещит, если уменьшать до 1800 байт. Кстати, это ~40мС Постепенно уменьшая размер буфера, всё больше и больше нагружаем проц и систему, сообщения MM_WOM_DONE сыпятся всё чаще и чаще. Уменьшаем, уменьшаем дальше, и опа, в какой-то момент, приложение не успевает обработать очередной MM_WOM_DONE, и добавить новый буфер в очередь до окончания воспроизведения текущего. Звук рвётся. Этот момент(и минимальный размер буфера, при котором разрывов не будет) зависит от кванта времени, выделяемого приложению виндой, производительности системы и загруженности её работающими параллельно другими процессами. Почему я говорил про 100 мс. С буфером такой длительности приложение в штатной ситуации никогда не порвёт звук и не сильно нагружает систему. На "больших" компах. |
Сообщ.
#21
,
|
|
|
Снова реанимировался вопрос про то , как узнать какой буфер только что отыграл.
Цитата Это из интернета.Параметр lParam содержит адрес структуры WAVEHDR, соответствующей проигранному блоку. Действительно содержит, только есть небольшое отличие с тем что я отправляю. Вскрытие показало, что у обоих младшие 64р-да совпадают, но у lParam старшие 64 равны 0, а у адреса отправленной структуры в младшем -1. Можно ее , конечно, придушить, но... |
Сообщ.
#22
,
|
|
|
В винмобайл? Вот прям 64 бита? Да ещё и старшие/младшие?
Цитата младшие 64р-да совпадают, но у lParam старшие 64 равны 0, а у адреса отправленной структуры в младшем -1. Ничего непонятно. |
Сообщ.
#23
,
|
|
|
Цитата Prince @ В винмобайл? Нет. 8.1 (64) |
Сообщ.
#24
,
|
|
|
Цитата младшие 64р-да совпадают, но у lParam старшие 64 равны 0, а у адреса отправленной структуры в младшем -1. Осталось эту странную лексическую конструкцию осилить. |
Сообщ.
#25
,
|
|
|
Не надо ее осиливать, это какие-то проблемы с 64.
А у меня проблема я не знаю как сравнить : lParam с &whdr(структура WAVEHDR) Ругается, что я сравниваю не то не с тем. |