Wave w Delphi

0

Mam problem z zapisem wave skompresowanego GSM 6.10.
Chcę dowolne dane, np. sinusa (tablice of bytes ) zapisac do pliku wave.

Czyli definiuje tablice np.:

var
t: Extended;
f,n:integer;
buffer:array[0..7999]of byte;

begin

f:=1000;
t:=1/8000;

for n:=0 to 7999 do
buffer[n] := round((((Sin(2Pifnt))/2)+1)*255);
end;

i w buffer[n] mam 8 bitowe próbki sinusa 1kHz samplowane co 8kHz oczywiście wielkość bufora mogę zmienić dowolnie.
Moje pytanie brzmi jak skompresować taki bufor przy pomocy systemowego kodeka gsm.

Proszę o pomoc

0

Zapewne mowa o ACM (Audio Compression Manager) więc poszukaj informacji o funkcjach:

acmStreamOpen
acmStreamSize
acmStreamPrepareHeader
acmStreamConvert
acmStreamUnprepareHeader 
acmStreamClose 

...miłej 'zabawy' życze ;)

0

Już próbowałem użyć funkcji:
acmStreamOpen
acmStreamSize
acmStreamPrepareHeader
acmStreamConvert
acmStreamUnprepareHeader
acmStreamClose.

Niestety bezskutecznie. Nie jestem w stanie ich poprawnie użyć. Prosze o więcej informacji

0

A z czym dokładnie były problemy? W necie jest troche przykładów użycia tych funkcji - wiem bo sam szukałem informacji na ich temat tyle, że mnie interesowała dekompresja ADPCM.

0

Podeśle Ci mailem kod w Delphi, nie jest on poprawny, jest bład w acmStreamPrepareHeader, błąd-The specified handle is invalid .

0

Są dwa błędy/zastrzeżenia. Pierwszy - definicja formatu wyjściowego GSM, a drugi to wielkość bufora wyjściowego. Jeżeli chodzi o format (struktura

format_wyjscia

) to możesz go usyskać przy pomocy funkcji:

MMRESULT acmFormatSuggest(

    HACMDRIVER had,	   //<--- NULL
    LPWAVEFORMATEX pwfxSrc,//<--- format_zrodla	
    LPWAVEFORMATEX pwfxDst,//<--- format_wyjscia (musi mieć rozmiar wiekszy niż WAVEFORMATEX np. 100 bajtów)	
    DWORD cbwfxDst,	   //<--- tu rozmiar struktury format_wyjscia (np. 100)
    DWORD fdwSuggest       //<--- tu flaga ACM_FORMATSUGGESTF_WFORMATTAG	  
   );

przed wywołaniem

acmFormatSuggest

w strukturze format_wyjscia

 ustawiasz <code class="cpp">wFormatTag

na WAVE_FORMAT_GSM610.

Dobra, jak masz już poprawne formaty to możesz otworzyć stream funkcją

acmStreamOpen

. Teraz musisz określić rozmiar bufora wyjściowego funkcją:

MMRESULT acmStreamSize(

    HACMSTREAM has,      //<--- uchwyt do streamu	
    DWORD cbInput,	 //<--- wielkość bufora wejściowego w bajtach
    LPDWORD pdwOutputBytes, //<--- tu funkcja zwróci proponowaną wielkość bufora wyjściowego	
    DWORD fdwSize	   //<--- tu flaga ACM_STREAMSIZEF_SOURCE
   );

Teraz alokujesz buffory o ustalonych wielkościach i wywołujesz

acmStreamPrepareHeader

(u ciebie ta funkcja była przed otwarciem streamu i stąd ten błąd :))

That's all ;)

0

Zastosowałam się do twoich wskazówek ale niestety dalej coś źle robię . Podeśle Ci kod

0

OK, dwie rzeczy. Pierwsza to wielkość

format_wyjscia

. Pisałem, że musi/powinna być większa niż rozmiar struktury WAVEFORAMTEX, a u ciebie jest właśnie równa sizeof(WAVEFORMATEX)

. Jedynie do funkcji dałeś informacje, że jest 100 - to może powodować błędy. Pokaże ci jak ja zrobiłbym to tyle, że w C++ (w delphi nie programuje ;)):

```cpp
char wfx_buff[100];  //<--- buffor 100-bajtowy
WAVEFORMATEX *format_wyjscia; //<--- wskaźnik na WAVEFORMATEX

memset(wfx_buff,0,100); //<--- wyzerowanie wfx_buff

format_wyjscia=(WAVEFORMATEX*)wfx_buff; //<--- przypisanie wskaźnikowi adresu  wfx_buff

format_wyjscia->wFormatTag=WAVE_FORMAT_GSM610; //<--- tu wiadomo

mmr=acmFormatSuggest(NULL,&format_zrodla,format_wyjscia,100,ACM_FORMATSUGGESTF_WFORMATTAG);

Druga sprawa to wywołanie

acmStreamOpen

. Nie ustawiłeś flagi fdwOpen

:

```cpp
acmStreamOpen(handle_stream,nil,format_zrodla, format_wyjscia, nil, 0, 0, ACM_STREAMOPENF_NONREALTIME);

A tak poza tym, to sprawdzaj jakie kody błędów zwraca funkcja wtedy będziesz wiedział co jest nie tak (plik msacm.h). Może być też tak, że encoder nie akceptuje formatu wejściowego.

0

Dzięki za pomoc, spróbuje nasieść poprawki i dam znać jaki efekt.
Kody błędów sprawdzam, nie podesłałam Ci tej czesci kodu

0

Dzięki za pomoc, po wielu próbach w końcu się udało.

1 użytkowników online, w tym zalogowanych: 0, gości: 1