[Openal] Split wav channel
Daniel PEACOCK
dpeacock at creativelabs.com
Wed Jul 29 03:53:35 PDT 2009
Hi Andrea,
I think there are few issues here.
1. This routine ...
ALvoid SplitStereo(ALshort *pStereoData, ALshort *pLeft, ALshort
*pRight, ALuint uiNumSamples)
{ ALuint i; if(pLeft == NULL) pLeft = (ALshort *)
malloc(uiNumSamples*2); if(pRight == NULL) pRight =
(ALshort *) malloc(uiNumSamples*2); for (i = 0; i < uiNumSamples;
i++) { pLeft[ i ] =
pStereoData[i*2]; pRight[ i ] = pStereoData[i*2+1]; }
}
If you want this function to allocate memory when needed, then you will
need to pass in pointers to pointers for the left and right buffers. In
your code alDataL will still be NULL after calling the function - and you
will leak memory. alDataR will actually be OK, because it is non-NULL on
entry (it actually points to the stereo interleaved data, i.e same as
pStereoData). I would expect you to get an AL error when doing
alBufferData( bufferL, AL_FORMAT_MONO8, alDataL, size/4, freq ); because
alDataL is NULL.
2. The alBufferData calls have 2 other problems ... AL_FORMAT_MONO8
should be replaced by AL_FORMAT_MONO16 (we didn't change the bit depth just
the channel count - this is what is causing the random noise). Also the
4th parameter should be the number of bytes not samples - which in this
case will be size / 2.
Try those modifications and see what happens.
Dan
Creative Labs (UK) Ltd.
Notice
The information in this message is confidential and may be legally
privileged. It is intended solely for the addressee. Access to this
message by anyone else is unauthorized. If you are not the intended
recipient, any disclosure, copying or distribution of the message, or
any action taken by you in reliance on it, is prohibited and may be
unlawful. If you have received this message in error, please delete it
and contact the sender immediately. Thank you.
Creative Labs UK Ltd company number 2658256 registered in England and Wales
at Belmont Road, Belmont Place, Maidenhead, Berkshire, SL6 6TB
Andrea Mannarà
<andrea.mannara at t
hesis.seac02.it> To
Sent by: openal at opensource.creative.com
openal-bounces at op cc
ensource.creative
.com Subject
[Openal] Split wav channel
07/29/2009 11:25
AM
---------- Forwarded message ----------
From: Huvber <huvber at gmail.com>
Date: Wed, Jul 29, 2009 at 12:23 PM
Subject: Re: [Openal] Split wav channel
To: Daniel PEACOCK <dpeacock at creativelabs.com>
Cc: openal at opensource.creative.com
On Tue, Jul 28, 2009 at 5:52 PM, Daniel PEACOCK
<dpeacock at creativelabs.com> wrote:
>
> Hi,
>
> Stereo wave files have interleaved data i.e a Left Channel Sample
followed by a Right Channel Sample followed by Left, Right etc ... If you
want to split the file into two monos then you would do something like this
(assuming 16bit samples and that the pointers are all valid and point to
enough storage space, etc ...)
>
> ALvoid SplitStereo(ALshort *pStereoData, ALshort *pLeft, ALshort *pRight,
ALuint uiNumSamples)
> {
> ALuint i;
>
> for (i = 0; i < uiNumSamples; i++)
> {
> pLeft[ i ] = pStereoData[i*2];
> pRight[ i ] = pStereoData[i*2+1];
> }
> }
>
> If you just want to create a single mono stream from a stereo file, then
you need to mix the Left and Right samples together (and watch out for
overflows).
>
> ALvoid StereoToMono(ALshort *pStereoData, ALshort *pMonoData, ALuint
uiNumSamples)
> {
> ALuint i;
> ALint result;
>
> for (i = 0; i< uiNumSamples; i++)
> {
> result = (ALint)pStereoData[i*2] + (ALint)pStereoData[i*2+1];
> if (result > 32767)
> result = 32767;
> else if (result < -32768)
> result = -32768;
> pMonoData[i] = (ALshort)result;
> }
> }
>
> NOTE : uiNumSamples is the number of 'blocks' or 'frames' and not the
count of all the samples in all the channels. e.g. For 16bit stereo data,
uiNumSamples = DataSizeInBytes / 4. (divide by 2 because it is 16bit
shorts, and divide by 2 again because there are 2 channels).
>
> If you intend to play both mono parts of the stereo file then you should
use the vector play call (alSourcePlayv) to keep the parts in sync
otherwise you might hear some strange artifacts.
>
> Dan
> Creative Labs (UK) Ltd.
Hi,
Thanks a lot for your help, but I'm still in trouble. I post my code:
ALvoid SplitStereo(ALshort *pStereoData, ALshort *pLeft, ALshort
*pRight, ALuint uiNumSamples)
{ ALuint i; if(pLeft == NULL) pLeft = (ALshort *)
malloc(uiNumSamples*2); if(pRight == NULL) pRight =
(ALshort *) malloc(uiNumSamples*2); for (i = 0; i < uiNumSamples;
i++) { pLeft[ i ] =
pStereoData[i*2]; pRight[ i ] = pStereoData[i*2+1]; }
} ALenum format; ALsizei size; ALfloat
freq; ALboolean loop; ALuint bufferL; ALuint bufferR; ALshort
*alDataR=NULL; ALshort *alDataL = NULL alDataR =(ALshort *)
alutLoadMemoryFromFile
((ALbyte*)&(getUrl(i))[0], &format, &size, &freq);
if( alDataR ) { if(format ==
AL_FORMAT_STEREO16) { SplitStereo((ALshort*)alDataR,(ALshort*)alDataL,(ALshort*)alDataR,
size/4); alGenBuffers(1,
&bufferL); alGenBuffers(1,
&bufferR); alBufferData( bufferL, AL_FORMAT_MONO8, alDataL,
size/4, freq ); alBufferData( bufferR, AL_FORMAT_MONO8,
alDataR, size/4, freq ); }else{ alGenBuffers( 1,
&bufferR ); alBufferData( bufferR, format, alDataR, size,
freq ); setStorage_id(
bufferR); setL(0); } alSourceQueueBuffers( soundId1
, 1, (ALuint*)&(bufferR) ); alSourceQueueBuffers( soundId2 , 1,
(ALuint*)&(bufferL) ); alSourcePlay( soundId1 ); alSourcePlay(
soundId2 );
}
if the wav is in mono i haven't problem. Otherwise if i use a wav
stereo i have a noise similar to white noise.
Why?
_______________________________________________
Openal mailing list
Openal at opensource.creative.com
http://opensource.creative.com/mailman/listinfo/openal
ForwardSourceID:NT0006E2AE
More information about the Openal
mailing list