![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Щелчки в звуке [D7, WinXP]
Vovan # 2 © (2007-02-14 22:08:00)Привет всем.
Продолжаю изучать Waveform Audio. Поставил себе цель написать удобный (для себя) в использовании класс-обёртку. Столкнулся с такой проблемой, что возникают щелчки непонятного происхождения. Да, читал, что буфер надо переключать быстро, что есть какой-то минимальный размер. Но у меня какие-то странные щелчки :). Они есть и в самом начале, и в конце проигрывания, т.е. достаточно проиграть только один loop, чтобы услышать два щелчка.
Прилагаю код. Он проигрывает тишину и как раз слышны щелчки. Откуда они берутся и как от них избавиться?
С EXE:
http://files-upload.com/files/103694/WavePlay.rar.html (430 Kb)
http://www.speedyshare.com/224985863.html (430 Kb)
Без EXE:
http://files-upload.com/files/103697/WavePlaywithoutEXE.rar.html
http://www.speedyshare.com/586405141.html
TRUNK (2007-02-15 14:10:00) [1]Пересмотрел ещё раз. Действительно буфер обнуляется полностью, просто я поначалу упорно верил, что p^[j] имеет размер в один байт (видимо сказывается хроническое недосыпание :). А насчёт TSmallIntArray, если проверка индекса в p^[j] не вызывает ошибок, тогда его можно объявить как массив всего с одним элементом. А можно было бы вообще объявить сам буфер как динамический массив и не возиться с GlobalAlloc/GlobalFree и двойным набором указателей. Я вообще объявляю буферы фиксированного размера - нет смысла менять их размер во время работы программы. А обнулять память быстрее и проще, используя FillChar или ZeroMemory.
А насчёт щелчков я разобрался. В FormCreate в буферы записываются ненулевые значения (Ampl=20000). Поэтому и происходит скачок уровня в начале (0 -> 20000) и в конце (20000 -> 0).
P.S. Пример выслал.
Vovan # 2 (2007-02-15 12:16:00) [2]Чего-то не могу найти несовпадения. Я задаю длину буфера в блоках, при этом один блок - 2 байта (моно на 16 бит). При обнулении использую длину, а не фактический размер - так просто удобнее. TSmallIntArray должен иметь размер 32768*2 байт? Почему щелчки раздаются и в самом начале, как только я отправляю буфер?
Пример высылай на vovan_no_two(СОБАКА!)mail.ru
TRUNK (2007-02-15 11:04:00) [3]Посмотрел. Путаница с размерами буферов. Буфер имеет размер 176400, а обнуляются только первые 88200 байт, при том, что TSmallIntArray имеет размер всего 32768 байт. Да и вообще, есть несколько лишних переменных (часть из которых, кстати, и создала путаницу), многие участки кода можно упростить. При необходимости могу выслать свой пример воспроизведения WAV-файлов.