2010-03-05 07:05:38 +01:00
|
|
|
/******************************************************************************\
|
|
|
|
* Copyright (c) 2004-2010
|
|
|
|
*
|
|
|
|
* Author(s):
|
|
|
|
* Volker Fischer
|
|
|
|
*
|
|
|
|
******************************************************************************
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify it under
|
|
|
|
* the terms of the GNU General Public License as published by the Free Software
|
|
|
|
* Foundation; either version 2 of the License, or (at your option) any later
|
|
|
|
* version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
|
|
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
|
|
|
* details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License along with
|
|
|
|
* this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
*
|
|
|
|
\******************************************************************************/
|
|
|
|
|
|
|
|
#include "sound.h"
|
|
|
|
|
2010-03-05 21:19:12 +01:00
|
|
|
|
2010-03-09 20:19:10 +01:00
|
|
|
|
|
|
|
|
|
|
|
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
// TODO remove the following code as soon as the Coreaudio is working!!!!
|
|
|
|
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
// TEST Debug functions
|
|
|
|
#include <string.h>
|
|
|
|
void StoreInOutStreamProps ( ComponentInstance in );
|
|
|
|
void StoreAudioStreamBasicDescription ( AudioStreamBasicDescription in, std::string text );
|
|
|
|
static FILE* pFile = fopen ( "test.dat", "w" );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// TEST
|
|
|
|
// allocated to hold buffer data
|
|
|
|
AudioBufferList* theBufferList;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-03-05 21:19:12 +01:00
|
|
|
/* Implementation *************************************************************/
|
|
|
|
void CSound::OpenCoreAudio()
|
|
|
|
{
|
2010-03-09 20:19:10 +01:00
|
|
|
UInt32 size;
|
|
|
|
ComponentResult err;
|
|
|
|
|
|
|
|
// open the default unit
|
|
|
|
ComponentDescription desc;
|
2010-03-05 21:19:12 +01:00
|
|
|
desc.componentType = kAudioUnitType_Output;
|
2010-03-09 20:19:10 +01:00
|
|
|
desc.componentSubType = kAudioUnitSubType_HALOutput;
|
|
|
|
desc.componentManufacturer = kAudioUnitManufacturer_Apple;
|
2010-03-05 21:19:12 +01:00
|
|
|
desc.componentFlags = 0;
|
|
|
|
desc.componentFlagsMask = 0;
|
|
|
|
|
2010-03-09 20:19:10 +01:00
|
|
|
Component comp = FindNextComponent ( NULL, &desc );
|
2010-03-05 21:19:12 +01:00
|
|
|
if ( comp == NULL )
|
|
|
|
{
|
|
|
|
throw CGenErr ( tr ( "No CoreAudio next component found" ) );
|
|
|
|
}
|
|
|
|
|
2010-03-10 22:40:47 +01:00
|
|
|
if ( OpenAComponent ( comp, &audioInputUnit ) )
|
|
|
|
{
|
|
|
|
throw CGenErr ( tr ( "CoreAudio creating input component instance failed" ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( OpenAComponent ( comp, &audioOutputUnit ) )
|
|
|
|
{
|
|
|
|
throw CGenErr ( tr ( "CoreAudio creating output component instance failed" ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
// we enable input and disable output for input component
|
2010-03-09 21:36:35 +01:00
|
|
|
UInt32 enableIO = 1;
|
2010-03-10 22:40:47 +01:00
|
|
|
err = AudioUnitSetProperty ( audioInputUnit,
|
2010-03-09 20:19:10 +01:00
|
|
|
kAudioOutputUnitProperty_EnableIO,
|
|
|
|
kAudioUnitScope_Input,
|
|
|
|
1, // input element
|
|
|
|
&enableIO,
|
|
|
|
sizeof ( enableIO ) );
|
|
|
|
|
2010-03-09 21:36:35 +01:00
|
|
|
enableIO = 0;
|
2010-03-10 22:40:47 +01:00
|
|
|
err = AudioUnitSetProperty ( audioInputUnit,
|
2010-03-09 20:19:10 +01:00
|
|
|
kAudioOutputUnitProperty_EnableIO,
|
|
|
|
kAudioUnitScope_Output,
|
|
|
|
0, // output element
|
|
|
|
&enableIO,
|
|
|
|
sizeof ( enableIO ) );
|
|
|
|
|
2010-03-10 22:40:47 +01:00
|
|
|
// set input device
|
|
|
|
size = sizeof ( AudioDeviceID );
|
|
|
|
AudioDeviceID inputDevice;
|
|
|
|
if ( AudioHardwareGetProperty ( kAudioHardwarePropertyDefaultInputDevice,
|
|
|
|
&size,
|
|
|
|
&inputDevice ) )
|
|
|
|
{
|
|
|
|
throw CGenErr ( tr ( "CoreAudio input AudioHardwareGetProperty call failed" ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( AudioUnitSetProperty ( audioInputUnit,
|
|
|
|
kAudioOutputUnitProperty_CurrentDevice,
|
|
|
|
kAudioUnitScope_Global,
|
|
|
|
1,
|
|
|
|
&inputDevice,
|
|
|
|
sizeof ( inputDevice ) ) )
|
|
|
|
{
|
|
|
|
throw CGenErr ( tr ( "CoreAudio input AudioUnitSetProperty call failed" ) );
|
|
|
|
}
|
|
|
|
|
2010-03-09 21:36:35 +01:00
|
|
|
// set up a callback function for new input data
|
2010-03-05 21:19:12 +01:00
|
|
|
AURenderCallbackStruct input;
|
2010-03-10 22:40:47 +01:00
|
|
|
input.inputProc = processInput;
|
2010-03-05 21:19:12 +01:00
|
|
|
input.inputProcRefCon = this;
|
|
|
|
|
2010-03-10 22:40:47 +01:00
|
|
|
if ( AudioUnitSetProperty ( audioInputUnit,
|
2010-03-11 08:03:04 +01:00
|
|
|
kAudioOutputUnitProperty_SetInputCallback,
|
2010-03-09 20:19:10 +01:00
|
|
|
kAudioUnitScope_Global,
|
2010-03-05 21:19:12 +01:00
|
|
|
0,
|
|
|
|
&input,
|
2010-03-09 20:19:10 +01:00
|
|
|
sizeof ( input ) ) )
|
2010-03-05 21:19:12 +01:00
|
|
|
{
|
|
|
|
throw CGenErr ( tr ( "CoreAudio audio unit set property failed" ) );
|
|
|
|
}
|
|
|
|
|
2010-03-10 22:40:47 +01:00
|
|
|
// set output device
|
2010-03-09 20:19:10 +01:00
|
|
|
size = sizeof ( AudioDeviceID );
|
2010-03-10 22:40:47 +01:00
|
|
|
AudioDeviceID outputDevice;
|
|
|
|
if ( AudioHardwareGetProperty ( kAudioHardwarePropertyDefaultOutputDevice,
|
2010-03-09 20:19:10 +01:00
|
|
|
&size,
|
2010-03-10 22:40:47 +01:00
|
|
|
&outputDevice ) )
|
2010-03-09 20:19:10 +01:00
|
|
|
{
|
2010-03-10 22:40:47 +01:00
|
|
|
throw CGenErr ( tr ( "CoreAudio output AudioHardwareGetProperty call failed" ) );
|
2010-03-09 20:19:10 +01:00
|
|
|
}
|
2010-03-05 21:19:12 +01:00
|
|
|
|
2010-03-10 22:40:47 +01:00
|
|
|
if ( AudioUnitSetProperty ( audioOutputUnit,
|
2010-03-09 20:19:10 +01:00
|
|
|
kAudioOutputUnitProperty_CurrentDevice,
|
|
|
|
kAudioUnitScope_Global,
|
|
|
|
0,
|
2010-03-10 22:40:47 +01:00
|
|
|
&outputDevice,
|
|
|
|
sizeof ( outputDevice ) ) )
|
2010-03-09 20:19:10 +01:00
|
|
|
{
|
2010-03-10 22:40:47 +01:00
|
|
|
throw CGenErr ( tr ( "CoreAudio output AudioUnitSetProperty call failed" ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
// set up a callback function for new output data
|
|
|
|
AURenderCallbackStruct output;
|
|
|
|
output.inputProc = processOutput;
|
|
|
|
output.inputProcRefCon = this;
|
|
|
|
|
|
|
|
if ( AudioUnitSetProperty ( audioOutputUnit,
|
2010-03-11 08:03:04 +01:00
|
|
|
kAudioUnitProperty_SetRenderCallback,
|
2010-03-10 22:40:47 +01:00
|
|
|
kAudioUnitScope_Global,
|
|
|
|
0,
|
|
|
|
&output,
|
|
|
|
sizeof ( output ) ) )
|
|
|
|
{
|
|
|
|
throw CGenErr ( tr ( "CoreAudio audio unit set property failed" ) );
|
2010-03-09 20:19:10 +01:00
|
|
|
}
|
2010-03-05 21:19:12 +01:00
|
|
|
|
2010-03-05 22:18:11 +01:00
|
|
|
// set up stream format
|
|
|
|
AudioStreamBasicDescription streamFormat;
|
|
|
|
streamFormat.mSampleRate = SYSTEM_SAMPLE_RATE;
|
|
|
|
streamFormat.mFormatID = kAudioFormatLinearPCM;
|
|
|
|
streamFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger;
|
2010-03-09 20:19:10 +01:00
|
|
|
streamFormat.mFramesPerPacket = 1;
|
|
|
|
streamFormat.mBytesPerFrame = 4;
|
|
|
|
streamFormat.mBytesPerPacket = 4;
|
2010-03-05 22:18:11 +01:00
|
|
|
streamFormat.mChannelsPerFrame = 2; // stereo
|
|
|
|
streamFormat.mBitsPerChannel = 16;
|
2010-03-09 20:19:10 +01:00
|
|
|
|
|
|
|
// our output
|
2010-03-10 22:40:47 +01:00
|
|
|
if ( AudioUnitSetProperty ( audioOutputUnit,
|
2010-03-05 22:18:11 +01:00
|
|
|
kAudioUnitProperty_StreamFormat,
|
|
|
|
kAudioUnitScope_Input,
|
|
|
|
0,
|
|
|
|
&streamFormat,
|
|
|
|
sizeof(streamFormat) ) )
|
|
|
|
{
|
|
|
|
throw CGenErr ( tr ( "CoreAudio stream format set property failed" ) );
|
|
|
|
}
|
2010-03-05 21:19:12 +01:00
|
|
|
|
2010-03-09 20:19:10 +01:00
|
|
|
// our input
|
2010-03-10 22:40:47 +01:00
|
|
|
if ( AudioUnitSetProperty ( audioInputUnit,
|
2010-03-09 20:19:10 +01:00
|
|
|
kAudioUnitProperty_StreamFormat,
|
|
|
|
kAudioUnitScope_Output,
|
|
|
|
1,
|
|
|
|
&streamFormat,
|
|
|
|
sizeof(streamFormat) ) )
|
|
|
|
{
|
|
|
|
throw CGenErr ( tr ( "CoreAudio stream format set property failed" ) );
|
|
|
|
}
|
|
|
|
|
2010-03-11 08:03:04 +01:00
|
|
|
// check input device sample rate
|
|
|
|
size = sizeof ( Float64 );
|
|
|
|
Float64 inputSampleRate;
|
|
|
|
AudioUnitGetProperty ( audioInputUnit,
|
|
|
|
kAudioUnitProperty_SampleRate,
|
|
|
|
kAudioUnitScope_Input,
|
|
|
|
1,
|
|
|
|
&inputSampleRate,
|
|
|
|
&size );
|
|
|
|
|
|
|
|
if ( static_cast<int> ( inputSampleRate ) != SYSTEM_SAMPLE_RATE )
|
|
|
|
{
|
2010-03-11 19:33:56 +01:00
|
|
|
throw CGenErr ( QString ( tr ( "Current system audio input device sample "
|
|
|
|
"rate of %1 Hz is not supported. Please open the Audio-MIDI-Setup in "
|
|
|
|
"Applications->Utilities and try to set a sample rate of %2 Hz." ) ).arg (
|
|
|
|
static_cast<int> ( inputSampleRate ) ).arg ( SYSTEM_SAMPLE_RATE ) );
|
2010-03-11 08:03:04 +01:00
|
|
|
}
|
2010-03-09 20:19:10 +01:00
|
|
|
|
2010-03-11 08:03:04 +01:00
|
|
|
// check output device sample rate
|
|
|
|
size = sizeof ( Float64 );
|
|
|
|
Float64 outputSampleRate;
|
|
|
|
AudioUnitGetProperty ( audioOutputUnit,
|
|
|
|
kAudioUnitProperty_SampleRate,
|
|
|
|
kAudioUnitScope_Output,
|
|
|
|
0,
|
|
|
|
&outputSampleRate,
|
|
|
|
&size );
|
2010-03-11 19:33:56 +01:00
|
|
|
|
2010-03-11 08:03:04 +01:00
|
|
|
if ( static_cast<int> ( outputSampleRate ) != SYSTEM_SAMPLE_RATE )
|
|
|
|
{
|
2010-03-11 19:33:56 +01:00
|
|
|
throw CGenErr ( QString ( tr ( "Current system audio output device sample "
|
|
|
|
"rate of %1 Hz is not supported. Please open the Audio-MIDI-Setup in "
|
|
|
|
"Applications->Utilities and try to set a sample rate of %2 Hz." ) ).arg (
|
|
|
|
static_cast<int> ( outputSampleRate ) ).arg ( SYSTEM_SAMPLE_RATE ) );
|
2010-03-11 08:03:04 +01:00
|
|
|
}
|
2010-03-10 07:35:49 +01:00
|
|
|
|
|
|
|
|
2010-03-09 20:19:10 +01:00
|
|
|
// TEST
|
2010-03-10 22:40:47 +01:00
|
|
|
StoreInOutStreamProps ( audioInputUnit );
|
|
|
|
StoreInOutStreamProps ( audioOutputUnit );
|
2010-03-09 20:19:10 +01:00
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void CSound::CloseCoreAudio()
|
|
|
|
{
|
|
|
|
// clean up "gOutputUnit"
|
2010-03-10 22:40:47 +01:00
|
|
|
AudioUnitUninitialize ( audioInputUnit );
|
|
|
|
AudioUnitUninitialize ( audioOutputUnit );
|
|
|
|
CloseComponent ( audioInputUnit );
|
|
|
|
CloseComponent ( audioOutputUnit );
|
2010-03-09 20:19:10 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void CSound::Start()
|
|
|
|
{
|
|
|
|
// start the rendering
|
2010-03-10 22:40:47 +01:00
|
|
|
AudioOutputUnitStart ( audioInputUnit );
|
|
|
|
AudioOutputUnitStart ( audioOutputUnit );
|
2010-03-09 20:19:10 +01:00
|
|
|
|
|
|
|
// call base class
|
|
|
|
CSoundBase::Start();
|
|
|
|
}
|
|
|
|
|
|
|
|
void CSound::Stop()
|
|
|
|
{
|
|
|
|
// stop the audio stream
|
2010-03-10 22:40:47 +01:00
|
|
|
AudioOutputUnitStop ( audioInputUnit );
|
|
|
|
AudioOutputUnitStop ( audioOutputUnit );
|
2010-03-09 20:19:10 +01:00
|
|
|
|
|
|
|
// call base class
|
|
|
|
CSoundBase::Stop();
|
|
|
|
}
|
|
|
|
|
|
|
|
int CSound::Init ( const int iNewPrefMonoBufferSize )
|
|
|
|
{
|
2010-03-10 07:35:49 +01:00
|
|
|
|
|
|
|
// TODO try to set the preferred buffer size to the audio unit
|
|
|
|
|
|
|
|
// get the audio unit buffer size
|
|
|
|
UInt32 bufferSizeFrames;
|
|
|
|
UInt32 propertySize = sizeof(UInt32);
|
2010-03-10 22:40:47 +01:00
|
|
|
|
|
|
|
|
|
|
|
// TEST
|
|
|
|
AudioUnitGetProperty ( audioOutputUnit, kAudioDevicePropertyBufferFrameSize,
|
|
|
|
kAudioUnitScope_Global, 1, &bufferSizeFrames, &propertySize );
|
|
|
|
printf("out buf size: %d\n",bufferSizeFrames);
|
|
|
|
|
|
|
|
AudioUnitGetProperty ( audioInputUnit, kAudioDevicePropertyBufferFrameSize,
|
2010-03-10 07:35:49 +01:00
|
|
|
kAudioUnitScope_Global, 1, &bufferSizeFrames, &propertySize );
|
2010-03-09 20:19:10 +01:00
|
|
|
|
2010-03-10 07:35:49 +01:00
|
|
|
// store buffer size
|
|
|
|
iCoreAudioBufferSizeMono = bufferSizeFrames;
|
2010-03-09 20:19:10 +01:00
|
|
|
|
2010-03-10 07:35:49 +01:00
|
|
|
// init base class
|
|
|
|
CSoundBase::Init ( iCoreAudioBufferSizeMono );
|
|
|
|
|
|
|
|
// set internal buffer size value and calculate stereo buffer size
|
|
|
|
iCoreAudioBufferSizeStero = 2 * iCoreAudioBufferSizeMono;
|
|
|
|
|
|
|
|
// create memory for intermediate audio buffer
|
|
|
|
vecsTmpAudioSndCrdStereo.Init ( iCoreAudioBufferSizeStero );
|
2010-03-09 20:19:10 +01:00
|
|
|
|
2010-03-10 07:35:49 +01:00
|
|
|
|
2010-03-09 20:19:10 +01:00
|
|
|
// TEST
|
2010-03-10 07:35:49 +01:00
|
|
|
printf ( "Buffer_Size: %d", (int) bufferSizeFrames );
|
2010-03-09 20:19:10 +01:00
|
|
|
|
2010-03-10 07:35:49 +01:00
|
|
|
|
|
|
|
// TODO
|
|
|
|
// fill audio unit buffer struct
|
|
|
|
theBufferList = (AudioBufferList*) malloc ( offsetof ( AudioBufferList,
|
|
|
|
mBuffers[0] ) + sizeof(AudioBuffer) );
|
2010-03-09 20:19:10 +01:00
|
|
|
|
2010-03-10 22:40:47 +01:00
|
|
|
//(sizeof(AudioBufferList) + (numChannels-1)) * sizeof(AudioBuffer)
|
|
|
|
|
|
|
|
|
2010-03-10 07:35:49 +01:00
|
|
|
theBufferList->mNumberBuffers = 1;
|
|
|
|
theBufferList->mBuffers[0].mNumberChannels = 2; // stereo
|
|
|
|
theBufferList->mBuffers[0].mDataByteSize = bufferSizeFrames * 4; // 2 bytes, 2 channels
|
2010-03-10 22:40:47 +01:00
|
|
|
theBufferList->mBuffers[0].mData = &vecsTmpAudioSndCrdStereo[0];
|
2010-03-10 07:35:49 +01:00
|
|
|
|
|
|
|
// initialize unit
|
2010-03-10 22:40:47 +01:00
|
|
|
if ( AudioUnitInitialize ( audioInputUnit ) )
|
|
|
|
{
|
|
|
|
throw CGenErr ( tr ( "Initialization of CoreAudio failed" ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( AudioUnitInitialize ( audioOutputUnit ) )
|
2010-03-05 22:18:11 +01:00
|
|
|
{
|
|
|
|
throw CGenErr ( tr ( "Initialization of CoreAudio failed" ) );
|
|
|
|
}
|
2010-03-05 21:19:12 +01:00
|
|
|
|
2010-03-10 07:35:49 +01:00
|
|
|
return iCoreAudioBufferSizeMono;
|
2010-03-05 21:19:12 +01:00
|
|
|
}
|
|
|
|
|
2010-03-10 22:40:47 +01:00
|
|
|
OSStatus CSound::processInput ( void* inRefCon,
|
|
|
|
AudioUnitRenderActionFlags* ioActionFlags,
|
|
|
|
const AudioTimeStamp* inTimeStamp,
|
|
|
|
UInt32 inBusNumber,
|
|
|
|
UInt32 inNumberFrames,
|
|
|
|
AudioBufferList* ioData )
|
2010-03-05 21:19:12 +01:00
|
|
|
{
|
|
|
|
CSound* pSound = reinterpret_cast<CSound*> ( inRefCon );
|
2010-03-10 22:40:47 +01:00
|
|
|
|
2010-03-09 20:19:10 +01:00
|
|
|
// get the new audio data
|
2010-03-09 21:36:35 +01:00
|
|
|
ComponentResult err =
|
2010-03-10 22:40:47 +01:00
|
|
|
AudioUnitRender ( pSound->audioInputUnit,
|
2010-03-09 21:36:35 +01:00
|
|
|
ioActionFlags,
|
|
|
|
inTimeStamp,
|
|
|
|
inBusNumber,
|
|
|
|
inNumberFrames,
|
|
|
|
theBufferList );
|
|
|
|
|
2010-03-10 22:40:47 +01:00
|
|
|
// call processing callback function
|
|
|
|
pSound->ProcessCallback ( pSound->vecsTmpAudioSndCrdStereo );
|
2010-03-09 20:19:10 +01:00
|
|
|
|
2010-03-10 22:40:47 +01:00
|
|
|
return noErr;
|
2010-03-09 20:19:10 +01:00
|
|
|
}
|
|
|
|
|
2010-03-10 22:40:47 +01:00
|
|
|
OSStatus CSound::processOutput ( void* inRefCon,
|
|
|
|
AudioUnitRenderActionFlags* ioActionFlags,
|
|
|
|
const AudioTimeStamp* inTimeStamp,
|
|
|
|
UInt32 inBusNumber,
|
|
|
|
UInt32 inNumberFrames,
|
|
|
|
AudioBufferList* ioData )
|
|
|
|
{
|
|
|
|
CSound* pSound = reinterpret_cast<CSound*> ( inRefCon );
|
2010-03-05 21:19:12 +01:00
|
|
|
|
2010-03-10 22:40:47 +01:00
|
|
|
memcpy ( ioData->mBuffers[0].mData,
|
|
|
|
&pSound->vecsTmpAudioSndCrdStereo[0],
|
|
|
|
theBufferList->mBuffers[0].mDataByteSize);
|
2010-03-05 21:19:12 +01:00
|
|
|
|
|
|
|
return noErr;
|
|
|
|
}
|
2010-03-09 20:19:10 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
2010-03-10 22:40:47 +01:00
|
|
|
|
|
|
|
|
2010-03-09 20:19:10 +01:00
|
|
|
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
// TODO remove the following code as soon as the Coreaudio is working!!!!
|
|
|
|
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
// TEST Debug functions
|
|
|
|
void StoreAudioStreamBasicDescription ( AudioStreamBasicDescription in,
|
|
|
|
std::string text )
|
|
|
|
{
|
|
|
|
fprintf ( pFile, "*** AudioStreamBasicDescription: %s***\n", text.c_str() );
|
|
|
|
fprintf ( pFile, "mSampleRate: %e\n", in.mSampleRate );
|
|
|
|
fprintf ( pFile, "mFormatID: %d\n", (int) in.mFormatID );
|
|
|
|
fprintf ( pFile, "mFormatFlags: %d\n", (int) in.mFormatFlags );
|
|
|
|
fprintf ( pFile, "mFramesPerPacket: %d\n", (int) in.mFramesPerPacket );
|
|
|
|
fprintf ( pFile, "mBytesPerFrame: %d\n", (int) in.mBytesPerFrame );
|
|
|
|
fprintf ( pFile, "mBytesPerPacket: %d\n", (int) in.mBytesPerPacket );
|
|
|
|
fprintf ( pFile, "mChannelsPerFrame: %d\n", (int) in.mChannelsPerFrame );
|
|
|
|
fprintf ( pFile, "mBitsPerChannel: %d\n", (int) in.mBitsPerChannel );
|
|
|
|
// fprintf ( pFile, "mReserved %d\n", in.mReserved );
|
|
|
|
fflush ( pFile );
|
|
|
|
}
|
|
|
|
|
|
|
|
void StoreInOutStreamProps ( ComponentInstance in )
|
|
|
|
{
|
|
|
|
// input bus 1
|
|
|
|
AudioStreamBasicDescription DeviceFormatin1;
|
|
|
|
UInt32 size = sizeof ( AudioStreamBasicDescription );
|
|
|
|
AudioUnitGetProperty ( in,
|
|
|
|
kAudioUnitProperty_StreamFormat,
|
|
|
|
kAudioUnitScope_Input,
|
|
|
|
1,
|
|
|
|
&DeviceFormatin1,
|
|
|
|
&size );
|
|
|
|
StoreAudioStreamBasicDescription ( DeviceFormatin1, "Input Bus 1" );
|
|
|
|
|
|
|
|
// output bus 1
|
|
|
|
AudioStreamBasicDescription DeviceFormatout1;
|
|
|
|
size = sizeof ( AudioStreamBasicDescription );
|
|
|
|
AudioUnitGetProperty ( in,
|
|
|
|
kAudioUnitProperty_StreamFormat,
|
|
|
|
kAudioUnitScope_Output,
|
|
|
|
1,
|
|
|
|
&DeviceFormatout1,
|
|
|
|
&size );
|
|
|
|
StoreAudioStreamBasicDescription ( DeviceFormatout1, "Output Bus 1" );
|
|
|
|
|
|
|
|
// input bus 0
|
|
|
|
AudioStreamBasicDescription DeviceFormatin0;
|
|
|
|
size = sizeof ( AudioStreamBasicDescription );
|
|
|
|
AudioUnitGetProperty ( in,
|
|
|
|
kAudioUnitProperty_StreamFormat,
|
|
|
|
kAudioUnitScope_Input,
|
|
|
|
0,
|
|
|
|
&DeviceFormatin0,
|
|
|
|
&size );
|
|
|
|
StoreAudioStreamBasicDescription ( DeviceFormatin0, "Input Bus 0" );
|
|
|
|
|
|
|
|
// output bus 0
|
|
|
|
AudioStreamBasicDescription DeviceFormatout0;
|
|
|
|
size = sizeof ( AudioStreamBasicDescription );
|
|
|
|
AudioUnitGetProperty ( in,
|
|
|
|
kAudioUnitProperty_StreamFormat,
|
|
|
|
kAudioUnitScope_Output,
|
|
|
|
0,
|
|
|
|
&DeviceFormatout0,
|
|
|
|
&size );
|
|
|
|
StoreAudioStreamBasicDescription ( DeviceFormatout0, "Output Bus 0" );
|
|
|
|
}
|