Показать сообщение отдельно
  #1  
Старый 04.06.2006, 15:41
Angelo Angelo вне форума
Прохожий
 
Регистрация: 04.06.2006
Сообщения: 2
Репутация: 10
По умолчанию Помогите начинающему разобраться с компонентами звука (преобразование данных)

Помогите начинающему разобраться с компонентами TEnhWaveIn(захват звука) и TEnhWaveOut (воспроизведение звука). Пытаюсь сделать простенький диктофончик: 10с записи (моно 16 бит) в массив и затем воспроизведение.

Запись: включаю по таймеру на 10 сек TEnhWaveIn, и по его событию(заполнение буфера-2048= 0.25сек) переписываю в большой массив.

var
Sound_array_index : Integer;
Sound_array : array [0..80000] of SmallInt;
//
procedure TForm1.Audio_data(sender: TObject; data: PChar; size: Integer);var
x : SmallInt;
counter : Integer;
beginfor counter := 0 to 2047 do
begin
x := SmallInt(data[counter]);
Sound_array [Sound_array_index] := x;
end;
end;
//

Воспроизведение: по таймеру (каждые 0.25с) нужно записать кусок из большого массива в «EnhWaveOut1.playback(data: PChar; size: Integer )» С этим проблема, зависает, не знаю как правильно преобразовать данные из большого массива для записи в компонент TEnhWaveOut.

procedure TForm1.Timer_end_play(Sender: TObject);
varSnd_array : PChar;
counter : Integer;
beginSnd_array := '';
for counter := 0 to 2047 do
beginSnd_array[counter] := Char(Sound_array [Sound_array_index + counter]);
end;
//
EnhWaveOut1.playback(Snd_array, 2048);
Sound_array_index := Sound_array_index + 2048;
//
if Sound_array_index > 80000 then
begin
Timer2.Enabled := False;
EnhWaveOut1.close;
Memo1.Lines.Add('Play stop');
end;
end;

Вся эта эпопея с большим массивом, чтоб мне было просто и удобно брать любой кусок данных(1 элемент массива =1 отсчёт звука) и пробовать различные алгоритмы компрессии/декомпрессии, но сейчас вот заготовку пытаюсь осилить….
Ответить с цитированием