Re: Output Channel Selection Redux
Re: Output Channel Selection Redux
- Subject: Re: Output Channel Selection Redux
- From: Bob Ingraham <email@hidden>
- Date: Wed, 25 Feb 2009 16:48:23 -0700 (MST)
Thanks Bill - I think you're right.
Happily, I was able to instantiate four generators in AULab, each playing a different mono file to a unique output channel on my 16-channel output device!
So, at least I know it works very well for my particular output device.
However, after reading through the generated XML ".trak" document, I believe that there is more programming complexity involved than just this single call to set the Channel Map property.
The problem boils down to knowing WHICH selector/scope/element triples to invoke on the input and output unit and what ORDER to set them in.
After reading the docs and source headers, I just can't seem to determine which property selector/scope/element to invoke on my file-input and output units.
I wish there were a better roadmap on the order of operations for setting channel layout and channel map within the context of an Audio Graph.
Maybe someone could publish a Tech Note on how to simultaneously route one mono file to the Left Audio channel of the default System Output device and a different mono file to the Right Audio channel of the default System Output device.
An example would clear-up some of the mystery.
Thanks,
Bob
----- Original Message -----
From: "William Stewart" <email@hidden>
To: "Bob Ingraham" <email@hidden>
Cc: "CoreAudio API" <email@hidden>
Sent: Tuesday, February 24, 2009 7:11:27 PM GMT -07:00 US/Canada Mountain
Subject: Re: Output Channel Selection Redux
If you try this on the default output unit code (Developer/Examples/
CoreAudio) does it have the same problem?
Also - as my previous email described - you should be getting the
number of output channels from the output unit - I had the code there,
you had to take it out to put in your 16... I wonder if that is
causing the problem...
As we use this in AULab, I don't see this as a problem in our code...
I also presume that the input that you are providing to the output
unit is 2 channels?
On Feb 24, 2009, at 4:42 PM, Bob Ingraham wrote:
> Thanks!
>
> However, when I implement this code, I get a segmentation fault in
> one of the threads:
>
> Program received signal EXC_BAD_ACCESS, Could not access memory.
> Reason: KERN_INVALID_ADDRESS at address: 0x2e445107
> [Switching to process 12746 thread 0x7103]
> 0x90cfa76c in StereoInterleave32_X86 ()
> (gdb) bt
> #0 0x90cfa76c in StereoInterleave32_X86 ()
> #1 0x90bdeaa2 in CBRConverter::RenderOutput ()
> #2 0x90bde7dc in BufferedAudioConverter::FillBuffer ()
> #3 0x90bde964 in AudioConverterChain::RenderOutput ()
> #4 0x90bde7dc in BufferedAudioConverter::FillBuffer ()
> #5 0x90bf5b73 in AudioConverterFillComplexBuffer ()
> #6 0x700124ff in AUGenericOutputEntry ()
> #7 0x90f2115b in HP_IOProc::Call ()
> #8 0x90f20e4c in IOA_Device::CallIOProcs ()
> #9 0x90f20d28 in HP_IOThread::PerformIO ()
> #10 0x90f1f103 in HP_IOThread::WorkLoop ()
> #11 0x90f1ec27 in HP_IOThread::ThreadEntry ()
> #12 0x90f0f464 in CAPThread::Entry ()
> #13 0x9101f095 in _pthread_start ()
> #14 0x9101ef52 in thread_start ()
> (gdb) info threads
> * 4 process 12746 thread 0x7103 0x90cfa76c in
> StereoInterleave32_X86 ()
> 3 process 12746 thread 0x6f13 0x90ff53ae in __semwait_signal ()
> 2 process 12746 thread 0x5803 0x90fee1c6 in mach_msg_trap ()
> 1 process 12746 local thread 0x2d03 0x90ff53ae in __semwait_signal
> ()
> (gdb)
>
> Here is the code snippet:
>
> SInt32 *channelMap = NULL;
> //UInt32 numOfChannels = fileFormat.NumberChannels();
> UInt32 numOfChannels = 16; // Number of output device channels
> UInt32 mapSize = numOfChannels * sizeof(SInt32);
> channelMap = (SInt32 *)malloc(mapSize);
> for (i=0; i < numOfChannels; i++)
> {
> channelMap[i] = -1;
> }
> //channelMap[desiredInputChannel] = deviceOutputChannel;
> channelMap[2] = 0;
> channelMap[3] = 1;
> err = AudioUnitSetProperty(auOutput,
> kAudioOutputUnitProperty_ChannelMap, kAudioUnitScope_Input, 0,
> channelMap, mapSize);
>
>
> The AudioUnitSetProperty() returns noErr.
>
> I must be doing something wrong...
>
> ----- Original Message -----
> From: "William Stewart" <email@hidden>
> To: "Bob Ingraham" <email@hidden>
> Cc: "CoreAudio API" <email@hidden>
> Sent: Tuesday, February 24, 2009 4:42:36 PM GMT -07:00 US/Canada
> Mountain
> Subject: Re: Output Channel Selection Redux
>
>
> On Feb 24, 2009, at 2:38 PM, Bob Ingraham wrote:
>
>> Hey All,
>>
>> Thanks for the help thus far!
>>
>> But I am just hitting a brick wall here. I think I'm on the right
>> track with the SimpleSDK PlayFile example I've been modifying, but I
>> just can't past the channel select problem using
>> kAudioOutputUnitProperty_ChannelMap.
>>
>> Any help would be most appreciated...
>>
>
> Here's how we use this property in AULab:
>
> UInt32 numOutputChannels; // the number of channels of the device
> OSStatus result;
> SInt32 *channelMap = NULL;
>
> ca_require_noerr (result = mOutputAU.NumberChannels
> (kAudioUnitScope_Output, 0, numOutputChannels), home);
>
> // this sets the channel map up so that all of the channels are
> marked as unused
> channelMap = new SInt32 [numOutputChannels];
> for (unsigned int i = 0; i < numOutputChannels; ++i)
> channelMap[i] = -1;
>
> //OUR_NUMBER_OF_CHANNELS is the number of channels you are using
> // for AULab, this is the number of output channels of your AULab
> session document
>
> inDeviceChannels is a OUR_NUMBER_OF_CHANNELS sized array
> each entry in this array describe which channel of the device that
> channel fo the document should go to
> if the number is > than the number of device channels, we skip it
> (this is the "unused" part of the AULab output channel config)
>
> for (unsigned int i = 0; i < OUR_NUMBER_OF_CHANNELS ++i) {
> SInt32 chan = inDeviceChannels[i];
> if (chan >= 0 && UInt32(chan) < numOutputChannels)
> channelMap[chan] = i;
> }
>
> // print it out
> #if VERBOSE_DEVICE_CHANS
> printf ("Passed in:\n[");
> for (unsigned int i = 0; i < OUR_NUMBER_OF_CHANNELS; ++i)
> printf ("%d, ", inDeviceChannels[i]);
> printf ("]\n");
> printf ("Setting Device Channels\n\t[");
> for (unsigned int i = 0; i < numOutputChannels; ++i)
> printf ("%d, ", channelMap[i]);
> printf ("]\n");
> #endif
>
> // set it
> ca_require_noerr (result = mOutputAU.SetProperty
> (kAudioOutputUnitProperty_ChannelMap, kAudioUnitScope_Input, 0,
> channelMap, (numOutputChannels * sizeof(SInt32))), home);
>
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Coreaudio-api mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden