[Speex-dev] Problems with stereo data

Peter Mosedal Laursen dmu615 at vejlehs.dk
Mon Apr 2 12:05:57 PDT 2007


Hi all,

I have a problem when I am encoding (or decoding) stereo audio.

With mono data, things are fine and everything works without any problems.

When I try to decode stereo data, all I get is a static sound - similar to that of a radio not tuned to any specific station. I wonder what might be wrong?

Below is the code, first, of the encoder and next that of the decoder. Any information or help would be very much appreciated. I have looked through the sampleenc.c and sampledec.c distributed with the speex 1.2 Beta 1 source code, but in that regard, that code was of little help.

My test data are sampled at 16 Khz and it is a stereo file.

I look forward to any reply or information on how to deal with stereo data in Speex.

I am on Windows, using Microsoft Visual C++ 2005 Express Edition.

Best regards,

Peter.

// Encoder

#include <speex/speex.h>

#include <speex/speex_stereo.h>

#include <stdio.h>

#pragma comment(lib, "libspeex.lib")

int main(int argc, char* argv[]) {

const int FrameSize = 320;

void* State = speex_encoder_init(&speex_wb_mode);

int Temp;

float Tmp;

Temp = 1;

Tmp = 2;

speex_encoder_ctl(State, SPEEX_SET_VBR, &Temp);

speex_encoder_ctl(State, SPEEX_SET_VBR_QUALITY, &Tmp);

FILE* fin = fopen(argv[1], "rb");

FILE* fout = fopen(argv[2], "wb");

SpeexBits Bits;

speex_bits_init(&Bits);

short Frame[FrameSize];

char Cbits[200];

while (!feof(fin)) {

speex_bits_reset(&Bits);

fread(Frame, sizeof(short), FrameSize, fin);

speex_encode_stereo_int(Frame, FrameSize, &Bits);

speex_encode_int(State, Frame, &Bits);

short BytesToWrite = speex_bits_write(&Bits, Cbits, 200);

fwrite(&BytesToWrite, sizeof(short), 1, fout);

fwrite(Cbits, 1, BytesToWrite, fout);

}

speex_encoder_destroy(State);

speex_bits_destroy(&Bits);

fclose(fout);

fclose(fin);

}

// Decoder

#include <stdio.h>

#include <speex/speex.h>

#include <speex/speex_stereo.h>

#pragma comment(lib, "libspeex.lib")

int main(int argc, char* argv[]) {

FILE* fin = fopen(argv[1], "rb");

FILE* fout = fopen(argv[2], "wb");

void* State = speex_decoder_init(&speex_wb_mode);

SpeexBits Bits;

speex_bits_init(&Bits);

const int FrameSize = 320;

short Output[FrameSize];

short BytesToRead;

char Buffer[1024];

SpeexStereoState StereoState = SPEEX_STEREO_STATE_INIT;

while (!feof(fin)) {

fread(&BytesToRead, sizeof(short), 1, fin);

fread(Buffer, 1, BytesToRead, fin);

speex_bits_read_from(&Bits, Buffer, BytesToRead);

speex_decode_int(State, &Bits, Output);

speex_decode_stereo_int(Output, FrameSize, &StereoState);

fwrite(Output, sizeof(short), FrameSize, fout);

}

fclose(fout);

fclose(fin);

speex_decoder_destroy(State);

speex_bits_destroy(&Bits);

}



More information about the Speex-dev mailing list