Вверх ↑
Ответов: 8926
Рейтинг: 823
#1: 2013-09-15 18:53:50 ЛС | профиль | цитата
rolin, АРУ ввёл чтобы определить, правильно-ли BASS определяет четырёхбайтные числа на входе, если работает, значит всё правильно.
Буфер не заполняется при одном условии: частота семплирования у железа меньше частоты семплирования у звуковой карты; если наоборот, то буфер будет постепенно заполняться и когда-то переполнится. Попробуйте выставить у BASS_Init и BASS_StreamCreate не стандартную частоту, скажем 47500 Гц, (даже не знаю, будет-ли работать BASS с не стандартом ), может полУчится что-нибудь путное
rolin писал(а):
звук с плавающим тоном у сигналов
На всех частотах семплирования или только на 48000? На много-ли меняется тон, плавно или скачками?
Смещение легко можно скомпенсировать.
------------ Дoбавленo в 11.22:
Сейчас проверил 47000Гц -- работает! так что проблема решаема!
------------ Дoбавленo в 18.53:
rolin, наверное нашёл ошибку, блин, и чем я думал
На выходе имеем два буфера: Левый и Правый в виде двухмерного массива, при чтении BASS_StreamCreate обращается 96000 раз/сек (при 48000 Гц) отдельно на каждый канал, и надо менять адрес один раз на два обращения, а я менял на каждое и поэтому пропускал половину данных
Надо заменить в IC процедуру doNextSound (на картинке)
next_sound_old.jpg
на вот эту:

procedure THiAsmClass.doNextSempl;
begin
if ChanLR=0 then //Меняем левый/правый канал
begin
ChanLR:=1;
_Buff:=_Buff-1;
K_Out:=K_Out-1; //Определяем индекс следущего значения
if K_Out<0 then K_Out:=47999;
if K_Out=K_In then //Если в буфере догнали вход то
begin
K_Out:=K_Out+1; //отступаем назад к предыдущему значению.
if K_Out=48000 then K_Out:=0;
end;
end
else ChanLR:=0;
_hi_OnEvent(onNextSempl, DataSound[ChanLR, K_Out]); //выводим следующее значение
end;

карма: 19

0
файлы: 1next_sound_old.jpg [77.2KB] [317]