24 May '13 - 08:42 *
Welcome, Guest. Please login or register.
Did you miss your activation email?

Login with username, password and session length
 
   Home   Help Search Login Register  
Pages: [1]
  Reply  |  Print  
Author Topic: need help with record in WAV on c++ builder (RAD Studio XE)  (Read 452 times)
verssion
Posts: 2


« on: 3 May '12 - 19:05 »
Reply with quoteQuote

hello all, i need help
i want create program on c++ builder like "recordtest" in delphi,
i try translate it, but  i got error 41 on BASS_StreamCreateFile after a button press "Stop"
i think problem with writing header for file

its code on delphi:

type
  WAVHDR = packed record
    riff:         array[0..3] of AnsiChar;
    len:         DWord;
    cWavFmt:      array[0..7] of AnsiChar;
    dwHdrLen:      DWord;
    wFormat:      Word;
    wNumChannels:   Word;
    dwSampleRate:   DWord;
    dwBytesPerSec:   DWord;
    wBlockAlign:   Word;
    wBitsPerSample:   Word;
    cData:         array[0..3] of AnsiChar;
    dwDataLen:      DWord;
  end;

var
WaveHdr: WAVHDR;  // WAV header

   with WaveHdr do
    begin
      riff := 'RIFF';
      len := 36;
      cWavFmt := 'WAVEfmt ';
      dwHdrLen := 16;
      wFormat := 1;
      wNumChannels := 2;
      dwSampleRate := 44100;
      wBlockAlign := 4;
      dwBytesPerSec := 176400;
      wBitsPerSample := 16;
      cData := 'data';
      dwDataLen := 0;
    end;
   WaveStream.Write(WaveHdr, SizeOf(WAVHDR));
   // start recording @ 44100hz 16-bit stereo
   rchan := BASS_RecordStart(44100, 2, 0, @RecordingCallback, nil);

and my code on builder:

   char riff[4]={ 'R', 'I', 'F', 'F' };
   int len=36;
   char cWavFmt[8]={'W','A','V','E','f','m','t',' '};
   int dwHdrLen=16;
   short wFormat=1;
   short wNumChannels=2;
   int dwSampleRate=44100;
   int wBlockAlign=4;
   short dwBytesPerSec=176400;
   short wBitsPerSample=16;
   char cData[4]={'d','a','t','a'};
   int dwDataLen=0;

   WaveStream->Write(&riff, sizeof(char));
   WaveStream->Write(&len, sizeof(int));
   WaveStream->Write(&cWavFmt, sizeof(char));
   WaveStream->Write(&dwHdrLen, sizeof(int));
   WaveStream->Write(&wFormat, sizeof(short));
   WaveStream->Write(&wNumChannels, sizeof(short));
   WaveStream->Write(&dwSampleRate, sizeof(int));
   WaveStream->Write(&wBlockAlign, sizeof(int));
   WaveStream->Write(&dwBytesPerSec, sizeof(short));
   WaveStream->Write(&wBitsPerSample, sizeof(short));
   WaveStream->Write(&cData, sizeof(char));
   WaveStream->Write(&dwDataLen, sizeof(int));


   // start recording @ 44100hz 16-bit stereo
   rchan = BASS_RecordStart(44100, 2, 0, RecordingCallback, NULL);

pls help, who can =(
Logged
Ian @ un4seen
Administrator
Posts: 15270


« Reply #1 on: 4 May '12 - 14:47 »
Reply with quoteQuote

Yep, error code 41 (BASS_ERROR_FILEFORM) does suggest a problem in the generated WAVE header. It looks like the problem is here...

WaveStream->Write(&riff, sizeof(char));
...
WaveStream->Write(&cWavFmt, sizeof(char));
...
WaveStream->Write(&cData, sizeof(char));

Those fields are more than 1 byte/char long. It should look like this...

WaveStream->Write(riff, sizeof(riff));
...
WaveStream->Write(cWavFmt, sizeof(cWavFmt));
...
WaveStream->Write(cData, sizeof(cData));

Also, "dwBytesPerSec" should be 4 bytes long, eg. an "int" rather than "short".

To simplify things, I would suggest using the BASSenc add-on to handle WAV file writing. See the included RECTEST example for a demonstration of recording to a WAV file (or encoded format too).
Logged
verssion
Posts: 2


« Reply #2 on: 4 May '12 - 15:16 »
Reply with quoteQuote

OMG Ian!!!!!! i'm so LOVE YOU!!!!!!!!!!! xDD
it's work!!! i miss many time on this problem.
you the best!!! big thank to you!!!!!  I want to cry from happiness T_T
and i hope my english no so bad xD
Logged
Pages: [1]
  Reply  |  Print  
 
Jump to:  

Powered by SMF 1.1.18 | SMF © 2013, Simple Machines