Войти
ПрограммированиеФорумЗвук

Звуковая библиотека BASS

#0
0:23, 4 апр. 2011

Всем привет, пишу на делфи с использованием BASS что-то вроде эквалайзера.
Использую следующий код:

  Type TFFTData  = array [0..512] of Single;
  FFTData: TFFTData;
  ....
  //при отрисовке:
  //Channel - канал воспроизведения трека
  BASS_ChannelGetData(Channel, @FFTData, BASS_DATA_FFT1024);
  //отображаем значения FFTData[<цикл 0..512>]

В реалтайме (т.е. когда играет музыка) всё работает просто отлично. Но мне нужно считать все значения ДО начала воспроизведения музыки.

Использую что-то вроде:

while nowpos < len do //len - длина трека в байтах, nowpos - текущая позиция (тоже в байтах)
    begin
      //проматываем трек вперед
      nowpos := nowpos + <число>; 
      BASS_ChannelSetPosition(Channel, nowpos, BASS_POS_BYTE); 
      //запрашиваем
      BASS_ChannelGetData(Channel, @FFTData, BASS_DATA_FFT1024);
      //тут записываем FFTData в какой-нить массив
    end;

И вот тут все значения FFTData равны нулю. Я догадываюсь, что так как я просто проматываю трек вперед без фактического воспроизведения, то как раз из-за этого все значения нулевые. Собственно вопрос: каким образом можно получить эти значения не проигрывая трек в реалтайме. Заранее спасибо.


#1
11:08, 4 апр. 2011

Там есть специальный режим - decode channel, как раз это и делает. Флажок у функции создания стрима.

#2
14:01, 4 апр. 2011

Вобщем, кажется я понял в чем проблема, но совершенно не представляю как её исправить.
Такое ощущение, что при перемотки трека все значения сбрасываются в ноль (песня продолжается дальше и данные начинают считываться нормально).

Я попробовал во время обычного реалтайм воспроизведения (когда данные у меня читаются нормально) зажать кнопку перемотки, и в это время все данные нулевые. Как только отпускаю кнопку перемотки и музыка продолжается в обычном темпе - данные снова считываются нормально. А когда я пытаюсь считать все данные до начала трека собственно и происходит быстрая перемотка всего трека и данные определяются как нулевые.

Можно ли как-то выйти из этого положения? (Возможно давать треку поиграть несколько милисекунд после перемотки?)

>Там есть специальный режим - decode channel
(флаг BASS_STREAM_DECODE просто не отправляет звук на аудио-выход, а в целом картина та же что и без флага)

#3
17:08, 4 апр. 2011

Ну вот это просто "не отправляет" на самом деле не просто: оно умеет декодить быстрее, чем риалтайм. В этом его главная фича.

#4
21:28, 4 апр. 2011

Tortugas
> Можно ли как-то выйти из этого положения? (Возможно давать треку поиграть
> несколько милисекунд после перемотки?)
BASS_ChannelPreBuf ?

А вообще зачем тебе перемотка? в режиме BASS_STREAM_DECODE при извлечении семплов BASS смещает текущую позицию, поэтому ничего самому перематывать ненужно. Ты сбрасываешь встроенный буфер и естественно ничего не видишь в нем.
Так же тебе более наглядно может помочь пример в самом модуле, правда не помню как он называется. Там открываешь файл, показывается окно с уровнями. Т.е. происходит сначала декодирование, а уже потом воспроизведение. Как раз то, что тебе нужно (только там используется BASS_ChannelGetLevel вместо BASS_ChannelGetData но это не суть важно)

#5
18:00, 5 апр. 2011

Ок, спасибо, погляжу что к чему

ПрограммированиеФорумЗвук

Тема в архиве.