artykuły

Jak nagrywać dźwięk tak, by mieć kontrole nad buforem w czasie rzeczywistym?

10:13
śro, 3 styczeń 2007
Pytanie:
interesuje mnie zaawansowane nagrywanie dźwięku w sposób, by mieć kontrole nad buforem (móc go modyfikować) w czasie rzeczywistym. Dodam, że korzystałem z pakietu DSPack, w którym jest możliwość dostępu do bufora w czasie rzeczywistym, ale według moich doświadczeń nie można go w danej chwili modyfikować. Również DSPack niekiedy się troszkę sypie przy tego typu operacjach (np. niemożność odczytania prawdziwego rozmiaru strumienia będącego buforem podczas działań na nim [może nie tyle niemożność co jego nieprawidłowy rozmiar]). Interesują mnie rozwiązania w czystym API, w DirectX (mam przetłumaczone nagłówki) lub komponenty (o ile takie istnieją).
Z góry dziękuję wszystkim za pomoc, będę wdzięczny za jakiekolwiek odpowiedzi.
Łukasz.

Odpowiedź:
Wszystkich zainteresowanych tematem odsyłam do strony http://www.un4seen.com/ na której znajduje się biblioteka DLL o nazwie BASS, wraz z przetłumaczonymi nagłówkami dla Delphi (tak więc normalna w użyciu, nie trzeba ręcznie wyławiać funkcji z biblioteki DLL). Ma ona ogromne możliwości, jest bardziej dopracowana niż część audio paczki DSPack (nie występują w niej podobne problemy), jest szybsza, łatwiejsza w obsłudze, bezpłatna do niekomercyjnych zastosowań. Dodatkowo dołączony przykład o nazwie RecordTest pokazuje jak można nagrywać za pomocą BASS.
Udało mi się za jej pomocą zmodyfikować bufor w czasie rzeczywistym (dla chętnych podaje przykład zmienionej procedury "RecordingCallback" znajdującej się w przykładzie RecordTest, która modyfikuje nagrywany dźwięk w czasie rzeczywistym): function RecordingCallback(Handle: HRECORD; buffer: Pointer; length, user: DWord): boolean; stdcall; var i : integer; probka : ^byte; begin // Modyfikacja bufora for i:=0 to length-1 Do begin probka := Pointer(Integer(buffer)+i); // Teraz zmienna probka^ stanowi pojedynczą próbkę którą możemy dowolnie modyfikować probka^ := probka^ div 2; end; // Koniec modyfikacji bufora // Kopiuje bufor (zmienna buffer) do strumienia zawierającego dźwięk (zmienna WaveStream) Form1.WaveStream.Write(buffer^, length); // Allow recording to continue Result := True; end; Póki co brak pytań w FAQ.

Skomentuj

Aby zamieścić komentarz, proszę włączyć JavaScript - niestety roboty spamujące dają mi niezmiernie popalić.






Komentarze czytelników

    Nie ma jeszcze żadnych komentarzy.
    Dexter