[Openal] How can I play mono wav sound in specific channel?
Daniel PEACOCK
dpeacock at creativelabs.com
Fri Apr 17 00:02:34 PDT 2009
Hi,
I'm not quite sure what you mean.
The "GS" device will only output stereo so there is nothing you can do to
get it to output 5.1 audio. There maybe some options in your soundcard
(which one do you have?) for controlling how stereo audio is upmixed (or
not) to 5.1 speakers (e.g Creative have a technology called CMSS that does
this, and you can control the settings in the Creative Audio Control
Panel).
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
Ümit Uzun
<umituzun84 at gmail
.com> To
Sent by: OpenAL
openal-bounces at op <openal at opensource.creative.com>
ensource.creative cc
.com
Subject
Re: [Openal] How can I play mono
04/16/2009 07:47 wav sound in specific channel?
PM
Hi Don;
Thanks for your explanations. But I mind that, when I play 5.1 stereo wav
audio on Generic Software mode, I can hear all kind of related sound
seperated from each speaker.
Do you think if we have canned stereo sound suitable for our speaker
system, is it possible to play each sound on expected speaker piece?
Thanks in advance.
Best Regards.
2009/4/16 Daniel PEACOCK <dpeacock at creativelabs.com>
"Note that when using the “Generic Software” device, the multi-channel
buffers are mixed down to a stereo output"
The behaviour you are seeing on the "Generic Software" device is
expected. This device only supports stereo (2.0) output. It supports
playback of multi-channel buffers (e.g 5.1 or 7.1), and rather than lose
any audio contained in the extra channels, that data is mixed into the
stereo output - preserving left-right separation (e.g all the left
channels of a multichannel buffer are mixed into the output left channel
and all the right channels are mixed into the output right channel).
Your soundcard is likely to be upmixing the stereo output of the "Generic
Software" device to 5.1which is why you hear audio in all the channels.
The bottom line is that the "Generic Software" device won't let you send
a discrete signal to a side or rear channel. The other Creative devices
will all support this feature - and so will Chris' OpenAL-Soft.
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
(Embedded image moved to file: pic32391.gif)Inactive hide details for
Ümit Uzun <umituzun84 at gmail.com>
Ümit Uzun <umituzun84 at gmail.com>
Ümit Uzun <
umituzun84 at gmai
l.com>
Sent by:
openal-bounces@
opensource.crea (Embedded image moved to file:
tive.com pic14604.gif)
To
(Embedded image moved
04/16/2009 to file: pic03902.gif)
02:06 PM OpenAL <
openal at opensource.crea
tive.com>
(Embedded image moved to file:
pic00153.gif)
cc
(Embedded image moved
to file: pic00292.gif)
(Embedded image moved to file:
pic12382.gif)
Subject
(Embedded image moved
to file: pic17421.gif)
Re: [Openal] How can I
play mono wav sound in
specific channel?
(Embedded image moved to file:
pic18716.gif)
(Embedded image moved to
file: pic19718.gif)
Hi Chris;
I have implemented your code in Framework.cpp and it works like a charm
:D Thanks so much for your awesome helps :D But I have some questions to
solve. I have implemented your suggestion on 5.1 speaker system like
that;
template<typename T>
T *load_data(const T *data, int size)
{ size /= sizeof(T); T *data71 = new T[size*6]; for(int i = 0;i <
size;i++) { data71[i*6 + 0] = 0; // front-left data71[i*6 + 1] = 0;
// front-right data71[i*6 + 2] = 0; // front-center data71[i*6 + 3]
= 0; // lfe (sub-woofer) data71[i*6 + 4] = 0; // back-left
data71[i*6 + 5] = 0; // back-right } return data71;
}
--------------------------------------
WAVEFORMATEX fmt;
g_pWaveLoader->
GetWaveFormatExHeader(WaveID, &fmt);
if(fmt.wBitsPerSample == 8) { ALubyte *data = load_data((const
ALubyte*)pData, iDataSize); alBufferData(uiBufferID,
alGetEnumValue("AL_FORMAT_51CHN8"), data, iDataSize*6,
iFrequency); delete[] data;
} else if(fmt.wBitsPerSample == 16) { ALshort *data = load_data((const
ALshort*)pData, iDataSize); alBufferData(uiBufferID,
alGetEnumValue("AL_FORMAT_51CHN16"), data, iDataSize*6,
iFrequency); delete[] data;
} else if(fmt.wBitsPerSample == 32) { // assumes 32-bit float ALfloat
*data = load_data((const ALfloat*)pData,
iDataSize); alBufferData(uiBufferID,
alGetEnumValue("AL_FORMAT_51CHN32"), data, iDataSize*6,
iFrequency); delete[] data;
}
It works on while using Generic Hardware. I mean I can direct each sound
to each wanted channel errorless, but when I try same operation while
using Generic Software it works but it is mixing the channels. For
example I want to play on back- left, but sound is heard from front-left,
back-left, front-center and lfe and vice-versa for the back-right.
I mean Generic Software can't play related channel on related side. Do
you think it is problem of generic software or what? I have looked at the
OpenALProgrammingGuide and there is a statement about kind of this
situation but I can't really understand what does it mean? Can you
explain what could be the problem?
>From OpenALProgrammingGuide;
"The multi-channel extension provides a mechanism to play multi-channel
data via OpenAL. A variety of formats are supported. Multi-channel
buffers can be attached or queued on a source.
Note that when using the “Generic Software” device, the multi-channel
buffers are mixed down to a stereo output. On a hardware device (such as
the “Generic Hardware” device or a native device), each channel of a
buffer requires a hardware voice. So, for example playing a buffer using
the AL_FORMAT_51CHN16 format will require 6 free hardware voices. If the
hardware resources are unavailable, the call to alSourceQueueBuffers or
alSourcei will fail."
Thanks so much.
Best Regards.
2009/4/16 Chris Robinson <chris.kcat at gmail.com>
On Thursday 16 April 2009 2:53:45 am you wrote:
> Hi Chris;
>
> > ALshort monodata[samples];
> >
> > you can fill it into a 7.1 buffer like this:
> >
> > ALshort data71[samples*8];
> > for(int i = 0;i < samples;i++) {
> > data71[i*8 + 0] = 0; // front-left
> > data71[i*8 + 1] = 0; // front-right
> > data71[i*8 + 2] = 0; // front-center
> > data71[i*8 + 3] = 0; // lfe (sub-woofer)
> > data71[i*8 + 4] = 0; // back-left
> > data71[i*8 + 5] = 0; // back-right
> > data71[i*8 + 6] = monodata[i]; // side-left
> > data71[i*8 + 7] = monodata[i]; // side-right
> > }
> > alBufferData(bID, alGetEnumValue("AL_FORMAT_71CHN16"), data71,
> > samples*8*sizeof(ALshort), frequency);
> >
> I have look at the Framework and there is ALFWLoadWaveToBuffer;
>
> ALboolean ALFWLoadWaveToBuffer(const char *szWaveFile, ALuint
uiBufferID,
> ALenum eXRAMBufferMode)
> {
> WAVEID WaveID;
> ALint iDataSize, iFrequency;
> ALenum eBufferFormat;
> ALchar *pData;
> ALboolean bReturn;
>
> bReturn = AL_FALSE;
> if(g_pWaveLoader)
> {
> if(SUCCEEDED(g_pWaveLoader->LoadWaveFile(szWaveFile,
&WaveID)))
> {
> if((SUCCEEDED(g_pWaveLoader->GetWaveSize(WaveID,
(unsigned
> long*)&iDataSize))) &&
> (SUCCEEDED(g_pWaveLoader->GetWaveData(WaveID,
> (void**)&pData))) &&
> (SUCCEEDED(g_pWaveLoader->GetWaveFrequency(WaveID,
(unsigned
> long*)&iFrequency))) &&
> (SUCCEEDED(g_pWaveLoader->GetWaveALBufferFormat(WaveID,
> &alGetEnumValue, (unsigned long*)&eBufferFormat))))
> {
> // Set XRAM Mode (ifapplication)
> if(eaxSetBufferMode && eXRAMBufferMode)
> {
> eaxSetBufferMode(1, &uiBufferID,
eXRAMBufferMode);
> }
>
> alGetError();
> alBufferData(uiBufferID, eBufferFormat, pData,
iDataSize,
> iFrequency);
>
> if(alGetError() == AL_NO_ERROR)
> {
> bReturn = AL_TRUE;
> }
>
> g_pWaveLoader->DeleteWaveFile(WaveID);
> }
> }
> }
>
> return bReturn;
> }
>
> You have given ALshort monodata[samples]; but in this code ALchar
*pData;
> This variable are same or not. because alBufferData takes void
format and
> ALchar is 1 byte and ALshort 2 byte. I can't get what should I
do.
They aren't the same. That function uses pData because the loaded
wave data
may be 8-bit, or 16-bit (or possible 32-bit), so it just uses a
generic char
type.
g_pWaveLoader has a GetWaveFormatExHeader method you can use to get
a
WAVEFORMATEX struct, which has a wBitsPerSample field. You need to
check that
field and act on the data depending on the value (eg. if it's 8,
use ALubyte,
if it's 16, use ALshort).
And example of doing this in C++ would be something like:
template<typename T>
T *load_data(const T *data, int size)
{ size /= sizeof(T); T *data71 = new T[size*8]; for(int i = 0;i <
size;i++) { data71[i*8 + 0] = 0; // front-left data71[i*8 +
1] = 0; // front-right data71[i*8 + 2] = 0; // front-center
data71[i*8 + 3] = 0; // lfe (sub-woofer) data71[i*8 + 4] = 0; //
back-left data71[i*8 + 5] = 0; // back-right data71[i*8 + 6]
= data[i]; // side-left data71[i*8 + 7] = data[i]; //
side-right } return data71;
}
...
WAVEFORMATEX fmt;
g_pWaveLoader->GetWaveFormatExHeader(WaveID, &fmt);
if(fmt.wBitsPerSample == 8) { ALubyte *data = load_data((const
ALubyte*)pData, iDataSize); alBufferData(uiBufferID,
alGetEnumValue("AL_FORMAT_71CHN8"), data,
iDataSize*8, iFrequency); delete[] data;
} else if(fmt.wBitsPerSample == 16) { ALshort *data =
load_data((const ALshort*)pData,
iDataSize); alBufferData(uiBufferID,
alGetEnumValue("AL_FORMAT_71CHN16"), data,
iDataSize*8, iFrequency); delete[] data;
} else if(fmt.wBitsPerSample == 32) { // assumes 32-bit
float ALshort *data = load_data((const ALfloat*)pData,
iDataSize); alBufferData(uiBufferID,
alGetEnumValue("AL_FORMAT_71CHN32"), data,
iDataSize*8, iFrequency); delete[] data;
}
..
completely untested, but the concept should work. It would load the
sound so
that when it plays, it'll play out the side speakers.
_______________________________________________
Openal mailing list
Openal at opensource.creative.com
http://opensource.creative.com/mailman/listinfo/openal
--
Ümit Uzun_______________________________________________
Openal mailing list
Openal at opensource.creative.com
http://opensource.creative.com/mailman/listinfo/openal
ForwardSourceID:NT0006B3A2
--
Ümit Uzun_______________________________________________
Openal mailing list
Openal at opensource.creative.com
http://opensource.creative.com/mailman/listinfo/openal
ForwardSourceID:NT0006B3FE
-------------- next part --------------
A non-text attachment was scrubbed...
Name: pic32391.gif
Type: image/gif
Size: 105 bytes
Desc: not available
Url : http://opensource.creative.com/pipermail/openal/attachments/20090417/2095ca6a/pic32391.gif
-------------- next part --------------
A non-text attachment was scrubbed...
Name: pic14604.gif
Type: image/gif
Size: 45 bytes
Desc: not available
Url : http://opensource.creative.com/pipermail/openal/attachments/20090417/2095ca6a/pic14604.gif
-------------- next part --------------
A non-text attachment was scrubbed...
Name: pic03902.gif
Type: image/gif
Size: 45 bytes
Desc: not available
Url : http://opensource.creative.com/pipermail/openal/attachments/20090417/2095ca6a/pic03902.gif
-------------- next part --------------
A non-text attachment was scrubbed...
Name: pic00153.gif
Type: image/gif
Size: 45 bytes
Desc: not available
Url : http://opensource.creative.com/pipermail/openal/attachments/20090417/2095ca6a/pic00153.gif
-------------- next part --------------
A non-text attachment was scrubbed...
Name: pic00292.gif
Type: image/gif
Size: 45 bytes
Desc: not available
Url : http://opensource.creative.com/pipermail/openal/attachments/20090417/2095ca6a/pic00292.gif
-------------- next part --------------
A non-text attachment was scrubbed...
Name: pic12382.gif
Type: image/gif
Size: 45 bytes
Desc: not available
Url : http://opensource.creative.com/pipermail/openal/attachments/20090417/2095ca6a/pic12382.gif
-------------- next part --------------
A non-text attachment was scrubbed...
Name: pic17421.gif
Type: image/gif
Size: 45 bytes
Desc: not available
Url : http://opensource.creative.com/pipermail/openal/attachments/20090417/2095ca6a/pic17421.gif
-------------- next part --------------
A non-text attachment was scrubbed...
Name: pic18716.gif
Type: image/gif
Size: 45 bytes
Desc: not available
Url : http://opensource.creative.com/pipermail/openal/attachments/20090417/2095ca6a/pic18716.gif
-------------- next part --------------
A non-text attachment was scrubbed...
Name: pic19718.gif
Type: image/gif
Size: 45 bytes
Desc: not available
Url : http://opensource.creative.com/pipermail/openal/attachments/20090417/2095ca6a/pic19718.gif
More information about the Openal
mailing list