Remove, again.
This commit is contained in:
@@ -1,990 +0,0 @@
|
||||
/* Copyright: © Copyright 2003 Apple Computer, Inc. All rights reserved.
|
||||
|
||||
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc.
|
||||
("Apple") in consideration of your agreement to the following terms, and your
|
||||
use, installation, modification or redistribution of this Apple software
|
||||
constitutes acceptance of these terms. If you do not agree with these terms,
|
||||
please do not use, install, modify or redistribute this Apple software.
|
||||
|
||||
In consideration of your agreement to abide by the following terms, and subject
|
||||
to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs
|
||||
copyrights in this original Apple software (the "Apple Software"), to use,
|
||||
reproduce, modify and redistribute the Apple Software, with or without
|
||||
modifications, in source and/or binary forms; provided that if you redistribute
|
||||
the Apple Software in its entirety and without modifications, you must retain
|
||||
this notice and the following text and disclaimers in all such redistributions of
|
||||
the Apple Software. Neither the name, trademarks, service marks or logos of
|
||||
Apple Computer, Inc. may be used to endorse or promote products derived from the
|
||||
Apple Software without specific prior written permission from Apple. Except as
|
||||
expressly stated in this notice, no other rights or licenses, express or implied,
|
||||
are granted by Apple herein, including but not limited to any patent rights that
|
||||
may be infringed by your derivative works or by other works in which the Apple
|
||||
Software may be incorporated.
|
||||
|
||||
The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO
|
||||
WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
|
||||
WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN
|
||||
COMBINATION WITH YOUR PRODUCTS.
|
||||
|
||||
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION
|
||||
OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT
|
||||
(INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN
|
||||
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
/*=============================================================================
|
||||
CAAudioHardwareDevice.cpp
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
//=============================================================================
|
||||
// Includes
|
||||
//=============================================================================
|
||||
|
||||
// Self Include
|
||||
#include "CAAudioHardwareDevice.h"
|
||||
|
||||
// Internal Includes
|
||||
#include "CAAudioHardwareStream.h"
|
||||
|
||||
// PublicUtility Includes
|
||||
#include "CAAutoDisposer.h"
|
||||
#include "CADebugMacros.h"
|
||||
#include "CAException.h"
|
||||
|
||||
// System Includes
|
||||
#include <IOKit/audio/IOAudioTypes.h>
|
||||
#include <unistd.h>
|
||||
|
||||
// Standard Library Includes
|
||||
#include <algorithm>
|
||||
|
||||
//=============================================================================
|
||||
// CAAudioHardwareDevice
|
||||
//=============================================================================
|
||||
|
||||
CAAudioHardwareDevice::CAAudioHardwareDevice(AudioDeviceID inAudioDeviceID)
|
||||
:
|
||||
mAudioDeviceID(inAudioDeviceID)
|
||||
{
|
||||
}
|
||||
|
||||
CAAudioHardwareDevice::~CAAudioHardwareDevice()
|
||||
{
|
||||
}
|
||||
|
||||
CFStringRef CAAudioHardwareDevice::CopyName() const
|
||||
{
|
||||
CFStringRef theAnswer = NULL;
|
||||
try
|
||||
{
|
||||
UInt32 theSize = sizeof(CFStringRef);
|
||||
GetPropertyData(0, kAudioDeviceSectionGlobal, kAudioDevicePropertyDeviceNameCFString, theSize, &theAnswer);
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
// Sometimes a device doesn't have a name. Rather than throw an exception here
|
||||
// it is better for the rest of the code if it just return an empty string.
|
||||
// At some point, this should probably go back to throwing an exception.
|
||||
theAnswer = CFSTR("");
|
||||
}
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
CFStringRef CAAudioHardwareDevice::CopyManufacturer() const
|
||||
{
|
||||
CFStringRef theAnswer = NULL;
|
||||
UInt32 theSize = sizeof(CFStringRef);
|
||||
GetPropertyData(0, kAudioDeviceSectionGlobal, kAudioDevicePropertyDeviceManufacturerCFString, theSize, &theAnswer);
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
CFStringRef CAAudioHardwareDevice::CopyUID() const
|
||||
{
|
||||
CFStringRef theAnswer = NULL;
|
||||
UInt32 theSize = sizeof(CFStringRef);
|
||||
GetPropertyData(0, kAudioDeviceSectionGlobal, kAudioDevicePropertyDeviceUID, theSize, &theAnswer);
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
CFStringRef CAAudioHardwareDevice::CopyConfigurationApplicationBundleID() const
|
||||
{
|
||||
CFStringRef theAnswer = NULL;
|
||||
UInt32 theSize = sizeof(CFStringRef);
|
||||
GetPropertyData(0, kAudioDeviceSectionGlobal, kAudioDevicePropertyConfigurationApplication, theSize, &theAnswer);
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
UInt32 CAAudioHardwareDevice::GetTransportType() const
|
||||
{
|
||||
UInt32 theAnswer = 0;
|
||||
UInt32 theSize = sizeof(UInt32);
|
||||
GetPropertyData(0, kAudioDeviceSectionGlobal, kAudioDevicePropertyTransportType, theSize, &theAnswer);
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
bool CAAudioHardwareDevice::CanBeDefaultDevice(CAAudioHardwareDeviceSectionID inSection, bool inIsSystem) const
|
||||
{
|
||||
UInt32 theAnswer = 0;
|
||||
UInt32 theSize = sizeof(UInt32);
|
||||
AudioHardwarePropertyID thePropertyID = inIsSystem ? kAudioDevicePropertyDeviceCanBeDefaultSystemDevice : kAudioDevicePropertyDeviceCanBeDefaultDevice;
|
||||
GetPropertyData(0, inSection, thePropertyID, theSize, &theAnswer);
|
||||
return theAnswer != 0;
|
||||
}
|
||||
|
||||
bool CAAudioHardwareDevice::HasDevicePlugInStatus() const
|
||||
{
|
||||
return HasProperty(0, kAudioDeviceSectionGlobal, kAudioDevicePropertyPlugIn);
|
||||
}
|
||||
|
||||
OSStatus CAAudioHardwareDevice::GetDevicePlugInStatus() const
|
||||
{
|
||||
OSStatus theAnswer = 0;
|
||||
UInt32 theSize = sizeof(OSStatus);
|
||||
GetPropertyData(0, kAudioDeviceSectionGlobal, kAudioDevicePropertyPlugIn, theSize, &theAnswer);
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
bool CAAudioHardwareDevice::IsAlive() const
|
||||
{
|
||||
bool theAnswer = HasProperty(0, kAudioDeviceSectionGlobal, kAudioDevicePropertyDeviceIsAlive);
|
||||
if(theAnswer)
|
||||
{
|
||||
UInt32 isAlive = 0;
|
||||
UInt32 theSize = sizeof(UInt32);
|
||||
GetPropertyData(0, kAudioDeviceSectionGlobal, kAudioDevicePropertyDeviceIsAlive, theSize, &isAlive);
|
||||
theAnswer = isAlive != 0;
|
||||
}
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
bool CAAudioHardwareDevice::IsRunning() const
|
||||
{
|
||||
UInt32 theAnswer = 0;
|
||||
UInt32 theSize = sizeof(UInt32);
|
||||
GetPropertyData(0, kAudioDeviceSectionGlobal, kAudioDevicePropertyDeviceIsRunning, theSize, &theAnswer);
|
||||
return theAnswer != 0;
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::SetIsRunning(bool inIsRunning)
|
||||
{
|
||||
UInt32 theValue = inIsRunning ? 1 : 0;
|
||||
UInt32 theSize = sizeof(UInt32);
|
||||
SetPropertyData(0, kAudioDeviceSectionGlobal, kAudioDevicePropertyDeviceIsRunning, theSize, &theValue);
|
||||
}
|
||||
|
||||
bool CAAudioHardwareDevice::IsRunningSomewhere() const
|
||||
{
|
||||
UInt32 theAnswer = 0;
|
||||
UInt32 theSize = sizeof(UInt32);
|
||||
GetPropertyData(0, kAudioDeviceSectionGlobal, kAudioDevicePropertyDeviceIsRunningSomewhere, theSize, &theAnswer);
|
||||
return theAnswer != 0;
|
||||
}
|
||||
|
||||
pid_t CAAudioHardwareDevice::GetHogModeOwner() const
|
||||
{
|
||||
pid_t theAnswer = 0;
|
||||
UInt32 theSize = sizeof(pid_t);
|
||||
GetPropertyData(0, kAudioDeviceSectionGlobal, kAudioDevicePropertyHogMode, theSize, &theAnswer);
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
bool CAAudioHardwareDevice::TakeHogMode()
|
||||
{
|
||||
pid_t thePID = 0;
|
||||
UInt32 theSize = sizeof(pid_t);
|
||||
SetPropertyData(0, kAudioDeviceSectionGlobal, kAudioDevicePropertyHogMode, theSize, &thePID);
|
||||
return thePID == getpid();
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::ReleaseHogMode()
|
||||
{
|
||||
pid_t thePID = -1;
|
||||
UInt32 theSize = sizeof(pid_t);
|
||||
SetPropertyData(0, kAudioDeviceSectionGlobal, kAudioDevicePropertyHogMode, theSize, &thePID);
|
||||
}
|
||||
|
||||
bool CAAudioHardwareDevice::SupportsChangingMixability() const
|
||||
{
|
||||
bool theAnswer = HasProperty(0, kAudioDeviceSectionGlobal, kAudioDevicePropertySupportsMixing);
|
||||
if(theAnswer)
|
||||
{
|
||||
theAnswer = PropertyIsSettable(0, kAudioDeviceSectionGlobal, kAudioDevicePropertySupportsMixing);
|
||||
}
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
bool CAAudioHardwareDevice::IsMixable() const
|
||||
{
|
||||
UInt32 theAnswer = 1;
|
||||
if(HasProperty(0, kAudioDeviceSectionGlobal, kAudioDevicePropertySupportsMixing))
|
||||
{
|
||||
UInt32 theSize = sizeof(UInt32);
|
||||
GetPropertyData(0, kAudioDeviceSectionGlobal, kAudioDevicePropertySupportsMixing, theSize, &theAnswer);
|
||||
}
|
||||
return theAnswer != 0;
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::SetIsMixable(bool inIsMixable)
|
||||
{
|
||||
UInt32 theValue = inIsMixable ? 1 : 0;
|
||||
UInt32 theSize = sizeof(UInt32);
|
||||
SetPropertyData(0, kAudioDeviceSectionGlobal, kAudioDevicePropertySupportsMixing, theSize, &theValue);
|
||||
}
|
||||
|
||||
bool CAAudioHardwareDevice::HasIsConnectedStatus(CAAudioHardwareDeviceSectionID inSection) const
|
||||
{
|
||||
return HasProperty(0, inSection, kAudioDevicePropertyJackIsConnected);
|
||||
}
|
||||
|
||||
bool CAAudioHardwareDevice::GetIsConnectedStatus(CAAudioHardwareDeviceSectionID inSection) const
|
||||
{
|
||||
UInt32 theAnswer = 0;
|
||||
UInt32 theSize = sizeof(UInt32);
|
||||
GetPropertyData(0, inSection, kAudioDevicePropertyJackIsConnected, theSize, &theAnswer);
|
||||
return theAnswer != 0;
|
||||
}
|
||||
|
||||
bool CAAudioHardwareDevice::HasPreferredStereoChannels(CAAudioHardwareDeviceSectionID inSection) const
|
||||
{
|
||||
return HasProperty(0, inSection, kAudioDevicePropertyPreferredChannelsForStereo);
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::GetPreferredStereoChannels(CAAudioHardwareDeviceSectionID inSection, UInt32& outLeft, UInt32& outRight) const
|
||||
{
|
||||
UInt32 theStereoPair[2] = { 0, 0 };
|
||||
UInt32 theSize = 2 * sizeof(UInt32);
|
||||
GetPropertyData(0, inSection, kAudioDevicePropertyPreferredChannelsForStereo, theSize, theStereoPair);
|
||||
outLeft = theStereoPair[0];
|
||||
outRight = theStereoPair[1];
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::SetPreferredStereoChannels(CAAudioHardwareDeviceSectionID inSection, UInt32 inLeft, UInt32 inRight)
|
||||
{
|
||||
UInt32 theStereoPair[2] = { inLeft, inRight };
|
||||
UInt32 theSize = 2 * sizeof(UInt32);
|
||||
SetPropertyData(0, inSection, kAudioDevicePropertyPreferredChannelsForStereo, theSize, theStereoPair);
|
||||
}
|
||||
|
||||
UInt32 CAAudioHardwareDevice::GetLatency(CAAudioHardwareDeviceSectionID inSection) const
|
||||
{
|
||||
UInt32 theAnswer = 0;
|
||||
UInt32 theSize = sizeof(UInt32);
|
||||
GetPropertyData(0, inSection, kAudioDevicePropertyLatency, theSize, &theAnswer);
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
UInt32 CAAudioHardwareDevice::GetSafetyOffset(CAAudioHardwareDeviceSectionID inSection) const
|
||||
{
|
||||
UInt32 theAnswer = 0;
|
||||
UInt32 theSize = sizeof(UInt32);
|
||||
GetPropertyData(0, inSection, kAudioDevicePropertySafetyOffset, theSize, &theAnswer);
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
bool CAAudioHardwareDevice::HasClockSourceControl() const
|
||||
{
|
||||
return HasProperty(0, kAudioDeviceSectionGlobal, kAudioDevicePropertyClockSource);
|
||||
}
|
||||
|
||||
bool CAAudioHardwareDevice::ClockSourceControlIsSettable() const
|
||||
{
|
||||
return PropertyIsSettable(0, kAudioDeviceSectionGlobal, kAudioDevicePropertyClockSource);
|
||||
}
|
||||
|
||||
UInt32 CAAudioHardwareDevice::GetCurrentClockSourceID() const
|
||||
{
|
||||
UInt32 theAnswer = 0;
|
||||
UInt32 theSize = sizeof(UInt32);
|
||||
GetPropertyData(0, kAudioDeviceSectionGlobal, kAudioDevicePropertyClockSource, theSize, &theAnswer);
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::SetCurrentClockSourceByID(UInt32 inID)
|
||||
{
|
||||
UInt32 theSize = sizeof(UInt32);
|
||||
SetPropertyData(0, kAudioDeviceSectionGlobal, kAudioDevicePropertyClockSource, theSize, &inID);
|
||||
}
|
||||
|
||||
UInt32 CAAudioHardwareDevice::GetNumberAvailableClockSources() const
|
||||
{
|
||||
UInt32 theAnswer = 0;
|
||||
if(HasClockSourceControl())
|
||||
{
|
||||
UInt32 theSize = GetPropertyDataSize(0, kAudioDeviceSectionGlobal, kAudioDevicePropertyClockSources);
|
||||
theAnswer = theSize / sizeof(UInt32);
|
||||
}
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
UInt32 CAAudioHardwareDevice::GetAvailableClockSourceByIndex(UInt32 inIndex) const
|
||||
{
|
||||
AudioStreamID theAnswer = 0;
|
||||
UInt32 theNumberSources = GetNumberAvailableClockSources();
|
||||
if((theNumberSources > 0) && (inIndex < theNumberSources))
|
||||
{
|
||||
CAAutoArrayDelete<UInt32> theSourceList(theNumberSources);
|
||||
GetAvailableClockSources(theNumberSources, theSourceList);
|
||||
theAnswer = theSourceList[inIndex];
|
||||
}
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::GetAvailableClockSources(UInt32& ioNumberSources, UInt32* outSources) const
|
||||
{
|
||||
UInt32 theNumberSources = std::min(GetNumberAvailableClockSources(), ioNumberSources);
|
||||
UInt32 theSize = theNumberSources * sizeof(UInt32);
|
||||
GetPropertyData(0, kAudioDeviceSectionGlobal, kAudioDevicePropertyClockSources, theSize, outSources);
|
||||
ioNumberSources = theSize / sizeof(UInt32);
|
||||
UInt32* theFirstItem = &(outSources[0]);
|
||||
UInt32* theLastItem = theFirstItem + ioNumberSources;
|
||||
std::sort(theFirstItem, theLastItem);
|
||||
}
|
||||
|
||||
CFStringRef CAAudioHardwareDevice::CopyClockSourceNameForID(UInt32 inID) const
|
||||
{
|
||||
CFStringRef theAnswer = NULL;
|
||||
AudioValueTranslation theTranslation = { &inID, sizeof(UInt32), &theAnswer, sizeof(CFStringRef) };
|
||||
UInt32 theSize = sizeof(AudioValueTranslation);
|
||||
GetPropertyData(0, kAudioDeviceSectionGlobal, kAudioDevicePropertyClockSourceNameForIDCFString, theSize, &theTranslation);
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
bool CAAudioHardwareDevice::HasDataSourceControl(CAAudioHardwareDeviceSectionID inSection) const
|
||||
{
|
||||
return HasProperty(0, inSection, kAudioDevicePropertyDataSource);
|
||||
}
|
||||
|
||||
bool CAAudioHardwareDevice::DataSourceControlIsSettable(CAAudioHardwareDeviceSectionID inSection) const
|
||||
{
|
||||
return PropertyIsSettable(0, inSection, kAudioDevicePropertyDataSource);
|
||||
}
|
||||
|
||||
UInt32 CAAudioHardwareDevice::GetCurrentDataSourceID(CAAudioHardwareDeviceSectionID inSection) const
|
||||
{
|
||||
UInt32 theAnswer = 0;
|
||||
UInt32 theSize = sizeof(UInt32);
|
||||
GetPropertyData(0, inSection, kAudioDevicePropertyDataSource, theSize, &theAnswer);
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::SetCurrentDataSourceByID(CAAudioHardwareDeviceSectionID inSection, UInt32 inID)
|
||||
{
|
||||
UInt32 theSize = sizeof(UInt32);
|
||||
SetPropertyData(0, inSection, kAudioDevicePropertyDataSource, theSize, &inID);
|
||||
}
|
||||
|
||||
UInt32 CAAudioHardwareDevice::GetNumberAvailableDataSources(CAAudioHardwareDeviceSectionID inSection) const
|
||||
{
|
||||
UInt32 theAnswer = 0;
|
||||
if(HasDataSourceControl(inSection))
|
||||
{
|
||||
UInt32 theSize = GetPropertyDataSize(0, inSection, kAudioDevicePropertyDataSources);
|
||||
theAnswer = theSize / sizeof(UInt32);
|
||||
}
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
UInt32 CAAudioHardwareDevice::GetAvailableDataSourceByIndex(CAAudioHardwareDeviceSectionID inSection, UInt32 inIndex) const
|
||||
{
|
||||
AudioStreamID theAnswer = 0;
|
||||
UInt32 theNumberSources = GetNumberAvailableDataSources(inSection);
|
||||
if((theNumberSources > 0) && (inIndex < theNumberSources))
|
||||
{
|
||||
CAAutoArrayDelete<UInt32> theSourceList(theNumberSources);
|
||||
GetAvailableDataSources(inSection, theNumberSources, theSourceList);
|
||||
theAnswer = theSourceList[inIndex];
|
||||
}
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::GetAvailableDataSources(CAAudioHardwareDeviceSectionID inSection, UInt32& ioNumberSources, UInt32* outSources) const
|
||||
{
|
||||
UInt32 theNumberSources = std::min(GetNumberAvailableDataSources(inSection), ioNumberSources);
|
||||
UInt32 theSize = theNumberSources * sizeof(UInt32);
|
||||
GetPropertyData(0, inSection, kAudioDevicePropertyDataSources, theSize, outSources);
|
||||
ioNumberSources = theSize / sizeof(UInt32);
|
||||
UInt32* theFirstItem = &(outSources[0]);
|
||||
UInt32* theLastItem = theFirstItem + ioNumberSources;
|
||||
std::sort(theFirstItem, theLastItem);
|
||||
}
|
||||
|
||||
CFStringRef CAAudioHardwareDevice::CopyDataSourceNameForID(CAAudioHardwareDeviceSectionID inSection, UInt32 inID) const
|
||||
{
|
||||
CFStringRef theAnswer = NULL;
|
||||
AudioValueTranslation theTranslation = { &inID, sizeof(UInt32), &theAnswer, sizeof(CFStringRef) };
|
||||
UInt32 theSize = sizeof(AudioValueTranslation);
|
||||
GetPropertyData(0, inSection, kAudioDevicePropertyDataSourceNameForIDCFString, theSize, &theTranslation);
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
Float64 CAAudioHardwareDevice::GetActualSampleRate() const
|
||||
{
|
||||
Float64 theAnswer = 0;
|
||||
UInt32 theSize = sizeof(Float64);
|
||||
GetPropertyData(0, kAudioDeviceSectionGlobal, kAudioDevicePropertyActualSampleRate, theSize, &theAnswer);
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
Float64 CAAudioHardwareDevice::GetNominalSampleRate() const
|
||||
{
|
||||
Float64 theAnswer = 0;
|
||||
UInt32 theSize = sizeof(Float64);
|
||||
GetPropertyData(0, kAudioDeviceSectionGlobal, kAudioDevicePropertyNominalSampleRate, theSize, &theAnswer);
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::SetNominalSampleRate(Float64 inSampleRate)
|
||||
{
|
||||
UInt32 theSize = sizeof(Float64);
|
||||
SetPropertyData(0, kAudioDeviceSectionGlobal, kAudioDevicePropertyNominalSampleRate, theSize, &inSampleRate);
|
||||
}
|
||||
|
||||
bool CAAudioHardwareDevice::IsValidNominalSampleRate(Float64 inSampleRate) const
|
||||
{
|
||||
bool theAnswer = false;
|
||||
UInt32 theNumberRanges = GetNumberNominalSampleRateRanges();
|
||||
CAAutoArrayDelete<AudioValueRange> theRanges(theNumberRanges);
|
||||
GetNominalSampleRateRanges(theNumberRanges, theRanges);
|
||||
for(UInt32 theIndex = 0; !theAnswer && (theIndex < theNumberRanges); ++theIndex)
|
||||
{
|
||||
theAnswer = (inSampleRate >= theRanges[theIndex].mMinimum) && (inSampleRate <= theRanges[theIndex].mMinimum);
|
||||
}
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
UInt32 CAAudioHardwareDevice::GetNumberNominalSampleRateRanges() const
|
||||
{
|
||||
UInt32 theSize = GetPropertyDataSize(0, kAudioDeviceSectionGlobal, kAudioDevicePropertyAvailableNominalSampleRates);
|
||||
return theSize / sizeof(AudioValueRange);
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::GetNominalSampleRateRanges(UInt32& ioNumberRanges, AudioValueRange* outRanges) const
|
||||
{
|
||||
UInt32 theSize = ioNumberRanges * sizeof(AudioValueRange);
|
||||
GetPropertyData(0, kAudioDeviceSectionGlobal, kAudioDevicePropertyAvailableNominalSampleRates, theSize, outRanges);
|
||||
ioNumberRanges = theSize / sizeof(AudioValueRange);
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::GetNominalSampleRateRangeByIndex(UInt32 inIndex, Float64& outMinimum, Float64& outMaximum) const
|
||||
{
|
||||
UInt32 theNumberRanges = GetNumberNominalSampleRateRanges();
|
||||
ThrowIf(inIndex >= theNumberRanges, CAException(kAudioHardwareIllegalOperationError), "CAAudioHardwareDevice::GetNominalSampleRateRangeByIndex: index out of range");
|
||||
CAAutoArrayDelete<AudioValueRange> theRanges(theNumberRanges);
|
||||
GetNominalSampleRateRanges(theNumberRanges, theRanges);
|
||||
outMinimum = theRanges[inIndex].mMinimum;
|
||||
outMaximum = theRanges[inIndex].mMaximum;
|
||||
}
|
||||
|
||||
UInt32 CAAudioHardwareDevice::GetIOBufferSize() const
|
||||
{
|
||||
UInt32 theAnswer = 0;
|
||||
UInt32 theSize = sizeof(UInt32);
|
||||
GetPropertyData(0, kAudioDeviceSectionGlobal, kAudioDevicePropertyBufferFrameSize, theSize, &theAnswer);
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::SetIOBufferSize(UInt32 inBufferSize)
|
||||
{
|
||||
UInt32 theSize = sizeof(UInt32);
|
||||
SetPropertyData(0, kAudioDeviceSectionGlobal, kAudioDevicePropertyBufferFrameSize, theSize, &inBufferSize);
|
||||
}
|
||||
|
||||
bool CAAudioHardwareDevice::UsesVariableIOBufferSizes() const
|
||||
{
|
||||
return HasProperty(0, kAudioDeviceSectionGlobal, kAudioDevicePropertyUsesVariableBufferFrameSizes);
|
||||
}
|
||||
|
||||
UInt32 CAAudioHardwareDevice::GetMaximumVariableIOBufferSize() const
|
||||
{
|
||||
UInt32 theAnswer = 0;
|
||||
UInt32 theSize = sizeof(UInt32);
|
||||
GetPropertyData(0, kAudioDeviceSectionGlobal, kAudioDevicePropertyUsesVariableBufferFrameSizes, theSize, &theAnswer);
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::GetIOBufferSizeRange(UInt32& outMinimum, UInt32& outMaximum) const
|
||||
{
|
||||
AudioValueRange theAnswer = { 0, 0 };
|
||||
UInt32 theSize = sizeof(AudioValueRange);
|
||||
GetPropertyData(0, kAudioDeviceSectionGlobal, kAudioDevicePropertyBufferFrameSizeRange, theSize, &theAnswer);
|
||||
outMinimum = static_cast<UInt32>(theAnswer.mMinimum);
|
||||
outMaximum = static_cast<UInt32>(theAnswer.mMaximum);
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::AddIOProc(AudioDeviceIOProc inIOProc, void* inClientData)
|
||||
{
|
||||
OSStatus theError = AudioDeviceAddIOProc(mAudioDeviceID, inIOProc, inClientData);
|
||||
ThrowIfError(theError, CAException(theError), "CAAudioHardwareDevice::AddIOProc: got an error adding an IOProc");
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::RemoveIOProc(AudioDeviceIOProc inIOProc)
|
||||
{
|
||||
OSStatus theError = AudioDeviceRemoveIOProc(mAudioDeviceID, inIOProc);
|
||||
ThrowIfError(theError, CAException(theError), "CAAudioHardwareDevice::RemoveIOProc: got an error removing an IOProc");
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::StartIOProc(AudioDeviceIOProc inIOProc)
|
||||
{
|
||||
OSStatus theError = AudioDeviceStart(mAudioDeviceID, inIOProc);
|
||||
ThrowIfError(theError, CAException(theError), "CAAudioHardwareDevice::StartIOProc: got an error starting an IOProc");
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::StartIOProcAtTime(AudioDeviceIOProc inIOProc, AudioTimeStamp& ioStartTime, bool inIsInput, bool inIgnoreHardware)
|
||||
{
|
||||
UInt32 theFlags = 0;
|
||||
if(inIsInput)
|
||||
{
|
||||
theFlags |= kAudioDeviceStartTimeIsInputFlag;
|
||||
}
|
||||
if(inIgnoreHardware)
|
||||
{
|
||||
theFlags |= kAudioDeviceStartTimeDontConsultDeviceFlag;
|
||||
}
|
||||
|
||||
OSStatus theError = AudioDeviceStartAtTime(mAudioDeviceID, inIOProc, &ioStartTime, theFlags);
|
||||
ThrowIfError(theError, CAException(theError), "CAAudioHardwareDevice::StartIOProcAtTime: got an error starting an IOProc");
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::StopIOProc(AudioDeviceIOProc inIOProc)
|
||||
{
|
||||
OSStatus theError = AudioDeviceStop(mAudioDeviceID, inIOProc);
|
||||
ThrowIfError(theError, CAException(theError), "CAAudioHardwareDevice::StopIOProc: got an error stopping an IOProc");
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::GetIOProcStreamUsage(AudioDeviceIOProc inIOProc, CAAudioHardwareDeviceSectionID inSection, bool* outStreamUsage) const
|
||||
{
|
||||
// make an AudioHardwareIOProcStreamUsage the right size
|
||||
UInt32 theNumberStreams = GetNumberStreams(inSection);
|
||||
UInt32 theSize = sizeof(void*) + sizeof(UInt32) + (theNumberStreams * sizeof(UInt32));
|
||||
CAAutoFree<AudioHardwareIOProcStreamUsage> theStreamUsage(theSize);
|
||||
|
||||
// set it up
|
||||
theStreamUsage->mIOProc = (void*)inIOProc;
|
||||
theStreamUsage->mNumberStreams = theNumberStreams;
|
||||
|
||||
// get the property
|
||||
GetPropertyData(0, inSection, kAudioDevicePropertyIOProcStreamUsage, theSize, theStreamUsage);
|
||||
|
||||
// fill out the return value
|
||||
for(UInt32 theIndex = 0; theIndex < theNumberStreams; ++theIndex)
|
||||
{
|
||||
outStreamUsage[theIndex] = (theStreamUsage->mStreamIsOn[theIndex] != 0);
|
||||
}
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::SetIOProcStreamUsage(AudioDeviceIOProc inIOProc, CAAudioHardwareDeviceSectionID inSection, const bool* inStreamUsage)
|
||||
{
|
||||
// make an AudioHardwareIOProcStreamUsage the right size
|
||||
UInt32 theNumberStreams = GetNumberStreams(inSection);
|
||||
UInt32 theSize = sizeof(void*) + sizeof(UInt32) + (theNumberStreams * sizeof(UInt32));
|
||||
CAAutoFree<AudioHardwareIOProcStreamUsage> theStreamUsage(theSize);
|
||||
|
||||
// set it up
|
||||
theStreamUsage->mIOProc = (void*)inIOProc;
|
||||
theStreamUsage->mNumberStreams = theNumberStreams;
|
||||
for(UInt32 theIndex = 0; theIndex < theNumberStreams; ++theIndex)
|
||||
{
|
||||
theStreamUsage->mStreamIsOn[theIndex] = (inStreamUsage[theIndex] ? 1 : 0);
|
||||
}
|
||||
|
||||
// set the property
|
||||
SetPropertyData(0, inSection, kAudioDevicePropertyIOProcStreamUsage, theSize, theStreamUsage);
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::GetCurrentTime(AudioTimeStamp& outTime)
|
||||
{
|
||||
OSStatus theError = AudioDeviceGetCurrentTime(mAudioDeviceID, &outTime);
|
||||
ThrowIfError(theError, CAException(theError), "CAAudioHardwareDevice::GetCurrentTime: got an error retrieving the current time");
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::TranslateTime(const AudioTimeStamp& inTime, AudioTimeStamp& outTime)
|
||||
{
|
||||
OSStatus theError = AudioDeviceTranslateTime(mAudioDeviceID, &inTime, &outTime);
|
||||
ThrowIfError(theError, CAException(theError), "CAAudioHardwareDevice::TranslateTime: got an error translating time");
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::GetNearestStartTime(AudioTimeStamp& ioTime, bool inIsInput, bool inIgnoreHardware)
|
||||
{
|
||||
UInt32 theFlags = 0;
|
||||
if(inIsInput)
|
||||
{
|
||||
theFlags |= kAudioDeviceStartTimeIsInputFlag;
|
||||
}
|
||||
if(inIgnoreHardware)
|
||||
{
|
||||
theFlags |= kAudioDeviceStartTimeDontConsultDeviceFlag;
|
||||
}
|
||||
|
||||
OSStatus theError = AudioDeviceGetNearestStartTime(mAudioDeviceID, &ioTime, theFlags);
|
||||
ThrowIfError(theError, CAException(theError), "CAAudioHardwareDevice::GetNearestStartTime: got an error getting the nearest start time");
|
||||
}
|
||||
|
||||
UInt32 CAAudioHardwareDevice::GetNumberStreams(CAAudioHardwareDeviceSectionID inSection) const
|
||||
{
|
||||
UInt32 theSize = GetPropertyDataSize(0, inSection, kAudioDevicePropertyStreams);
|
||||
return theSize / sizeof(AudioStreamID);
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::GetStreams(CAAudioHardwareDeviceSectionID inSection, UInt32& ioNumberStreams, AudioStreamID* outStreamList) const
|
||||
{
|
||||
ioNumberStreams = std::min(GetNumberStreams(inSection), ioNumberStreams);
|
||||
UInt32 theSize = ioNumberStreams * sizeof(AudioStreamID);
|
||||
GetPropertyData(0, inSection, kAudioDevicePropertyStreams, theSize, outStreamList);
|
||||
ioNumberStreams = theSize / sizeof(AudioStreamID);
|
||||
AudioStreamID* theFirstItem = &(outStreamList[0]);
|
||||
AudioStreamID* theLastItem = theFirstItem + ioNumberStreams;
|
||||
std::sort(theFirstItem, theLastItem);
|
||||
}
|
||||
|
||||
AudioStreamID CAAudioHardwareDevice::GetStreamByIndex(CAAudioHardwareDeviceSectionID inSection, UInt32 inIndex) const
|
||||
{
|
||||
AudioStreamID theAnswer = 0;
|
||||
UInt32 theNumberStreams = GetNumberStreams(inSection);
|
||||
if((theNumberStreams > 0) && (inIndex < theNumberStreams))
|
||||
{
|
||||
CAAutoArrayDelete<AudioStreamID> theStreamList(theNumberStreams);
|
||||
GetStreams(inSection, theNumberStreams, theStreamList);
|
||||
theAnswer = theStreamList[inIndex];
|
||||
}
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
UInt32 CAAudioHardwareDevice::GetTotalNumberChannels(CAAudioHardwareDeviceSectionID inSection) const
|
||||
{
|
||||
UInt32 theAnswer = 0;
|
||||
UInt32 theSize = GetPropertyDataSize(0, inSection, kAudioDevicePropertyStreamConfiguration);
|
||||
CAAutoFree<AudioBufferList> theBufferList(theSize);
|
||||
GetPropertyData(0, inSection, kAudioDevicePropertyStreamConfiguration, theSize, theBufferList);
|
||||
for(UInt32 theIndex = 0; theIndex < theBufferList->mNumberBuffers; ++theIndex)
|
||||
{
|
||||
theAnswer += theBufferList->mBuffers[theIndex].mNumberChannels;
|
||||
}
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::GetCurrentIOProcFormats(CAAudioHardwareDeviceSectionID inSection, UInt32& ioNumberStreams, AudioStreamBasicDescription* outFormats) const
|
||||
{
|
||||
ioNumberStreams = std::min(ioNumberStreams, GetNumberStreams(inSection));
|
||||
for(UInt32 theIndex = 0; theIndex < ioNumberStreams; ++theIndex)
|
||||
{
|
||||
CAAudioHardwareStream theStream(GetStreamByIndex(inSection, theIndex));
|
||||
theStream.GetCurrentIOProcFormat(outFormats[theIndex]);
|
||||
}
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::GetCurrentPhysicalFormats(CAAudioHardwareDeviceSectionID inSection, UInt32& ioNumberStreams, AudioStreamBasicDescription* outFormats) const
|
||||
{
|
||||
ioNumberStreams = std::min(ioNumberStreams, GetNumberStreams(inSection));
|
||||
for(UInt32 theIndex = 0; theIndex < ioNumberStreams; ++theIndex)
|
||||
{
|
||||
CAAudioHardwareStream theStream(GetStreamByIndex(inSection, theIndex));
|
||||
theStream.GetCurrentPhysicalFormat(outFormats[theIndex]);
|
||||
}
|
||||
}
|
||||
|
||||
bool CAAudioHardwareDevice::HasVolumeControl(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection) const
|
||||
{
|
||||
return HasProperty(inChannel, inSection, kAudioDevicePropertyVolumeScalar);
|
||||
}
|
||||
|
||||
bool CAAudioHardwareDevice::VolumeControlIsSettable(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection) const
|
||||
{
|
||||
return PropertyIsSettable(inChannel, inSection, kAudioDevicePropertyVolumeScalar);
|
||||
}
|
||||
|
||||
Float32 CAAudioHardwareDevice::GetVolumeControlScalarValue(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection) const
|
||||
{
|
||||
Float32 theValue = 0.0;
|
||||
UInt32 theSize = sizeof(Float32);
|
||||
GetPropertyData(inChannel, inSection, kAudioDevicePropertyVolumeScalar, theSize, &theValue);
|
||||
return theValue;
|
||||
}
|
||||
|
||||
Float32 CAAudioHardwareDevice::GetVolumeControlDecibelValue(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection) const
|
||||
{
|
||||
Float32 theValue = 0.0;
|
||||
UInt32 theSize = sizeof(Float32);
|
||||
GetPropertyData(inChannel, inSection, kAudioDevicePropertyVolumeDecibels, theSize, &theValue);
|
||||
return theValue;
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::SetVolumeControlScalarValue(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection, Float32 inValue)
|
||||
{
|
||||
UInt32 theSize = sizeof(Float32);
|
||||
SetPropertyData(inChannel, inSection, kAudioDevicePropertyVolumeScalar, theSize, &inValue);
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::SetVolumeControlDecibelValue(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection, Float32 inValue)
|
||||
{
|
||||
UInt32 theSize = sizeof(Float32);
|
||||
SetPropertyData(inChannel, inSection, kAudioDevicePropertyVolumeDecibels, theSize, &inValue);
|
||||
}
|
||||
|
||||
Float32 CAAudioHardwareDevice::GetVolumeControlScalarForDecibelValue(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection, Float32 inValue) const
|
||||
{
|
||||
Float32 theValue = inValue;
|
||||
UInt32 theSize = sizeof(Float32);
|
||||
GetPropertyData(inChannel, inSection, kAudioDevicePropertyVolumeDecibelsToScalar, theSize, &theValue);
|
||||
return theValue;
|
||||
}
|
||||
|
||||
Float32 CAAudioHardwareDevice::GetVolumeControlDecibelForScalarValue(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection, Float32 inValue) const
|
||||
{
|
||||
Float32 theValue = inValue;
|
||||
UInt32 theSize = sizeof(Float32);
|
||||
GetPropertyData(inChannel, inSection, kAudioDevicePropertyVolumeScalarToDecibels, theSize, &theValue);
|
||||
return theValue;
|
||||
}
|
||||
|
||||
bool CAAudioHardwareDevice::HasMuteControl(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection) const
|
||||
{
|
||||
return HasProperty(inChannel, inSection, kAudioDevicePropertyMute);
|
||||
}
|
||||
|
||||
bool CAAudioHardwareDevice::MuteControlIsSettable(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection) const
|
||||
{
|
||||
return PropertyIsSettable(inChannel, inSection, kAudioDevicePropertyMute);
|
||||
}
|
||||
|
||||
bool CAAudioHardwareDevice::GetMuteControlValue(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection) const
|
||||
{
|
||||
UInt32 theValue = 0;
|
||||
UInt32 theSize = sizeof(UInt32);
|
||||
GetPropertyData(inChannel, inSection, kAudioDevicePropertyMute, theSize, &theValue);
|
||||
return theValue != 0;
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::SetMuteControlValue(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection, bool inValue)
|
||||
{
|
||||
UInt32 theValue = (inValue ? 1 : 0);
|
||||
UInt32 theSize = sizeof(UInt32);
|
||||
SetPropertyData(inChannel, inSection, kAudioDevicePropertyMute, theSize, &theValue);
|
||||
}
|
||||
|
||||
bool CAAudioHardwareDevice::HasPlayThruControl(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection) const
|
||||
{
|
||||
return HasProperty(inChannel, inSection, kAudioDevicePropertyPlayThru);
|
||||
}
|
||||
|
||||
bool CAAudioHardwareDevice::PlayThruControlIsSettable(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection) const
|
||||
{
|
||||
return PropertyIsSettable(inChannel, inSection, kAudioDevicePropertyPlayThru);
|
||||
}
|
||||
|
||||
bool CAAudioHardwareDevice::GetPlayThruControlValue(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection) const
|
||||
{
|
||||
UInt32 theValue = 0;
|
||||
UInt32 theSize = sizeof(UInt32);
|
||||
GetPropertyData(inChannel, inSection, kAudioDevicePropertyPlayThru, theSize, &theValue);
|
||||
return theValue != 0;
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::SetPlayThruControlValue(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection, bool inValue)
|
||||
{
|
||||
UInt32 theValue = (inValue ? 1 : 0);
|
||||
UInt32 theSize = sizeof(UInt32);
|
||||
SetPropertyData(inChannel, inSection, kAudioDevicePropertyPlayThru, theSize, &theValue);
|
||||
}
|
||||
|
||||
bool CAAudioHardwareDevice::HasISubOwnershipControl() const
|
||||
{
|
||||
return HasProperty(0, kAudioDeviceSectionOutput, kAudioDevicePropertyDriverShouldOwniSub);
|
||||
}
|
||||
|
||||
bool CAAudioHardwareDevice::ISubOwnershipControlIsSettable() const
|
||||
{
|
||||
return PropertyIsSettable(0, kAudioDeviceSectionOutput, kAudioDevicePropertyDriverShouldOwniSub);
|
||||
}
|
||||
|
||||
bool CAAudioHardwareDevice::GetISubOwnershipControlValue() const
|
||||
{
|
||||
UInt32 theValue = 0;
|
||||
UInt32 theSize = sizeof(UInt32);
|
||||
GetPropertyData(0, kAudioDeviceSectionOutput, kAudioDevicePropertyDriverShouldOwniSub, theSize, &theValue);
|
||||
return theValue != 0;
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::SetISubOwnershipControlValue(bool inValue)
|
||||
{
|
||||
UInt32 theValue = (inValue ? 1 : 0);
|
||||
UInt32 theSize = sizeof(UInt32);
|
||||
SetPropertyData(0, kAudioDeviceSectionOutput, kAudioDevicePropertyDriverShouldOwniSub, theSize, &theValue);
|
||||
}
|
||||
|
||||
bool CAAudioHardwareDevice::HasSubMuteControl(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection) const
|
||||
{
|
||||
return HasProperty(inChannel, inSection, kAudioDevicePropertySubMute);
|
||||
}
|
||||
|
||||
bool CAAudioHardwareDevice::SubMuteControlIsSettable(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection) const
|
||||
{
|
||||
return PropertyIsSettable(inChannel, inSection, kAudioDevicePropertySubMute);
|
||||
}
|
||||
|
||||
bool CAAudioHardwareDevice::GetSubMuteControlValue(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection) const
|
||||
{
|
||||
UInt32 theValue = 0;
|
||||
UInt32 theSize = sizeof(UInt32);
|
||||
GetPropertyData(inChannel, inSection, kAudioDevicePropertySubMute, theSize, &theValue);
|
||||
return theValue != 0;
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::SetSubMuteControlValue(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection, bool inValue)
|
||||
{
|
||||
UInt32 theValue = (inValue ? 1 : 0);
|
||||
UInt32 theSize = sizeof(UInt32);
|
||||
SetPropertyData(inChannel, inSection, kAudioDevicePropertySubMute, theSize, &theValue);
|
||||
}
|
||||
|
||||
bool CAAudioHardwareDevice::HasSubVolumeControl(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection) const
|
||||
{
|
||||
return HasProperty(inChannel, inSection, kAudioDevicePropertySubVolumeScalar);
|
||||
}
|
||||
|
||||
bool CAAudioHardwareDevice::SubVolumeControlIsSettable(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection) const
|
||||
{
|
||||
return PropertyIsSettable(inChannel, inSection, kAudioDevicePropertySubVolumeScalar);
|
||||
}
|
||||
|
||||
Float32 CAAudioHardwareDevice::GetSubVolumeControlScalarValue(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection) const
|
||||
{
|
||||
Float32 theValue = 0.0;
|
||||
UInt32 theSize = sizeof(Float32);
|
||||
GetPropertyData(inChannel, inSection, kAudioDevicePropertySubVolumeScalar, theSize, &theValue);
|
||||
return theValue;
|
||||
}
|
||||
|
||||
Float32 CAAudioHardwareDevice::GetSubVolumeControlDecibelValue(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection) const
|
||||
{
|
||||
Float32 theValue = 0.0;
|
||||
UInt32 theSize = sizeof(Float32);
|
||||
GetPropertyData(inChannel, inSection, kAudioDevicePropertySubVolumeDecibels, theSize, &theValue);
|
||||
return theValue;
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::SetSubVolumeControlScalarValue(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection, Float32 inValue)
|
||||
{
|
||||
UInt32 theSize = sizeof(Float32);
|
||||
SetPropertyData(inChannel, inSection, kAudioDevicePropertySubVolumeScalar, theSize, &inValue);
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::SetSubVolumeControlDecibelValue(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection, Float32 inValue)
|
||||
{
|
||||
UInt32 theSize = sizeof(Float32);
|
||||
SetPropertyData(inChannel, inSection, kAudioDevicePropertySubVolumeDecibels, theSize, &inValue);
|
||||
}
|
||||
|
||||
Float32 CAAudioHardwareDevice::GetSubVolumeControlScalarForDecibelValue(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection, Float32 inValue) const
|
||||
{
|
||||
Float32 theValue = inValue;
|
||||
UInt32 theSize = sizeof(Float32);
|
||||
GetPropertyData(inChannel, inSection, kAudioDevicePropertySubVolumeDecibelsToScalar, theSize, &theValue);
|
||||
return theValue;
|
||||
}
|
||||
|
||||
Float32 CAAudioHardwareDevice::GetSubVolumeControlDecibelForScalarValue(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection, Float32 inValue) const
|
||||
{
|
||||
Float32 theValue = inValue;
|
||||
UInt32 theSize = sizeof(Float32);
|
||||
GetPropertyData(inChannel, inSection, kAudioDevicePropertySubVolumeScalarToDecibels, theSize, &theValue);
|
||||
return theValue;
|
||||
}
|
||||
|
||||
bool CAAudioHardwareDevice::HasProperty(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection, AudioHardwarePropertyID inPropertyID) const
|
||||
{
|
||||
OSStatus theError = AudioDeviceGetPropertyInfo(mAudioDeviceID, inChannel, inSection, inPropertyID, NULL, NULL);
|
||||
return theError == 0;
|
||||
}
|
||||
|
||||
bool CAAudioHardwareDevice::PropertyIsSettable(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection, AudioHardwarePropertyID inPropertyID) const
|
||||
{
|
||||
Boolean isWritable = false;
|
||||
OSStatus theError = AudioDeviceGetPropertyInfo(mAudioDeviceID, inChannel, inSection, inPropertyID, NULL, &isWritable);
|
||||
ThrowIfError(theError, CAException(theError), "CAAudioHardwareDevice::PropertyIsSettable: got an error getting info about a property");
|
||||
return isWritable != 0;
|
||||
}
|
||||
|
||||
UInt32 CAAudioHardwareDevice::GetPropertyDataSize(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection, AudioHardwarePropertyID inPropertyID) const
|
||||
{
|
||||
UInt32 theSize = 0;
|
||||
OSStatus theError = AudioDeviceGetPropertyInfo(mAudioDeviceID, inChannel, inSection, inPropertyID, &theSize, NULL);
|
||||
ThrowIfError(theError, CAException(theError), "CAAudioHardwareDevice::GetPropertyDataSize: got an error getting info about a property");
|
||||
return theSize;
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::GetPropertyData(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection, AudioHardwarePropertyID inPropertyID, UInt32& ioDataSize, void* outData) const
|
||||
{
|
||||
OSStatus theError = AudioDeviceGetProperty(mAudioDeviceID, inChannel, inSection, inPropertyID, &ioDataSize, outData);
|
||||
ThrowIfError(theError, CAException(theError), "CAAudioHardwareDevice::GetPropertyData: got an error getting the value of a property");
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::SetPropertyData(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection, AudioHardwarePropertyID inPropertyID, UInt32 inDataSize, const void* inData, const AudioTimeStamp* inWhen)
|
||||
{
|
||||
OSStatus theError = AudioDeviceSetProperty(mAudioDeviceID, inWhen, inChannel, inSection, inPropertyID, inDataSize, inData);
|
||||
ThrowIfError(theError, CAException(theError), "CAAudioHardwareDevice::SetPropertyData: got an error setting the value of a property");
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::AddPropertyListener(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection, AudioHardwarePropertyID inPropertyID, AudioDevicePropertyListenerProc inListenerProc, void* inClientData)
|
||||
{
|
||||
OSStatus theError = AudioDeviceAddPropertyListener(mAudioDeviceID, inChannel, inSection, inPropertyID, inListenerProc, inClientData);
|
||||
ThrowIfError(theError, CAException(theError), "CAAudioHardwareDevice::AddPropertyListener: got an error adding a property listener");
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::RemovePropertyListener(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection, AudioHardwarePropertyID inPropertyID, AudioDevicePropertyListenerProc inListenerProc)
|
||||
{
|
||||
OSStatus theError = AudioDeviceRemovePropertyListener(mAudioDeviceID, inChannel, inSection, inPropertyID, inListenerProc);
|
||||
ThrowIfError(theError, CAException(theError), "CAAudioHardwareDevice::RemovePropertyListener: got an error removing a property listener");
|
||||
}
|
||||
|
||||
void CAAudioHardwareDevice::GetNameForTransportType(UInt32 inTransportType, char* outName)
|
||||
{
|
||||
switch(inTransportType)
|
||||
{
|
||||
case 0:
|
||||
strcpy(outName, "Unknown");
|
||||
break;
|
||||
|
||||
case kIOAudioDeviceTransportTypeBuiltIn:
|
||||
strcpy(outName, "Built-In");
|
||||
break;
|
||||
|
||||
case kIOAudioDeviceTransportTypePCI:
|
||||
strcpy(outName, "PCI");
|
||||
break;
|
||||
|
||||
case kIOAudioDeviceTransportTypeUSB:
|
||||
strcpy(outName, "USB");
|
||||
break;
|
||||
|
||||
case kIOAudioDeviceTransportTypeFireWire:
|
||||
strcpy(outName, "FireWire");
|
||||
break;
|
||||
|
||||
case kIOAudioDeviceTransportTypeNetwork:
|
||||
strcpy(outName, "Network");
|
||||
break;
|
||||
|
||||
case kIOAudioDeviceTransportTypeWireless:
|
||||
strcpy(outName, "Wireless");
|
||||
break;
|
||||
|
||||
case kIOAudioDeviceTransportTypeOther:
|
||||
strcpy(outName, "Other");
|
||||
break;
|
||||
|
||||
default:
|
||||
{
|
||||
char* the4CC = (char*)&inTransportType;
|
||||
outName[0] = the4CC[0];
|
||||
outName[1] = the4CC[1];
|
||||
outName[2] = the4CC[2];
|
||||
outName[3] = the4CC[3];
|
||||
outName[4] = 0;
|
||||
}
|
||||
break;
|
||||
};
|
||||
}
|
||||
@@ -1,238 +0,0 @@
|
||||
/* Copyright: © Copyright 2003 Apple Computer, Inc. All rights reserved.
|
||||
|
||||
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc.
|
||||
("Apple") in consideration of your agreement to the following terms, and your
|
||||
use, installation, modification or redistribution of this Apple software
|
||||
constitutes acceptance of these terms. If you do not agree with these terms,
|
||||
please do not use, install, modify or redistribute this Apple software.
|
||||
|
||||
In consideration of your agreement to abide by the following terms, and subject
|
||||
to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs
|
||||
copyrights in this original Apple software (the "Apple Software"), to use,
|
||||
reproduce, modify and redistribute the Apple Software, with or without
|
||||
modifications, in source and/or binary forms; provided that if you redistribute
|
||||
the Apple Software in its entirety and without modifications, you must retain
|
||||
this notice and the following text and disclaimers in all such redistributions of
|
||||
the Apple Software. Neither the name, trademarks, service marks or logos of
|
||||
Apple Computer, Inc. may be used to endorse or promote products derived from the
|
||||
Apple Software without specific prior written permission from Apple. Except as
|
||||
expressly stated in this notice, no other rights or licenses, express or implied,
|
||||
are granted by Apple herein, including but not limited to any patent rights that
|
||||
may be infringed by your derivative works or by other works in which the Apple
|
||||
Software may be incorporated.
|
||||
|
||||
The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO
|
||||
WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
|
||||
WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN
|
||||
COMBINATION WITH YOUR PRODUCTS.
|
||||
|
||||
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION
|
||||
OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT
|
||||
(INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN
|
||||
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
/*=============================================================================
|
||||
CAAudioHardwareDevice.h
|
||||
|
||||
=============================================================================*/
|
||||
#if !defined(__CAAudioHardwareDevice_h__)
|
||||
#define __CAAudioHardwareDevice_h__
|
||||
|
||||
//=============================================================================
|
||||
// Includes
|
||||
//=============================================================================
|
||||
|
||||
// System Includes
|
||||
#include <CoreAudio/CoreAudio.h>
|
||||
#include <CoreFoundation/CoreFoundation.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
//=============================================================================
|
||||
// Types
|
||||
//=============================================================================
|
||||
|
||||
typedef UInt8 CAAudioHardwareDeviceSectionID;
|
||||
#define kAudioDeviceSectionInput ((CAAudioHardwareDeviceSectionID)0x01)
|
||||
#define kAudioDeviceSectionOutput ((CAAudioHardwareDeviceSectionID)0x00)
|
||||
#define kAudioDeviceSectionGlobal ((CAAudioHardwareDeviceSectionID)0x00)
|
||||
#define kAudioDeviceSectionWildcard ((CAAudioHardwareDeviceSectionID)0xFF)
|
||||
|
||||
//=============================================================================
|
||||
// CAAudioHardwareDevice
|
||||
//=============================================================================
|
||||
|
||||
class CAAudioHardwareDevice
|
||||
{
|
||||
|
||||
// Construction/Destruction
|
||||
public:
|
||||
CAAudioHardwareDevice(AudioDeviceID inAudioDeviceID);
|
||||
~CAAudioHardwareDevice();
|
||||
|
||||
// General Operations
|
||||
public:
|
||||
AudioDeviceID GetAudioDeviceID() const { return mAudioDeviceID; }
|
||||
CFStringRef CopyName() const;
|
||||
CFStringRef CopyManufacturer() const;
|
||||
CFStringRef CopyUID() const;
|
||||
CFStringRef CopyConfigurationApplicationBundleID() const;
|
||||
UInt32 GetTransportType() const;
|
||||
bool CanBeDefaultDevice(CAAudioHardwareDeviceSectionID inSection, bool inIsSystem = false) const;
|
||||
|
||||
bool HasDevicePlugInStatus() const;
|
||||
OSStatus GetDevicePlugInStatus() const;
|
||||
|
||||
bool IsAlive() const;
|
||||
bool IsRunning() const;
|
||||
void SetIsRunning(bool inIsRunning);
|
||||
bool IsRunningSomewhere() const;
|
||||
|
||||
pid_t GetHogModeOwner() const;
|
||||
bool TakeHogMode();
|
||||
void ReleaseHogMode();
|
||||
|
||||
bool SupportsChangingMixability() const;
|
||||
bool IsMixable() const;
|
||||
void SetIsMixable(bool inIsMixable);
|
||||
|
||||
bool HasIsConnectedStatus(CAAudioHardwareDeviceSectionID inSection) const;
|
||||
bool GetIsConnectedStatus(CAAudioHardwareDeviceSectionID inSection) const;
|
||||
|
||||
bool HasPreferredStereoChannels(CAAudioHardwareDeviceSectionID inSection) const;
|
||||
void GetPreferredStereoChannels(CAAudioHardwareDeviceSectionID inSection, UInt32& outLeft, UInt32& outRight) const;
|
||||
void SetPreferredStereoChannels(CAAudioHardwareDeviceSectionID inSection, UInt32 inLeft, UInt32 inRight);
|
||||
|
||||
// IO Operations
|
||||
public:
|
||||
UInt32 GetLatency(CAAudioHardwareDeviceSectionID inSection) const;
|
||||
UInt32 GetSafetyOffset(CAAudioHardwareDeviceSectionID inSection) const;
|
||||
|
||||
bool HasClockSourceControl() const;
|
||||
bool ClockSourceControlIsSettable() const;
|
||||
UInt32 GetCurrentClockSourceID() const;
|
||||
void SetCurrentClockSourceByID(UInt32 inID);
|
||||
UInt32 GetNumberAvailableClockSources() const;
|
||||
UInt32 GetAvailableClockSourceByIndex(UInt32 inIndex) const;
|
||||
void GetAvailableClockSources(UInt32& ioNumberSources, UInt32* outSources) const;
|
||||
CFStringRef CopyClockSourceNameForID(UInt32 inID) const;
|
||||
|
||||
bool HasDataSourceControl(CAAudioHardwareDeviceSectionID inSection) const;
|
||||
bool DataSourceControlIsSettable(CAAudioHardwareDeviceSectionID inSection) const;
|
||||
UInt32 GetCurrentDataSourceID(CAAudioHardwareDeviceSectionID inSection) const;
|
||||
void SetCurrentDataSourceByID(CAAudioHardwareDeviceSectionID inSection, UInt32 inID);
|
||||
UInt32 GetNumberAvailableDataSources(CAAudioHardwareDeviceSectionID inSection) const;
|
||||
UInt32 GetAvailableDataSourceByIndex(CAAudioHardwareDeviceSectionID inSection, UInt32 inIndex) const;
|
||||
void GetAvailableDataSources(CAAudioHardwareDeviceSectionID inSection, UInt32& ioNumberSources, UInt32* outSources) const;
|
||||
CFStringRef CopyDataSourceNameForID(CAAudioHardwareDeviceSectionID inSection, UInt32 inID) const;
|
||||
|
||||
Float64 GetActualSampleRate() const;
|
||||
Float64 GetNominalSampleRate() const;
|
||||
void SetNominalSampleRate(Float64 inSampleRate);
|
||||
bool IsValidNominalSampleRate(Float64 inSampleRate) const;
|
||||
UInt32 GetNumberNominalSampleRateRanges() const;
|
||||
void GetNominalSampleRateRanges(UInt32& ioNumberRanges, AudioValueRange* outRanges) const;
|
||||
void GetNominalSampleRateRangeByIndex(UInt32 inIndex, Float64& outMinimum, Float64& outMaximum) const;
|
||||
|
||||
UInt32 GetIOBufferSize() const;
|
||||
void SetIOBufferSize(UInt32 inBufferSize);
|
||||
bool UsesVariableIOBufferSizes() const;
|
||||
UInt32 GetMaximumVariableIOBufferSize() const;
|
||||
void GetIOBufferSizeRange(UInt32& outMinimum, UInt32& outMaximum) const;
|
||||
|
||||
void AddIOProc(AudioDeviceIOProc inIOProc, void* inClientData);
|
||||
void RemoveIOProc(AudioDeviceIOProc inIOProc);
|
||||
|
||||
void StartIOProc(AudioDeviceIOProc inIOProc);
|
||||
void StartIOProcAtTime(AudioDeviceIOProc inIOProc, AudioTimeStamp& ioStartTime, bool inIsInput, bool inIgnoreHardware);
|
||||
void StopIOProc(AudioDeviceIOProc inIOProc);
|
||||
|
||||
void GetIOProcStreamUsage(AudioDeviceIOProc inIOProc, CAAudioHardwareDeviceSectionID inSection, bool* outStreamUsage) const;
|
||||
void SetIOProcStreamUsage(AudioDeviceIOProc inIOProc, CAAudioHardwareDeviceSectionID inSection, const bool* inStreamUsage);
|
||||
|
||||
// Time Operations
|
||||
public:
|
||||
void GetCurrentTime(AudioTimeStamp& outTime);
|
||||
void TranslateTime(const AudioTimeStamp& inTime, AudioTimeStamp& outTime);
|
||||
void GetNearestStartTime(AudioTimeStamp& ioTime, bool inIsInput, bool inIgnoreHardware);
|
||||
|
||||
// Stream Operations
|
||||
public:
|
||||
UInt32 GetNumberStreams(CAAudioHardwareDeviceSectionID inSection) const;
|
||||
void GetStreams(CAAudioHardwareDeviceSectionID inSection, UInt32& ioNumberStreams, AudioStreamID* outStreamList) const;
|
||||
AudioStreamID GetStreamByIndex(CAAudioHardwareDeviceSectionID inSection, UInt32 inIndex) const;
|
||||
|
||||
bool HasSection(CAAudioHardwareDeviceSectionID inSection) const { return GetNumberStreams(inSection) > 0; }
|
||||
UInt32 GetTotalNumberChannels(CAAudioHardwareDeviceSectionID inSection) const;
|
||||
|
||||
// Format Operations
|
||||
public:
|
||||
void GetCurrentIOProcFormats(CAAudioHardwareDeviceSectionID inSection, UInt32& ioNumberStreams, AudioStreamBasicDescription* outFormats) const;
|
||||
void GetCurrentPhysicalFormats(CAAudioHardwareDeviceSectionID inSection, UInt32& ioNumberStreams, AudioStreamBasicDescription* outFormats) const;
|
||||
|
||||
// Control Operations
|
||||
public:
|
||||
bool HasVolumeControl(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection) const;
|
||||
bool VolumeControlIsSettable(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection) const;
|
||||
Float32 GetVolumeControlScalarValue(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection) const;
|
||||
Float32 GetVolumeControlDecibelValue(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection) const;
|
||||
void SetVolumeControlScalarValue(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection, Float32 inValue);
|
||||
void SetVolumeControlDecibelValue(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection, Float32 inValue);
|
||||
Float32 GetVolumeControlScalarForDecibelValue(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection, Float32 inValue) const;
|
||||
Float32 GetVolumeControlDecibelForScalarValue(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection, Float32 inValue) const;
|
||||
|
||||
bool HasMuteControl(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection) const;
|
||||
bool MuteControlIsSettable(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection) const;
|
||||
bool GetMuteControlValue(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection) const;
|
||||
void SetMuteControlValue(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection, bool inValue);
|
||||
|
||||
bool HasPlayThruControl(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection) const;
|
||||
bool PlayThruControlIsSettable(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection) const;
|
||||
bool GetPlayThruControlValue(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection) const;
|
||||
void SetPlayThruControlValue(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection, bool inValue);
|
||||
|
||||
bool HasISubOwnershipControl() const;
|
||||
bool ISubOwnershipControlIsSettable() const;
|
||||
bool GetISubOwnershipControlValue() const;
|
||||
void SetISubOwnershipControlValue(bool inValue);
|
||||
|
||||
bool HasSubMuteControl(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection) const;
|
||||
bool SubMuteControlIsSettable(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection) const;
|
||||
bool GetSubMuteControlValue(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection) const;
|
||||
void SetSubMuteControlValue(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection, bool inValue);
|
||||
|
||||
bool HasSubVolumeControl(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection) const;
|
||||
bool SubVolumeControlIsSettable(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection) const;
|
||||
Float32 GetSubVolumeControlScalarValue(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection) const;
|
||||
Float32 GetSubVolumeControlDecibelValue(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection) const;
|
||||
void SetSubVolumeControlScalarValue(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection, Float32 inValue);
|
||||
void SetSubVolumeControlDecibelValue(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection, Float32 inValue);
|
||||
Float32 GetSubVolumeControlScalarForDecibelValue(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection, Float32 inValue) const;
|
||||
Float32 GetSubVolumeControlDecibelForScalarValue(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection, Float32 inValue) const;
|
||||
|
||||
// Property Operations
|
||||
public:
|
||||
bool HasProperty(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection, AudioHardwarePropertyID inPropertyID) const;
|
||||
bool PropertyIsSettable(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection, AudioHardwarePropertyID inPropertyID) const;
|
||||
|
||||
UInt32 GetPropertyDataSize(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection, AudioHardwarePropertyID inPropertyID) const;
|
||||
void GetPropertyData(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection, AudioHardwarePropertyID inPropertyID, UInt32& ioDataSize, void* outData) const;
|
||||
void SetPropertyData(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection, AudioHardwarePropertyID inPropertyID, UInt32 inDataSize, const void* inData, const AudioTimeStamp* inWhen = NULL);
|
||||
|
||||
void AddPropertyListener(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection, AudioHardwarePropertyID inPropertyID, AudioDevicePropertyListenerProc inListenerProc, void* inClientData);
|
||||
void RemovePropertyListener(UInt32 inChannel, CAAudioHardwareDeviceSectionID inSection, AudioHardwarePropertyID inPropertyID, AudioDevicePropertyListenerProc inListenerProc);
|
||||
|
||||
// Utility Operations
|
||||
public:
|
||||
static void GetNameForTransportType(UInt32 inTransportType, char* outName);
|
||||
|
||||
// Implementation
|
||||
private:
|
||||
AudioDeviceID mAudioDeviceID;
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,561 +0,0 @@
|
||||
/* Copyright: © Copyright 2003 Apple Computer, Inc. All rights reserved.
|
||||
|
||||
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc.
|
||||
("Apple") in consideration of your agreement to the following terms, and your
|
||||
use, installation, modification or redistribution of this Apple software
|
||||
constitutes acceptance of these terms. If you do not agree with these terms,
|
||||
please do not use, install, modify or redistribute this Apple software.
|
||||
|
||||
In consideration of your agreement to abide by the following terms, and subject
|
||||
to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs
|
||||
copyrights in this original Apple software (the "Apple Software"), to use,
|
||||
reproduce, modify and redistribute the Apple Software, with or without
|
||||
modifications, in source and/or binary forms; provided that if you redistribute
|
||||
the Apple Software in its entirety and without modifications, you must retain
|
||||
this notice and the following text and disclaimers in all such redistributions of
|
||||
the Apple Software. Neither the name, trademarks, service marks or logos of
|
||||
Apple Computer, Inc. may be used to endorse or promote products derived from the
|
||||
Apple Software without specific prior written permission from Apple. Except as
|
||||
expressly stated in this notice, no other rights or licenses, express or implied,
|
||||
are granted by Apple herein, including but not limited to any patent rights that
|
||||
may be infringed by your derivative works or by other works in which the Apple
|
||||
Software may be incorporated.
|
||||
|
||||
The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO
|
||||
WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
|
||||
WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN
|
||||
COMBINATION WITH YOUR PRODUCTS.
|
||||
|
||||
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION
|
||||
OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT
|
||||
(INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN
|
||||
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
/*=============================================================================
|
||||
CAAudioHardwareStream.cpp
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
//=============================================================================
|
||||
// Includes
|
||||
//=============================================================================
|
||||
|
||||
// Self Include
|
||||
#include "CAAudioHardwareStream.h"
|
||||
|
||||
// PublicUtility Includes
|
||||
#include "CAAutoDisposer.h"
|
||||
#include "CADebugMacros.h"
|
||||
#include "CAException.h"
|
||||
|
||||
// System Includes
|
||||
#include <IOKit/audio/IOAudioTypes.h>
|
||||
#include <algorithm>
|
||||
|
||||
//=============================================================================
|
||||
// CAAudioHardwareStream
|
||||
//=============================================================================
|
||||
|
||||
CAAudioHardwareStream::CAAudioHardwareStream(AudioStreamID inAudioStreamID)
|
||||
:
|
||||
mAudioStreamID(inAudioStreamID)
|
||||
{
|
||||
}
|
||||
|
||||
CAAudioHardwareStream::~CAAudioHardwareStream()
|
||||
{
|
||||
}
|
||||
|
||||
CFStringRef CAAudioHardwareStream::CopyName() const
|
||||
{
|
||||
CFStringRef theAnswer = NULL;
|
||||
UInt32 theSize = sizeof(CFStringRef);
|
||||
GetPropertyData(0, kAudioDevicePropertyDeviceNameCFString, theSize, &theAnswer);
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
AudioDeviceID CAAudioHardwareStream::GetOwningDevice() const
|
||||
{
|
||||
AudioDeviceID theAnswer = 0;
|
||||
UInt32 theSize = sizeof(AudioDeviceID);
|
||||
GetPropertyData(0, kAudioStreamPropertyOwningDevice, theSize, &theAnswer);
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
CAAudioHardwareDeviceSectionID CAAudioHardwareStream::GetSection() const
|
||||
{
|
||||
UInt32 theAnswer = 0;
|
||||
UInt32 theSize = sizeof(UInt32);
|
||||
GetPropertyData(0, kAudioStreamPropertyDirection, theSize, &theAnswer);
|
||||
return (theAnswer == 0) ? kAudioDeviceSectionOutput : kAudioDeviceSectionInput;
|
||||
}
|
||||
|
||||
UInt32 CAAudioHardwareStream::GetTerminalType() const
|
||||
{
|
||||
UInt32 theAnswer = 0;
|
||||
UInt32 theSize = sizeof(UInt32);
|
||||
GetPropertyData(0, kAudioStreamPropertyTerminalType, theSize, &theAnswer);
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
UInt32 CAAudioHardwareStream::GetStartingDeviceChannel() const
|
||||
{
|
||||
UInt32 theAnswer = 0;
|
||||
UInt32 theSize = sizeof(UInt32);
|
||||
GetPropertyData(0, kAudioStreamPropertyStartingChannel, theSize, &theAnswer);
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
bool CAAudioHardwareStream::HasIsConnectedStatus() const
|
||||
{
|
||||
return HasProperty(0, kAudioDevicePropertyJackIsConnected);
|
||||
}
|
||||
|
||||
bool CAAudioHardwareStream::GetIsConnectedStatus() const
|
||||
{
|
||||
UInt32 theAnswer = 0;
|
||||
UInt32 theSize = sizeof(UInt32);
|
||||
GetPropertyData(0, kAudioDevicePropertyJackIsConnected, theSize, &theAnswer);
|
||||
return theAnswer != 0;
|
||||
}
|
||||
|
||||
bool CAAudioHardwareStream::HasDataSourceControl() const
|
||||
{
|
||||
return HasProperty(0, kAudioDevicePropertyDataSource);
|
||||
}
|
||||
|
||||
bool CAAudioHardwareStream::DataSourceControlIsSettable() const
|
||||
{
|
||||
return PropertyIsSettable(0, kAudioDevicePropertyDataSource);
|
||||
}
|
||||
|
||||
UInt32 CAAudioHardwareStream::GetCurrentDataSourceID() const
|
||||
{
|
||||
UInt32 theAnswer = 0;
|
||||
UInt32 theSize = sizeof(UInt32);
|
||||
GetPropertyData(0, kAudioDevicePropertyDataSource, theSize, &theAnswer);
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
void CAAudioHardwareStream::SetCurrentDataSourceByID(UInt32 inID)
|
||||
{
|
||||
UInt32 theSize = sizeof(UInt32);
|
||||
SetPropertyData(0, kAudioDevicePropertyDataSource, theSize, &inID);
|
||||
}
|
||||
|
||||
UInt32 CAAudioHardwareStream::GetNumberAvailableDataSources() const
|
||||
{
|
||||
UInt32 theAnswer = 0;
|
||||
if(HasDataSourceControl())
|
||||
{
|
||||
UInt32 theSize = GetPropertyDataSize(0, kAudioDevicePropertyDataSources);
|
||||
theAnswer = theSize / sizeof(UInt32);
|
||||
}
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
UInt32 CAAudioHardwareStream::GetAvailableDataSourceByIndex(UInt32 inIndex) const
|
||||
{
|
||||
AudioStreamID theAnswer = 0;
|
||||
UInt32 theNumberSources = GetNumberAvailableDataSources();
|
||||
if((theNumberSources > 0) && (inIndex < theNumberSources))
|
||||
{
|
||||
CAAutoArrayDelete<UInt32> theSourceList(theNumberSources);
|
||||
GetAvailableDataSources(theNumberSources, theSourceList);
|
||||
theAnswer = theSourceList[inIndex];
|
||||
}
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
void CAAudioHardwareStream::GetAvailableDataSources(UInt32& ioNumberSources, UInt32* outSources) const
|
||||
{
|
||||
UInt32 theNumberSources = std::min(GetNumberAvailableDataSources(), ioNumberSources);
|
||||
UInt32 theSize = theNumberSources * sizeof(UInt32);
|
||||
GetPropertyData(0, kAudioDevicePropertyDataSources, theSize, outSources);
|
||||
ioNumberSources = theSize / sizeof(UInt32);
|
||||
UInt32* theFirstItem = &(outSources[0]);
|
||||
UInt32* theLastItem = theFirstItem + ioNumberSources;
|
||||
std::sort(theFirstItem, theLastItem);
|
||||
}
|
||||
|
||||
CFStringRef CAAudioHardwareStream::CopyDataSourceNameForID(UInt32 inID) const
|
||||
{
|
||||
CFStringRef theAnswer = NULL;
|
||||
AudioValueTranslation theTranslation = { &inID, sizeof(UInt32), &theAnswer, sizeof(CFStringRef) };
|
||||
UInt32 theSize = sizeof(AudioValueTranslation);
|
||||
GetPropertyData(0, kAudioDevicePropertyDataSourceNameForIDCFString, theSize, &theTranslation);
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
void CAAudioHardwareStream::GetCurrentIOProcFormat(AudioStreamBasicDescription& outFormat) const
|
||||
{
|
||||
memset(&outFormat, 0, sizeof(AudioStreamBasicDescription));
|
||||
UInt32 theSize = sizeof(AudioStreamBasicDescription);
|
||||
GetPropertyData(0, kAudioDevicePropertyStreamFormat, theSize, &outFormat);
|
||||
}
|
||||
|
||||
void CAAudioHardwareStream::SetCurrentIOProcFormat(const AudioStreamBasicDescription& inFormat)
|
||||
{
|
||||
UInt32 theSize = sizeof(AudioStreamBasicDescription);
|
||||
SetPropertyData(0, kAudioDevicePropertyStreamFormat, theSize, &inFormat);
|
||||
}
|
||||
|
||||
UInt32 CAAudioHardwareStream::GetNumberAvailableIOProcFormats() const
|
||||
{
|
||||
UInt32 theAnswer = GetPropertyDataSize(0, kAudioDevicePropertyStreamFormats);
|
||||
theAnswer /= sizeof(AudioStreamBasicDescription);
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
void CAAudioHardwareStream::GetAvailableIOProcFormats(UInt32& ioNumberFormats, AudioStreamBasicDescription* outFormats) const
|
||||
{
|
||||
UInt32 theSize = ioNumberFormats * sizeof(AudioStreamBasicDescription);
|
||||
GetPropertyData(0, kAudioDevicePropertyStreamFormats, theSize, outFormats);
|
||||
ioNumberFormats = theSize / sizeof(AudioStreamBasicDescription);
|
||||
}
|
||||
|
||||
void CAAudioHardwareStream::GetAvailableIOProcFormatByIndex(UInt32 inIndex, AudioStreamBasicDescription& outFormat) const
|
||||
{
|
||||
UInt32 theNumberFormats = GetNumberAvailableIOProcFormats();
|
||||
ThrowIf(inIndex >= theNumberFormats, CAException(kAudioHardwareIllegalOperationError), "CAAudioHardwareStream::GetAvailableIOProcFormatByIndex: index out of range");
|
||||
CAAutoArrayDelete<AudioStreamBasicDescription> theFormats(theNumberFormats);
|
||||
GetAvailableIOProcFormats(theNumberFormats, theFormats);
|
||||
outFormat = theFormats[inIndex];
|
||||
}
|
||||
|
||||
void CAAudioHardwareStream::GetCurrentPhysicalFormat(AudioStreamBasicDescription& outFormat) const
|
||||
{
|
||||
memset(&outFormat, 0, sizeof(AudioStreamBasicDescription));
|
||||
UInt32 theSize = sizeof(AudioStreamBasicDescription);
|
||||
GetPropertyData(0, kAudioStreamPropertyPhysicalFormat, theSize, &outFormat);
|
||||
}
|
||||
|
||||
void CAAudioHardwareStream::SetCurrentPhysicalFormat(const AudioStreamBasicDescription& inFormat)
|
||||
{
|
||||
UInt32 theSize = sizeof(AudioStreamBasicDescription);
|
||||
SetPropertyData(0, kAudioStreamPropertyPhysicalFormat, theSize, &inFormat);
|
||||
}
|
||||
|
||||
UInt32 CAAudioHardwareStream::GetNumberAvailablePhysicalFormats() const
|
||||
{
|
||||
UInt32 theAnswer = GetPropertyDataSize(0, kAudioStreamPropertyPhysicalFormats);
|
||||
theAnswer /= sizeof(AudioStreamBasicDescription);
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
void CAAudioHardwareStream::GetAvailablePhysicalFormats(UInt32& ioNumberFormats, AudioStreamBasicDescription* outFormats) const
|
||||
{
|
||||
UInt32 theSize = ioNumberFormats * sizeof(AudioStreamBasicDescription);
|
||||
GetPropertyData(0, kAudioStreamPropertyPhysicalFormats, theSize, outFormats);
|
||||
ioNumberFormats = theSize / sizeof(AudioStreamBasicDescription);
|
||||
}
|
||||
|
||||
void CAAudioHardwareStream::GetAvailablePhysicalFormatByIndex(UInt32 inIndex, AudioStreamBasicDescription& outFormat) const
|
||||
{
|
||||
UInt32 theNumberFormats = GetNumberAvailablePhysicalFormats();
|
||||
ThrowIf(inIndex >= theNumberFormats, CAException(kAudioHardwareIllegalOperationError), "CAAudioHardwareStream::GetAvailablePhysicalFormatByIndex: index out of range");
|
||||
CAAutoArrayDelete<AudioStreamBasicDescription> theFormats(theNumberFormats);
|
||||
GetAvailablePhysicalFormats(theNumberFormats, theFormats);
|
||||
outFormat = theFormats[inIndex];
|
||||
}
|
||||
|
||||
bool CAAudioHardwareStream::HasProperty(UInt32 inChannel, AudioHardwarePropertyID inPropertyID) const
|
||||
{
|
||||
OSStatus theError = AudioStreamGetPropertyInfo(GetAudioStreamID(), inChannel, inPropertyID, NULL, NULL);
|
||||
return theError == 0;
|
||||
}
|
||||
|
||||
bool CAAudioHardwareStream::PropertyIsSettable(UInt32 inChannel, AudioHardwarePropertyID inPropertyID) const
|
||||
{
|
||||
Boolean isWritable = false;
|
||||
OSStatus theError = AudioStreamGetPropertyInfo(GetAudioStreamID(), inChannel, inPropertyID, NULL, &isWritable);
|
||||
ThrowIfError(theError, CAException(theError), "CAAudioHardwareStream::PropertyIsSettable: got an error getting info about a property");
|
||||
return isWritable != 0;
|
||||
}
|
||||
|
||||
UInt32 CAAudioHardwareStream::GetPropertyDataSize(UInt32 inChannel, AudioHardwarePropertyID inPropertyID) const
|
||||
{
|
||||
UInt32 theSize = 0;
|
||||
OSStatus theError = AudioStreamGetPropertyInfo(GetAudioStreamID(), inChannel, inPropertyID, &theSize, NULL);
|
||||
ThrowIfError(theError, CAException(theError), "CAAudioHardwareStream::GetPropertyDataSize: got an error getting info about a property");
|
||||
return theSize;
|
||||
}
|
||||
|
||||
void CAAudioHardwareStream::GetPropertyData(UInt32 inChannel, AudioHardwarePropertyID inPropertyID, UInt32& ioDataSize, void* outData) const
|
||||
{
|
||||
OSStatus theError = AudioStreamGetProperty(GetAudioStreamID(), inChannel, inPropertyID, &ioDataSize, outData);
|
||||
ThrowIfError(theError, CAException(theError), "CAAudioHardwareStream::GetPropertyData: got an error getting the value of a property");
|
||||
}
|
||||
|
||||
void CAAudioHardwareStream::SetPropertyData(UInt32 inChannel, AudioHardwarePropertyID inPropertyID, UInt32 inDataSize, const void* inData, const AudioTimeStamp* inWhen)
|
||||
{
|
||||
OSStatus theError = AudioStreamSetProperty(GetAudioStreamID(), inWhen, inChannel, inPropertyID, inDataSize, inData);
|
||||
ThrowIfError(theError, CAException(theError), "CAAudioHardwareStream::SetPropertyData: got an error setting the value of a property");
|
||||
}
|
||||
|
||||
void CAAudioHardwareStream::AddPropertyListener(UInt32 inChannel, AudioHardwarePropertyID inPropertyID, AudioStreamPropertyListenerProc inListenerProc, void* inClientData)
|
||||
{
|
||||
OSStatus theError = AudioStreamAddPropertyListener(GetAudioStreamID(), inChannel, inPropertyID, inListenerProc, inClientData);
|
||||
ThrowIfError(theError, CAException(theError), "CAAudioHardwareStream::AddPropertyListener: got an error adding a property listener");
|
||||
}
|
||||
|
||||
void CAAudioHardwareStream::RemovePropertyListener(UInt32 inChannel, AudioHardwarePropertyID inPropertyID, AudioStreamPropertyListenerProc inListenerProc)
|
||||
{
|
||||
OSStatus theError = AudioStreamRemovePropertyListener(GetAudioStreamID(), inChannel, inPropertyID, inListenerProc);
|
||||
ThrowIfError(theError, CAException(theError), "CAAudioHardwareStream::RemovePropertyListener: got an error removing a property listener");
|
||||
}
|
||||
|
||||
void CAAudioHardwareStream::GetNameForTerminalType(UInt32 inTerminalType, char* outName)
|
||||
{
|
||||
switch(inTerminalType)
|
||||
{
|
||||
// types that go nowhere
|
||||
case OUTPUT_NULL:
|
||||
strcpy(outName, "Null Output");
|
||||
break;
|
||||
|
||||
case INPUT_NULL:
|
||||
strcpy(outName, "Null Input");
|
||||
break;
|
||||
|
||||
// Input terminal types
|
||||
case INPUT_UNDEFINED:
|
||||
strcpy(outName, "Undefined Input");
|
||||
break;
|
||||
|
||||
case INPUT_MICROPHONE:
|
||||
strcpy(outName, "Microphone");
|
||||
break;
|
||||
|
||||
case INPUT_DESKTOP_MICROPHONE:
|
||||
strcpy(outName, "Desktop Microphone");
|
||||
break;
|
||||
|
||||
case INPUT_PERSONAL_MICROPHONE:
|
||||
strcpy(outName, "Personal Microphone");
|
||||
break;
|
||||
|
||||
case INPUT_OMNIDIRECTIONAL_MICROPHONE:
|
||||
strcpy(outName, "Omnidirectional Microphone");
|
||||
break;
|
||||
|
||||
case INPUT_MICROPHONE_ARRAY:
|
||||
strcpy(outName, "Microphone Array");
|
||||
break;
|
||||
|
||||
case INPUT_PROCESSING_MICROPHONE_ARRAY:
|
||||
strcpy(outName, "Processing Microphone Array");
|
||||
break;
|
||||
|
||||
case INPUT_MODEM_AUDIO:
|
||||
strcpy(outName, "Modem");
|
||||
break;
|
||||
|
||||
// Output terminal types
|
||||
case OUTPUT_UNDEFINED:
|
||||
strcpy(outName, "Undefined Output");
|
||||
break;
|
||||
|
||||
case OUTPUT_SPEAKER:
|
||||
strcpy(outName, "Speaker");
|
||||
break;
|
||||
|
||||
case OUTPUT_HEADPHONES:
|
||||
strcpy(outName, "Headphones");
|
||||
break;
|
||||
|
||||
case OUTPUT_HEAD_MOUNTED_DISPLAY_AUDIO:
|
||||
strcpy(outName, "Head-Monted Display");
|
||||
break;
|
||||
|
||||
case OUTPUT_DESKTOP_SPEAKER:
|
||||
strcpy(outName, "Desktop Speaker");
|
||||
break;
|
||||
|
||||
case OUTPUT_ROOM_SPEAKER:
|
||||
strcpy(outName, "Room Speaker");
|
||||
break;
|
||||
|
||||
case OUTPUT_COMMUNICATION_SPEAKER:
|
||||
strcpy(outName, "Communication Speaker");
|
||||
break;
|
||||
|
||||
case OUTPUT_LOW_FREQUENCY_EFFECTS_SPEAKER:
|
||||
strcpy(outName, "LFE Speaker");
|
||||
break;
|
||||
|
||||
// Bi-directional terminal types
|
||||
case BIDIRECTIONAL_UNDEFINED:
|
||||
strcpy(outName, "Undefined Bidirectional");
|
||||
break;
|
||||
|
||||
case BIDIRECTIONAL_HANDSET:
|
||||
strcpy(outName, "Handset");
|
||||
break;
|
||||
|
||||
case BIDIRECTIONAL_HEADSET:
|
||||
strcpy(outName, "Headset");
|
||||
break;
|
||||
|
||||
case BIDIRECTIONAL_SPEAKERPHONE_NO_ECHO_REDX:
|
||||
strcpy(outName, "Speakerphone w/o Echo Reduction");
|
||||
break;
|
||||
|
||||
case BIDIRECTIONAL_ECHO_SUPPRESSING_SPEAKERPHONE:
|
||||
strcpy(outName, "Speakerphone w/ Echo Suppression");
|
||||
break;
|
||||
|
||||
case BIDIRECTIONAL_ECHO_CANCELING_SPEAKERPHONE:
|
||||
strcpy(outName, "Speakerphone w/ Echo Cacellation");
|
||||
break;
|
||||
|
||||
// Telephony terminal types
|
||||
case TELEPHONY_UNDEFINED:
|
||||
strcpy(outName, "Undefined telephony");
|
||||
break;
|
||||
|
||||
case TELEPHONY_PHONE_LINE:
|
||||
strcpy(outName, "Telephone Line");
|
||||
break;
|
||||
|
||||
case TELEPHONY_TELEPHONE:
|
||||
strcpy(outName, "Telephone");
|
||||
break;
|
||||
|
||||
case TELEPHONY_DOWN_LINE_PHONE:
|
||||
strcpy(outName, "Down Line Telephone");
|
||||
break;
|
||||
|
||||
// External terminal types
|
||||
case EXTERNAL_UNDEFINED:
|
||||
strcpy(outName, "Undefined External");
|
||||
break;
|
||||
|
||||
case EXTERNAL_ANALOG_CONNECTOR:
|
||||
strcpy(outName, "Analog");
|
||||
break;
|
||||
|
||||
case EXTERNAL_DIGITAL_AUDIO_INTERFACE:
|
||||
strcpy(outName, "Digital Interface");
|
||||
break;
|
||||
|
||||
case EXTERNAL_LINE_CONNECTOR:
|
||||
strcpy(outName, "Line");
|
||||
break;
|
||||
|
||||
case EXTERNAL_LEGACY_AUDIO_CONNECTOR:
|
||||
strcpy(outName, "Legacy");
|
||||
break;
|
||||
|
||||
case EXTERNAL_SPDIF_INTERFACE:
|
||||
strcpy(outName, "SPDIF");
|
||||
break;
|
||||
|
||||
case EXTERNAL_1394_DA_STREAM:
|
||||
strcpy(outName, "1394 Digital Audio");
|
||||
break;
|
||||
|
||||
case EXTERNAL_1394_DV_STREAM_SOUNDTRACK:
|
||||
strcpy(outName, "1394 Digital Video");
|
||||
break;
|
||||
|
||||
// Embedded terminal types
|
||||
case EMBEDDED_UNDEFINED:
|
||||
strcpy(outName, "Undefined Embedded");
|
||||
break;
|
||||
|
||||
case EMBEDDED_LEVEL_CALIBRATION_NOISE_SOURCE:
|
||||
strcpy(outName, "Level Calibration Noise Source");
|
||||
break;
|
||||
|
||||
case EMBEDDED_EQUALIZATION_NOISE:
|
||||
strcpy(outName, "Equalization Noise");
|
||||
break;
|
||||
|
||||
case EMBEDDED_CD_PLAYER:
|
||||
strcpy(outName, "CD Player");
|
||||
break;
|
||||
|
||||
case EMBEDDED_DAT:
|
||||
strcpy(outName, "DAT");
|
||||
break;
|
||||
|
||||
case EMBEDDED_DCC:
|
||||
strcpy(outName, "DCC");
|
||||
break;
|
||||
|
||||
case EMBEDDED_MINIDISK:
|
||||
strcpy(outName, "Minidisk");
|
||||
break;
|
||||
|
||||
case EMBEDDED_ANALOG_TAPE:
|
||||
strcpy(outName, "Analog Tape");
|
||||
break;
|
||||
|
||||
case EMBEDDED_PHONOGRAPH:
|
||||
strcpy(outName, "Phonograph");
|
||||
break;
|
||||
|
||||
case EMBEDDED_VCR_AUDIO:
|
||||
strcpy(outName, "VCR");
|
||||
break;
|
||||
|
||||
case EMBEDDED_VIDEO_DISC_AUDIO:
|
||||
strcpy(outName, "Video Disc");
|
||||
break;
|
||||
|
||||
case EMBEDDED_DVD_AUDIO:
|
||||
strcpy(outName, "DVD");
|
||||
break;
|
||||
|
||||
case EMBEDDED_TV_TUNER_AUDIO:
|
||||
strcpy(outName, "TV Tuner");
|
||||
break;
|
||||
|
||||
case EMBEDDED_SATELLITE_RECEIVER_AUDIO:
|
||||
strcpy(outName, "Satellite Receiver");
|
||||
break;
|
||||
|
||||
case EMBEDDED_CABLE_TUNER_AUDIO:
|
||||
strcpy(outName, "Cable Tuner");
|
||||
break;
|
||||
|
||||
case EMBEDDED_DSS_AUDIO:
|
||||
strcpy(outName, "DSS");
|
||||
break;
|
||||
|
||||
case EMBEDDED_RADIO_RECEIVER:
|
||||
strcpy(outName, "Radio Receiver");
|
||||
break;
|
||||
|
||||
case EMBEDDED_RADIO_TRANSMITTER:
|
||||
strcpy(outName, "Radio Transmitter");
|
||||
break;
|
||||
|
||||
case EMBEDDED_MULTITRACK_RECORDER:
|
||||
strcpy(outName, "Mutitrack Recorder");
|
||||
break;
|
||||
|
||||
case EMBEDDED_SYNTHESIZER:
|
||||
strcpy(outName, "Synthesizer");
|
||||
break;
|
||||
|
||||
// Processing terminal types
|
||||
case PROCESSOR_UNDEFINED:
|
||||
strcpy(outName, "Undefined Processor");
|
||||
break;
|
||||
|
||||
case PROCESSOR_GENERAL:
|
||||
strcpy(outName, "General Processor");
|
||||
break;
|
||||
|
||||
default:
|
||||
sprintf(outName, "0x%X", (unsigned int)inTerminalType);
|
||||
break;
|
||||
|
||||
};
|
||||
}
|
||||
@@ -1,121 +0,0 @@
|
||||
/* Copyright: © Copyright 2003 Apple Computer, Inc. All rights reserved.
|
||||
|
||||
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc.
|
||||
("Apple") in consideration of your agreement to the following terms, and your
|
||||
use, installation, modification or redistribution of this Apple software
|
||||
constitutes acceptance of these terms. If you do not agree with these terms,
|
||||
please do not use, install, modify or redistribute this Apple software.
|
||||
|
||||
In consideration of your agreement to abide by the following terms, and subject
|
||||
to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs
|
||||
copyrights in this original Apple software (the "Apple Software"), to use,
|
||||
reproduce, modify and redistribute the Apple Software, with or without
|
||||
modifications, in source and/or binary forms; provided that if you redistribute
|
||||
the Apple Software in its entirety and without modifications, you must retain
|
||||
this notice and the following text and disclaimers in all such redistributions of
|
||||
the Apple Software. Neither the name, trademarks, service marks or logos of
|
||||
Apple Computer, Inc. may be used to endorse or promote products derived from the
|
||||
Apple Software without specific prior written permission from Apple. Except as
|
||||
expressly stated in this notice, no other rights or licenses, express or implied,
|
||||
are granted by Apple herein, including but not limited to any patent rights that
|
||||
may be infringed by your derivative works or by other works in which the Apple
|
||||
Software may be incorporated.
|
||||
|
||||
The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO
|
||||
WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
|
||||
WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN
|
||||
COMBINATION WITH YOUR PRODUCTS.
|
||||
|
||||
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION
|
||||
OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT
|
||||
(INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN
|
||||
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
/*=============================================================================
|
||||
CAAudioHardwareStream.h
|
||||
|
||||
=============================================================================*/
|
||||
#if !defined(__CAAudioHardwareStream_h__)
|
||||
#define __CAAudioHardwareStream_h__
|
||||
|
||||
//=============================================================================
|
||||
// Includes
|
||||
//=============================================================================
|
||||
|
||||
// Local Includes
|
||||
#include "CAAudioHardwareDevice.h"
|
||||
|
||||
//=============================================================================
|
||||
// CAAudioHardwareStream
|
||||
//=============================================================================
|
||||
|
||||
class CAAudioHardwareStream
|
||||
{
|
||||
|
||||
// Construction/Destruction
|
||||
public:
|
||||
CAAudioHardwareStream(AudioStreamID inAudioStreamID);
|
||||
~CAAudioHardwareStream();
|
||||
|
||||
// General Operations
|
||||
public:
|
||||
AudioStreamID GetAudioStreamID() const { return mAudioStreamID; }
|
||||
CFStringRef CopyName() const;
|
||||
AudioDeviceID GetOwningDevice() const;
|
||||
CAAudioHardwareDeviceSectionID GetSection() const;
|
||||
UInt32 GetTerminalType() const;
|
||||
UInt32 GetStartingDeviceChannel() const;
|
||||
|
||||
bool HasIsConnectedStatus() const;
|
||||
bool GetIsConnectedStatus() const;
|
||||
|
||||
bool HasDataSourceControl() const;
|
||||
bool DataSourceControlIsSettable() const;
|
||||
UInt32 GetCurrentDataSourceID() const;
|
||||
void SetCurrentDataSourceByID(UInt32 inID);
|
||||
UInt32 GetNumberAvailableDataSources() const;
|
||||
UInt32 GetAvailableDataSourceByIndex(UInt32 inIndex) const;
|
||||
void GetAvailableDataSources(UInt32& ioNumberSources, UInt32* outSources) const;
|
||||
CFStringRef CopyDataSourceNameForID(UInt32 inID) const;
|
||||
|
||||
// Format Operations
|
||||
public:
|
||||
void GetCurrentIOProcFormat(AudioStreamBasicDescription& outFormat) const;
|
||||
void SetCurrentIOProcFormat(const AudioStreamBasicDescription& inFormat);
|
||||
UInt32 GetNumberAvailableIOProcFormats() const;
|
||||
void GetAvailableIOProcFormats(UInt32& ioNumberFormats, AudioStreamBasicDescription* outFormats) const;
|
||||
void GetAvailableIOProcFormatByIndex(UInt32 inIndex, AudioStreamBasicDescription& outFormat) const;
|
||||
|
||||
void GetCurrentPhysicalFormat(AudioStreamBasicDescription& outFormat) const;
|
||||
void SetCurrentPhysicalFormat(const AudioStreamBasicDescription& inFormat);
|
||||
UInt32 GetNumberAvailablePhysicalFormats() const;
|
||||
void GetAvailablePhysicalFormats(UInt32& ioNumberFormats, AudioStreamBasicDescription* outFormats) const;
|
||||
void GetAvailablePhysicalFormatByIndex(UInt32 inIndex, AudioStreamBasicDescription& outFormat) const;
|
||||
|
||||
// Property Operations
|
||||
public:
|
||||
bool HasProperty(UInt32 inChannel, AudioHardwarePropertyID inPropertyID) const;
|
||||
bool PropertyIsSettable(UInt32 inChannel, AudioHardwarePropertyID inPropertyID) const;
|
||||
|
||||
UInt32 GetPropertyDataSize(UInt32 inChannel, AudioHardwarePropertyID inPropertyID) const;
|
||||
void GetPropertyData(UInt32 inChannel, AudioHardwarePropertyID inPropertyID, UInt32& ioDataSize, void* outData) const;
|
||||
void SetPropertyData(UInt32 inChannel, AudioHardwarePropertyID inPropertyID, UInt32 inDataSize, const void* inData, const AudioTimeStamp* inWhen = NULL);
|
||||
|
||||
void AddPropertyListener(UInt32 inChannel, AudioHardwarePropertyID inPropertyID, AudioStreamPropertyListenerProc inListenerProc, void* inClientData);
|
||||
void RemovePropertyListener(UInt32 inChannel, AudioHardwarePropertyID inPropertyID, AudioStreamPropertyListenerProc inListenerProc);
|
||||
|
||||
// Utility Operations
|
||||
public:
|
||||
static void GetNameForTerminalType(UInt32 inTerminalType, char* outName);
|
||||
|
||||
// Implementation
|
||||
private:
|
||||
AudioStreamID mAudioStreamID;
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,264 +0,0 @@
|
||||
/* Copyright: © Copyright 2003 Apple Computer, Inc. All rights reserved.
|
||||
|
||||
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc.
|
||||
("Apple") in consideration of your agreement to the following terms, and your
|
||||
use, installation, modification or redistribution of this Apple software
|
||||
constitutes acceptance of these terms. If you do not agree with these terms,
|
||||
please do not use, install, modify or redistribute this Apple software.
|
||||
|
||||
In consideration of your agreement to abide by the following terms, and subject
|
||||
to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs
|
||||
copyrights in this original Apple software (the "Apple Software"), to use,
|
||||
reproduce, modify and redistribute the Apple Software, with or without
|
||||
modifications, in source and/or binary forms; provided that if you redistribute
|
||||
the Apple Software in its entirety and without modifications, you must retain
|
||||
this notice and the following text and disclaimers in all such redistributions of
|
||||
the Apple Software. Neither the name, trademarks, service marks or logos of
|
||||
Apple Computer, Inc. may be used to endorse or promote products derived from the
|
||||
Apple Software without specific prior written permission from Apple. Except as
|
||||
expressly stated in this notice, no other rights or licenses, express or implied,
|
||||
are granted by Apple herein, including but not limited to any patent rights that
|
||||
may be infringed by your derivative works or by other works in which the Apple
|
||||
Software may be incorporated.
|
||||
|
||||
The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO
|
||||
WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
|
||||
WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN
|
||||
COMBINATION WITH YOUR PRODUCTS.
|
||||
|
||||
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION
|
||||
OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT
|
||||
(INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN
|
||||
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
/*=============================================================================
|
||||
CAAudioHardwareSystem.cpp
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
//=============================================================================
|
||||
// Includes
|
||||
//=============================================================================
|
||||
|
||||
// Self Include
|
||||
#include "CAAudioHardwareSystem.h"
|
||||
|
||||
// PublicUtility Includes
|
||||
#include "CAAutoDisposer.h"
|
||||
#include "CADebugMacros.h"
|
||||
#include "CAException.h"
|
||||
|
||||
//=============================================================================
|
||||
// CAAudioHardwareSystem
|
||||
//=============================================================================
|
||||
|
||||
UInt32 CAAudioHardwareSystem::GetNumberDevices()
|
||||
{
|
||||
UInt32 theAnswer = GetPropertyDataSize(kAudioHardwarePropertyDevices);
|
||||
theAnswer /= sizeof(AudioDeviceID);
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
AudioDeviceID CAAudioHardwareSystem::GetDeviceAtIndex(UInt32 inIndex)
|
||||
{
|
||||
AudioDeviceID theAnswer = 0;
|
||||
UInt32 theNumberDevices = GetNumberDevices();
|
||||
if((theNumberDevices > 0) && (inIndex < theNumberDevices))
|
||||
{
|
||||
CAAutoArrayDelete<AudioDeviceID> theDeviceList(theNumberDevices);
|
||||
UInt32 theSize = theNumberDevices * sizeof(AudioDeviceID);
|
||||
GetPropertyData(kAudioHardwarePropertyDevices, theSize, theDeviceList);
|
||||
theAnswer = theDeviceList[inIndex];
|
||||
}
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
UInt32 CAAudioHardwareSystem::GetIndexForDevice(const AudioDeviceID inDevice)
|
||||
{
|
||||
UInt32 theAnswer = 0xFFFFFFFF;
|
||||
UInt32 theNumberDevices = GetNumberDevices();
|
||||
if(theNumberDevices > 0)
|
||||
{
|
||||
CAAutoArrayDelete<AudioDeviceID> theDeviceList(theNumberDevices);
|
||||
UInt32 theSize = theNumberDevices * sizeof(AudioDeviceID);
|
||||
GetPropertyData(kAudioHardwarePropertyDevices, theSize, theDeviceList);
|
||||
for(UInt32 theIndex = 0; theIndex < theNumberDevices; ++theIndex)
|
||||
{
|
||||
if(inDevice == theDeviceList[theIndex])
|
||||
{
|
||||
theAnswer = theIndex;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
AudioDeviceID CAAudioHardwareSystem::GetDeviceForUID(CFStringRef inUID)
|
||||
{
|
||||
AudioDeviceID theAnswer = 0;
|
||||
AudioValueTranslation theValue = { &inUID, sizeof(CFStringRef), &theAnswer, sizeof(AudioDeviceID) };
|
||||
UInt32 theSize = sizeof(AudioValueTranslation);
|
||||
GetPropertyData(kAudioHardwarePropertyDeviceForUID, theSize, &theValue);
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
AudioDeviceID CAAudioHardwareSystem::GetDefaultDevice(bool inIsInput, bool inIsSystem)
|
||||
{
|
||||
AudioDeviceID theAnswer = 0;
|
||||
AudioHardwarePropertyID thePropertyID = 0;
|
||||
if(inIsInput)
|
||||
{
|
||||
thePropertyID = kAudioHardwarePropertyDefaultInputDevice;
|
||||
}
|
||||
else if(inIsSystem)
|
||||
{
|
||||
thePropertyID = kAudioHardwarePropertyDefaultSystemOutputDevice;
|
||||
}
|
||||
else
|
||||
{
|
||||
thePropertyID = kAudioHardwarePropertyDefaultOutputDevice;
|
||||
}
|
||||
UInt32 theSize = sizeof(AudioDeviceID);
|
||||
GetPropertyData(thePropertyID, theSize, &theAnswer);
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
void CAAudioHardwareSystem::SetDefaultDevice(bool inIsInput, bool inIsSystem, AudioDeviceID inDevice)
|
||||
{
|
||||
AudioHardwarePropertyID thePropertyID = 0;
|
||||
if(inIsInput)
|
||||
{
|
||||
thePropertyID = kAudioHardwarePropertyDefaultInputDevice;
|
||||
}
|
||||
else if(inIsSystem)
|
||||
{
|
||||
thePropertyID = kAudioHardwarePropertyDefaultSystemOutputDevice;
|
||||
}
|
||||
else
|
||||
{
|
||||
thePropertyID = kAudioHardwarePropertyDefaultOutputDevice;
|
||||
}
|
||||
UInt32 theSize = sizeof(AudioDeviceID);
|
||||
SetPropertyData(thePropertyID, theSize, &inDevice);
|
||||
}
|
||||
|
||||
bool CAAudioHardwareSystem::HasBootChimeVolumeControl()
|
||||
{
|
||||
return HasProperty(kAudioHardwarePropertyBootChimeVolumeDecibels);
|
||||
}
|
||||
|
||||
Float32 CAAudioHardwareSystem::GetBootChimeVolumeControlValueAsScalar()
|
||||
{
|
||||
Float32 theAnswer = 0;
|
||||
UInt32 theSize = sizeof(Float32);
|
||||
GetPropertyData(kAudioHardwarePropertyBootChimeVolumeScalar, theSize, &theAnswer);
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
Float32 CAAudioHardwareSystem::GetBootChimeVolumeControlValueAsDB()
|
||||
{
|
||||
Float32 theAnswer = 0;
|
||||
UInt32 theSize = sizeof(Float32);
|
||||
GetPropertyData(kAudioHardwarePropertyBootChimeVolumeDecibels, theSize, &theAnswer);
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
void CAAudioHardwareSystem::GetBootChimeVolumeControlDBRange(Float32& outMinimum, Float32& outMaximum)
|
||||
{
|
||||
AudioValueRange theRange = { 0, 0 };
|
||||
UInt32 theSize = sizeof(AudioValueRange);
|
||||
GetPropertyData(kAudioHardwarePropertyBootChimeVolumeRangeDecibels, theSize, &theRange);
|
||||
outMinimum = theRange.mMinimum;
|
||||
outMaximum = theRange.mMaximum;
|
||||
}
|
||||
|
||||
void CAAudioHardwareSystem::SetBootChimeVolumeControlValueAsScalar(Float32 inScalarValue)
|
||||
{
|
||||
UInt32 theSize = sizeof(Float32);
|
||||
SetPropertyData(kAudioHardwarePropertyBootChimeVolumeScalar, theSize, &inScalarValue);
|
||||
}
|
||||
|
||||
void CAAudioHardwareSystem::SetBootChimeVolumeControlValueAsDB(Float32 inDBValue)
|
||||
{
|
||||
UInt32 theSize = sizeof(Float32);
|
||||
SetPropertyData(kAudioHardwarePropertyBootChimeVolumeDecibels, theSize, &inDBValue);
|
||||
}
|
||||
|
||||
Float32 CAAudioHardwareSystem::ConvertBootChimeVolumeControlScalarValueToDB(Float32 inScalarValue)
|
||||
{
|
||||
UInt32 theSize = sizeof(Float32);
|
||||
GetPropertyData(kAudioHardwarePropertyBootChimeVolumeScalarToDecibels, theSize, &inScalarValue);
|
||||
return inScalarValue;
|
||||
}
|
||||
|
||||
Float32 CAAudioHardwareSystem::ConvertBootChimeVolumeControlDBValueToScalar(Float32 inDBValue)
|
||||
{
|
||||
UInt32 theSize = sizeof(Float32);
|
||||
GetPropertyData(kAudioHardwarePropertyBootChimeVolumeDecibelsToScalar, theSize, &inDBValue);
|
||||
return inDBValue;
|
||||
}
|
||||
|
||||
bool CAAudioHardwareSystem::AllowsIdleSleepDuringIO()
|
||||
{
|
||||
UInt32 theValue = 0;
|
||||
UInt32 theSize = sizeof(UInt32);
|
||||
GetPropertyData(kAudioHardwarePropertySleepingIsAllowed, theSize, &theValue);
|
||||
return theValue != 0;
|
||||
}
|
||||
|
||||
void CAAudioHardwareSystem::SetAllowsIdleSleepDuringIO(bool inAllowIdleSleep)
|
||||
{
|
||||
UInt32 theValue = inAllowIdleSleep ? 1 : 0;
|
||||
SetPropertyData(kAudioHardwarePropertySleepingIsAllowed, sizeof(UInt32), &theValue);
|
||||
}
|
||||
|
||||
bool CAAudioHardwareSystem::HasProperty(AudioHardwarePropertyID inPropertyID)
|
||||
{
|
||||
OSStatus theError = AudioHardwareGetPropertyInfo(inPropertyID, NULL, NULL);
|
||||
return theError == 0;
|
||||
}
|
||||
|
||||
bool CAAudioHardwareSystem::PropertyIsSettable(AudioHardwarePropertyID inPropertyID)
|
||||
{
|
||||
Boolean isWritable = false;
|
||||
OSStatus theError = AudioHardwareGetPropertyInfo(inPropertyID, NULL, &isWritable);
|
||||
ThrowIfError(theError, CAException(theError), "CAAudioHardwareSystem::PropertyIsSettable: got an error getting info about a property");
|
||||
return isWritable != 0;
|
||||
}
|
||||
|
||||
UInt32 CAAudioHardwareSystem::GetPropertyDataSize(AudioHardwarePropertyID inPropertyID)
|
||||
{
|
||||
UInt32 theSize = 0;
|
||||
OSStatus theError = AudioHardwareGetPropertyInfo(inPropertyID, &theSize, NULL);
|
||||
ThrowIfError(theError, CAException(theError), "CAAudioHardwareSystem::GetPropertyDataSize: got an error getting info about a property");
|
||||
return theSize;
|
||||
}
|
||||
|
||||
void CAAudioHardwareSystem::GetPropertyData(AudioHardwarePropertyID inPropertyID, UInt32& ioDataSize, void* outData)
|
||||
{
|
||||
OSStatus theError = AudioHardwareGetProperty(inPropertyID, &ioDataSize, outData);
|
||||
ThrowIfError(theError, CAException(theError), "CAAudioHardwareSystem::GetPropertyData: got an error getting the value of a property");
|
||||
}
|
||||
|
||||
void CAAudioHardwareSystem::SetPropertyData(AudioHardwarePropertyID inPropertyID, UInt32 inDataSize, const void* inData)
|
||||
{
|
||||
OSStatus theError = AudioHardwareSetProperty(inPropertyID, inDataSize, const_cast<void*>(inData));
|
||||
ThrowIfError(theError, CAException(theError), "CAAudioHardwareSystem::SetPropertyData: got an error setting the value of a property");
|
||||
}
|
||||
|
||||
void CAAudioHardwareSystem::AddPropertyListener(AudioHardwarePropertyID inPropertyID, AudioHardwarePropertyListenerProc inListenerProc, void* inClientData)
|
||||
{
|
||||
OSStatus theError = AudioHardwareAddPropertyListener(inPropertyID, inListenerProc, inClientData);
|
||||
ThrowIfError(theError, CAException(theError), "CAAudioHardwareSystem::AddPropertyListener: got an error adding a property listener");
|
||||
}
|
||||
|
||||
void CAAudioHardwareSystem::RemovePropertyListener(AudioHardwarePropertyID inPropertyID, AudioHardwarePropertyListenerProc inListenerProc)
|
||||
{
|
||||
OSStatus theError = AudioHardwareRemovePropertyListener(inPropertyID, inListenerProc);
|
||||
ThrowIfError(theError, CAException(theError), "CAAudioHardwareSystem::RemovePropertyListener: got an error removing a property listener");
|
||||
}
|
||||
@@ -1,96 +0,0 @@
|
||||
/* Copyright: © Copyright 2003 Apple Computer, Inc. All rights reserved.
|
||||
|
||||
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc.
|
||||
("Apple") in consideration of your agreement to the following terms, and your
|
||||
use, installation, modification or redistribution of this Apple software
|
||||
constitutes acceptance of these terms. If you do not agree with these terms,
|
||||
please do not use, install, modify or redistribute this Apple software.
|
||||
|
||||
In consideration of your agreement to abide by the following terms, and subject
|
||||
to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs
|
||||
copyrights in this original Apple software (the "Apple Software"), to use,
|
||||
reproduce, modify and redistribute the Apple Software, with or without
|
||||
modifications, in source and/or binary forms; provided that if you redistribute
|
||||
the Apple Software in its entirety and without modifications, you must retain
|
||||
this notice and the following text and disclaimers in all such redistributions of
|
||||
the Apple Software. Neither the name, trademarks, service marks or logos of
|
||||
Apple Computer, Inc. may be used to endorse or promote products derived from the
|
||||
Apple Software without specific prior written permission from Apple. Except as
|
||||
expressly stated in this notice, no other rights or licenses, express or implied,
|
||||
are granted by Apple herein, including but not limited to any patent rights that
|
||||
may be infringed by your derivative works or by other works in which the Apple
|
||||
Software may be incorporated.
|
||||
|
||||
The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO
|
||||
WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
|
||||
WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN
|
||||
COMBINATION WITH YOUR PRODUCTS.
|
||||
|
||||
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION
|
||||
OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT
|
||||
(INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN
|
||||
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
/*=============================================================================
|
||||
CAAudioHardwareSystem.h
|
||||
|
||||
=============================================================================*/
|
||||
#if !defined(__CAAudioHardwareSystem_h__)
|
||||
#define __CAAudioHardwareSystem_h__
|
||||
|
||||
//=============================================================================
|
||||
// Includes
|
||||
//=============================================================================
|
||||
|
||||
// System Includes
|
||||
#include <CoreFoundation/CoreFoundation.h>
|
||||
#include <CoreAudio/CoreAudio.h>
|
||||
|
||||
//=============================================================================
|
||||
// CAAudioHardwareSystem
|
||||
//=============================================================================
|
||||
|
||||
class CAAudioHardwareSystem
|
||||
{
|
||||
|
||||
// Operations
|
||||
public:
|
||||
static UInt32 GetNumberDevices();
|
||||
static AudioDeviceID GetDeviceAtIndex(UInt32 inIndex);
|
||||
static UInt32 GetIndexForDevice(const AudioDeviceID inDevice);
|
||||
static AudioDeviceID GetDeviceForUID(CFStringRef inUID);
|
||||
|
||||
static AudioDeviceID GetDefaultDevice(bool inIsInput, bool inIsSystem);
|
||||
static void SetDefaultDevice(bool inIsInput, bool inIsSystem, AudioDeviceID inDevice);
|
||||
|
||||
static bool HasBootChimeVolumeControl();
|
||||
static Float32 GetBootChimeVolumeControlValueAsScalar();
|
||||
static Float32 GetBootChimeVolumeControlValueAsDB();
|
||||
static void GetBootChimeVolumeControlDBRange(Float32& outMinimum, Float32& outMaximum);
|
||||
static void SetBootChimeVolumeControlValueAsScalar(Float32 inScalarValue);
|
||||
static void SetBootChimeVolumeControlValueAsDB(Float32 inDBValue);
|
||||
static Float32 ConvertBootChimeVolumeControlScalarValueToDB(Float32 inScalarValue);
|
||||
static Float32 ConvertBootChimeVolumeControlDBValueToScalar(Float32 inDBValue);
|
||||
|
||||
static bool AllowsIdleSleepDuringIO();
|
||||
static void SetAllowsIdleSleepDuringIO(bool inAllowIdleSleep);
|
||||
|
||||
// Property Operations
|
||||
public:
|
||||
static bool HasProperty(AudioHardwarePropertyID inPropertyID);
|
||||
static bool PropertyIsSettable(AudioHardwarePropertyID inPropertyID);
|
||||
|
||||
static UInt32 GetPropertyDataSize(AudioHardwarePropertyID inPropertyID);
|
||||
static void GetPropertyData(AudioHardwarePropertyID inPropertyID, UInt32& ioDataSize, void* outData);
|
||||
static void SetPropertyData(AudioHardwarePropertyID inPropertyID, UInt32 inDataSize, const void* inData);
|
||||
|
||||
static void AddPropertyListener(AudioHardwarePropertyID inPropertyID, AudioHardwarePropertyListenerProc inListenerProc, void* inClientData);
|
||||
static void RemovePropertyListener(AudioHardwarePropertyID inPropertyID, AudioHardwarePropertyListenerProc inListenerProc);
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,119 +0,0 @@
|
||||
/* Copyright: © Copyright 2003 Apple Computer, Inc. All rights reserved.
|
||||
|
||||
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc.
|
||||
("Apple") in consideration of your agreement to the following terms, and your
|
||||
use, installation, modification or redistribution of this Apple software
|
||||
constitutes acceptance of these terms. If you do not agree with these terms,
|
||||
please do not use, install, modify or redistribute this Apple software.
|
||||
|
||||
In consideration of your agreement to abide by the following terms, and subject
|
||||
to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs
|
||||
copyrights in this original Apple software (the "Apple Software"), to use,
|
||||
reproduce, modify and redistribute the Apple Software, with or without
|
||||
modifications, in source and/or binary forms; provided that if you redistribute
|
||||
the Apple Software in its entirety and without modifications, you must retain
|
||||
this notice and the following text and disclaimers in all such redistributions of
|
||||
the Apple Software. Neither the name, trademarks, service marks or logos of
|
||||
Apple Computer, Inc. may be used to endorse or promote products derived from the
|
||||
Apple Software without specific prior written permission from Apple. Except as
|
||||
expressly stated in this notice, no other rights or licenses, express or implied,
|
||||
are granted by Apple herein, including but not limited to any patent rights that
|
||||
may be infringed by your derivative works or by other works in which the Apple
|
||||
Software may be incorporated.
|
||||
|
||||
The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO
|
||||
WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
|
||||
WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN
|
||||
COMBINATION WITH YOUR PRODUCTS.
|
||||
|
||||
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION
|
||||
OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT
|
||||
(INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN
|
||||
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
/*=============================================================================
|
||||
CAAutoDisposer.h
|
||||
|
||||
=============================================================================*/
|
||||
#if !defined(__CAAutoDisposer_h__)
|
||||
#define __CAAutoDisposer_h__
|
||||
|
||||
//=============================================================================
|
||||
// Includes
|
||||
//=============================================================================
|
||||
|
||||
#include <cstdlib>
|
||||
#include <new>
|
||||
|
||||
//=============================================================================
|
||||
// CAAutoFree
|
||||
//=============================================================================
|
||||
|
||||
template <class T>
|
||||
class CAAutoFree
|
||||
{
|
||||
|
||||
// Construction/Destruction
|
||||
public:
|
||||
CAAutoFree(UInt32 inSize) { mPointer = static_cast<T*>(malloc(inSize)); if(mPointer == NULL) { throw std::bad_alloc(); } }
|
||||
CAAutoFree(void* inPointer) : mPointer(static_cast<T*>(inPointer)) {}
|
||||
CAAutoFree(T* inPointer) : mPointer(inPointer) {}
|
||||
~CAAutoFree() { free(mPointer); }
|
||||
operator T*() const { return mPointer; }
|
||||
T& operator*() const { return *mPointer; }
|
||||
T* operator->() const { return mPointer; }
|
||||
T& operator[](int inIndex) const { return mPointer[inIndex]; }
|
||||
|
||||
private:
|
||||
T* mPointer;
|
||||
|
||||
};
|
||||
|
||||
//=============================================================================
|
||||
// CAAutoDelete
|
||||
//=============================================================================
|
||||
|
||||
template <class T>
|
||||
class CAAutoDelete
|
||||
{
|
||||
|
||||
// Construction/Destruction
|
||||
public:
|
||||
CAAutoDelete() { mPointer = new T; }
|
||||
CAAutoDelete(T* inPointer) : mPointer(inPointer) {}
|
||||
~CAAutoDelete() { delete mPointer; }
|
||||
operator T*() const { return mPointer; }
|
||||
T& operator*() const { return *mPointer; }
|
||||
T* operator->() const { return mPointer; }
|
||||
|
||||
private:
|
||||
T* mPointer;
|
||||
|
||||
};
|
||||
|
||||
//=============================================================================
|
||||
// CAAutoArrayDelete
|
||||
//=============================================================================
|
||||
|
||||
template <class T>
|
||||
class CAAutoArrayDelete
|
||||
{
|
||||
|
||||
// Construction/Destruction
|
||||
public:
|
||||
CAAutoArrayDelete(UInt32 inNumberItems) { mPointer = new T[inNumberItems]; }
|
||||
CAAutoArrayDelete(T* inPointer) : mPointer(inPointer) {}
|
||||
~CAAutoArrayDelete() { delete[] mPointer; }
|
||||
operator T*() const { return mPointer; }
|
||||
T& operator[](int inIndex) const { return mPointer[inIndex]; }
|
||||
|
||||
private:
|
||||
T* mPointer;
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,71 +0,0 @@
|
||||
/* Copyright: © Copyright 2003 Apple Computer, Inc. All rights reserved.
|
||||
|
||||
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc.
|
||||
("Apple") in consideration of your agreement to the following terms, and your
|
||||
use, installation, modification or redistribution of this Apple software
|
||||
constitutes acceptance of these terms. If you do not agree with these terms,
|
||||
please do not use, install, modify or redistribute this Apple software.
|
||||
|
||||
In consideration of your agreement to abide by the following terms, and subject
|
||||
to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs
|
||||
copyrights in this original Apple software (the "Apple Software"), to use,
|
||||
reproduce, modify and redistribute the Apple Software, with or without
|
||||
modifications, in source and/or binary forms; provided that if you redistribute
|
||||
the Apple Software in its entirety and without modifications, you must retain
|
||||
this notice and the following text and disclaimers in all such redistributions of
|
||||
the Apple Software. Neither the name, trademarks, service marks or logos of
|
||||
Apple Computer, Inc. may be used to endorse or promote products derived from the
|
||||
Apple Software without specific prior written permission from Apple. Except as
|
||||
expressly stated in this notice, no other rights or licenses, express or implied,
|
||||
are granted by Apple herein, including but not limited to any patent rights that
|
||||
may be infringed by your derivative works or by other works in which the Apple
|
||||
Software may be incorporated.
|
||||
|
||||
The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO
|
||||
WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
|
||||
WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN
|
||||
COMBINATION WITH YOUR PRODUCTS.
|
||||
|
||||
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION
|
||||
OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT
|
||||
(INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN
|
||||
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
/*=============================================================================
|
||||
CAConditionalMacros.h
|
||||
|
||||
=============================================================================*/
|
||||
#if !defined(__CAConditionalMacros_h__)
|
||||
#define __CAConditionalMacros_h__
|
||||
|
||||
//=============================================================================
|
||||
// This file exists to make figuring out how to include system headers
|
||||
// easier in a cross platform world. We throw in an include of the standard
|
||||
// ConditionalMacros too.
|
||||
//=============================================================================
|
||||
|
||||
// TargetConditionals.h defines the bare minimum we need
|
||||
#include "TargetConditionals.h"
|
||||
|
||||
// Determine whether or not to use framework style includes for system headers
|
||||
#if !defined(CoreAudio_Use_Framework_Includes)
|
||||
#if TARGET_OS_MAC && TARGET_RT_MAC_MACHO
|
||||
#define CoreAudio_Use_Framework_Includes 1
|
||||
#else
|
||||
#define CoreAudio_Use_Framework_Includes 0
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// Include the regular ConditionalMacros.h too, since it has useful stuff that
|
||||
// TargetConditionals.h lacks for some reason.
|
||||
#if CoreAudio_Use_Framework_Includes
|
||||
#include <CoreServices/../Frameworks/CarbonCore.framework/Headers/ConditionalMacros.h>
|
||||
#else
|
||||
#include "ConditionalMacros.h"
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -1,247 +0,0 @@
|
||||
/* Copyright: © Copyright 2003 Apple Computer, Inc. All rights reserved.
|
||||
|
||||
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc.
|
||||
("Apple") in consideration of your agreement to the following terms, and your
|
||||
use, installation, modification or redistribution of this Apple software
|
||||
constitutes acceptance of these terms. If you do not agree with these terms,
|
||||
please do not use, install, modify or redistribute this Apple software.
|
||||
|
||||
In consideration of your agreement to abide by the following terms, and subject
|
||||
to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs
|
||||
copyrights in this original Apple software (the "Apple Software"), to use,
|
||||
reproduce, modify and redistribute the Apple Software, with or without
|
||||
modifications, in source and/or binary forms; provided that if you redistribute
|
||||
the Apple Software in its entirety and without modifications, you must retain
|
||||
this notice and the following text and disclaimers in all such redistributions of
|
||||
the Apple Software. Neither the name, trademarks, service marks or logos of
|
||||
Apple Computer, Inc. may be used to endorse or promote products derived from the
|
||||
Apple Software without specific prior written permission from Apple. Except as
|
||||
expressly stated in this notice, no other rights or licenses, express or implied,
|
||||
are granted by Apple herein, including but not limited to any patent rights that
|
||||
may be infringed by your derivative works or by other works in which the Apple
|
||||
Software may be incorporated.
|
||||
|
||||
The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO
|
||||
WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
|
||||
WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN
|
||||
COMBINATION WITH YOUR PRODUCTS.
|
||||
|
||||
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION
|
||||
OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT
|
||||
(INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN
|
||||
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
/*=============================================================================
|
||||
CADebugMacros.h
|
||||
|
||||
=============================================================================*/
|
||||
#if !defined(__CADebugMacros_h__)
|
||||
#define __CADebugMacros_h__
|
||||
|
||||
//=============================================================================
|
||||
// CADebugMacros
|
||||
//=============================================================================
|
||||
|
||||
//#define CoreAudio_StopOnFailure 1
|
||||
//#define CoreAudio_TimeStampMessages 1
|
||||
//#define CoreAudio_ThreadStampMessages 1
|
||||
//#define CoreAudio_FlushDebugMessages 1
|
||||
|
||||
#define CA4CCToCString(the4CC) { ((char*)&the4CC)[0], ((char*)&the4CC)[1], ((char*)&the4CC)[2], ((char*)&the4CC)[3], 0 }
|
||||
|
||||
#if DEBUG || CoreAudio_Debug
|
||||
|
||||
// can be used to break into debugger immediately, also see CADebugger
|
||||
#define BusError() (*(long *)0 = 0)
|
||||
|
||||
// basic debugging print routines
|
||||
#if TARGET_OS_MAC && !TARGET_API_MAC_CARBON
|
||||
extern pascal void DebugStr(const unsigned char* debuggerMsg);
|
||||
#define DebugMessage(msg) DebugStr("\p"msg)
|
||||
#define DebugMessageN1(msg, N1)
|
||||
#define DebugMessageN2(msg, N1, N2)
|
||||
#define DebugMessageN3(msg, N1, N2, N3)
|
||||
#else
|
||||
#include "CADebugPrintf.h"
|
||||
|
||||
#if CoreAudio_FlushDebugMessages && !CoreAudio_UseSysLog
|
||||
#define FlushRtn ;fflush(DebugPrintfFile)
|
||||
#else
|
||||
#define FlushRtn
|
||||
#endif
|
||||
|
||||
#if CoreAudio_ThreadStampMessages
|
||||
#include <pthread.h>
|
||||
extern "C" {
|
||||
#include <mach/mach_time.h>
|
||||
}
|
||||
#define DebugMessage(msg) DebugPrintfRtn(DebugPrintfFile, "%p %qd: %s\n", pthread_self(), mach_absolute_time(), msg) FlushRtn
|
||||
#define DebugMessageN1(msg, N1) DebugPrintfRtn(DebugPrintfFile, "%p %.qd: "msg"\n", pthread_self(), mach_absolute_time(), N1) FlushRtn
|
||||
#define DebugMessageN2(msg, N1, N2) DebugPrintfRtn(DebugPrintfFile, "%p %.qd: "msg"\n", pthread_self(), mach_absolute_time(), N1, N2) FlushRtn
|
||||
#define DebugMessageN3(msg, N1, N2, N3) DebugPrintfRtn(DebugPrintfFile, "%p %.qd: "msg"\n", pthread_self(), mach_absolute_time(), N1, N2, N3) FlushRtn
|
||||
#define DebugMessageN4(msg, N1, N2, N3, N4) DebugPrintfRtn(DebugPrintfFile, "%p %.qd: "msg"\n", pthread_self(), mach_absolute_time(), N1, N2, N3, N4) FlushRtn
|
||||
#define DebugMessageN5(msg, N1, N2, N3, N4, N5) DebugPrintfRtn(DebugPrintfFile, "%p %.qd: "msg"\n", pthread_self(), mach_absolute_time(), N1, N2, N3, N4, N5) FlushRtn
|
||||
#define DebugMessageN6(msg, N1, N2, N3, N4, N5, N6) DebugPrintfRtn(DebugPrintfFile, "%p %.qd: "msg"\n", pthread_self(), mach_absolute_time(), N1, N2, N3, N4, N5, N6) FlushRtn
|
||||
#define DebugMessageN7(msg, N1, N2, N3, N4, N5, N6, N7) DebugPrintfRtn(DebugPrintfFile, "%p %.qd: "msg"\n", pthread_self(), mach_absolute_time(), N1, N2, N3, N4, N5, N6, N7) FlushRtn
|
||||
#define DebugMessageN8(msg, N1, N2, N3, N4, N5, N6, N7, N8) DebugPrintfRtn(DebugPrintfFile, "%p %.qd: "msg"\n", pthread_self(), mach_absolute_time(), N1, N2, N3, N4, N5, N6, N7, N8) FlushRtn
|
||||
#define DebugMessageN9(msg, N1, N2, N3, N4, N5, N6, N7, N8, N9) DebugPrintfRtn(DebugPrintfFile, "%p %.qd: "msg"\n", pthread_self(), mach_absolute_time(), N1, N2, N3, N4, N5, N6, N7, N8, N9) FlushRtn
|
||||
#elif CoreAudio_TimeStampMessages
|
||||
extern "C" {
|
||||
#include <mach/mach_time.h>
|
||||
}
|
||||
#define DebugMessage(msg) DebugPrintfRtn(DebugPrintfFile, "%qd: %s\n", pthread_self(), mach_absolute_time(), msg) FlushRtn
|
||||
#define DebugMessageN1(msg, N1) DebugPrintfRtn(DebugPrintfFile, "%qd: "msg"\n", mach_absolute_time(), N1) FlushRtn
|
||||
#define DebugMessageN2(msg, N1, N2) DebugPrintfRtn(DebugPrintfFile, "%qd: "msg"\n", mach_absolute_time(), N1, N2) FlushRtn
|
||||
#define DebugMessageN3(msg, N1, N2, N3) DebugPrintfRtn(DebugPrintfFile, "%qd: "msg"\n", mach_absolute_time(), N1, N2, N3) FlushRtn
|
||||
#define DebugMessageN4(msg, N1, N2, N3, N4) DebugPrintfRtn(DebugPrintfFile, "%qd: "msg"\n", mach_absolute_time(), N1, N2, N3, N4) FlushRtn
|
||||
#define DebugMessageN5(msg, N1, N2, N3, N4, N5) DebugPrintfRtn(DebugPrintfFile, "%qd: "msg"\n", mach_absolute_time(), N1, N2, N3, N4, N5) FlushRtn
|
||||
#define DebugMessageN6(msg, N1, N2, N3, N4, N5, N6) DebugPrintfRtn(DebugPrintfFile, "%qd: "msg"\n", mach_absolute_time(), N1, N2, N3, N4, N5, N6) FlushRtn
|
||||
#define DebugMessageN7(msg, N1, N2, N3, N4, N5, N6, N7) DebugPrintfRtn(DebugPrintfFile, "%qd: "msg"\n", mach_absolute_time(), N1, N2, N3, N4, N5, N6, N7) FlushRtn
|
||||
#define DebugMessageN8(msg, N1, N2, N3, N4, N5, N6, N7, N8) DebugPrintfRtn(DebugPrintfFile, "%qd: "msg"\n", mach_absolute_time(), N1, N2, N3, N4, N5, N6, N7, N8) FlushRtn
|
||||
#define DebugMessageN9(msg, N1, N2, N3, N4, N5, N6, N7, N8, N9) DebugPrintfRtn(DebugPrintfFile, "%qd: "msg"\n", mach_absolute_time(), N1, N2, N3, N4, N5, N6, N7, N8, N9) FlushRtn
|
||||
#else
|
||||
#define DebugMessage(msg) DebugPrintfRtn(DebugPrintfFile, "%s\n", msg) FlushRtn
|
||||
#define DebugMessageN1(msg, N1) DebugPrintfRtn(DebugPrintfFile, msg"\n", N1) FlushRtn
|
||||
#define DebugMessageN2(msg, N1, N2) DebugPrintfRtn(DebugPrintfFile, msg"\n", N1, N2) FlushRtn
|
||||
#define DebugMessageN3(msg, N1, N2, N3) DebugPrintfRtn(DebugPrintfFile, msg"\n", N1, N2, N3) FlushRtn
|
||||
#define DebugMessageN4(msg, N1, N2, N3, N4) DebugPrintfRtn(DebugPrintfFile, msg"\n", N1, N2, N3, N4) FlushRtn
|
||||
#define DebugMessageN5(msg, N1, N2, N3, N4, N5) DebugPrintfRtn(DebugPrintfFile, msg"\n", N1, N2, N3, N4, N5) FlushRtn
|
||||
#define DebugMessageN6(msg, N1, N2, N3, N4, N5, N6) DebugPrintfRtn(DebugPrintfFile, msg"\n", N1, N2, N3, N4, N5, N6) FlushRtn
|
||||
#define DebugMessageN7(msg, N1, N2, N3, N4, N5, N6, N7) DebugPrintfRtn(DebugPrintfFile, msg"\n", N1, N2, N3, N4, N5, N6, N7) FlushRtn
|
||||
#define DebugMessageN8(msg, N1, N2, N3, N4, N5, N6, N7, N8) DebugPrintfRtn(DebugPrintfFile, msg"\n", N1, N2, N3, N4, N5, N6, N7, N8) FlushRtn
|
||||
#define DebugMessageN9(msg, N1, N2, N3, N4, N5, N6, N7, N8, N9) DebugPrintfRtn(DebugPrintfFile, msg"\n", N1, N2, N3, N4, N5, N6, N7, N8, N9) FlushRtn
|
||||
#endif
|
||||
#endif
|
||||
void DebugPrint(const char *fmt, ...); // can be used like printf
|
||||
#define DEBUGPRINT(msg) DebugPrint msg // have to double-parenthesize arglist (see Debugging.h)
|
||||
#if VERBOSE
|
||||
#define vprint(msg) DEBUGPRINT(msg)
|
||||
#else
|
||||
#define vprint(msg)
|
||||
#endif
|
||||
|
||||
#if CoreAudio_StopOnFailure
|
||||
#include "CADebugger.h"
|
||||
#define STOP CADebuggerStop()
|
||||
#else
|
||||
#define STOP
|
||||
#endif
|
||||
|
||||
#else
|
||||
#define DebugMessage(msg)
|
||||
#define DebugMessageN1(msg, N1)
|
||||
#define DebugMessageN2(msg, N1, N2)
|
||||
#define DebugMessageN3(msg, N1, N2, N3)
|
||||
#define DebugMessageN4(msg, N1, N2, N3, N4)
|
||||
#define DebugMessageN5(msg, N1, N2, N3, N4, N5)
|
||||
#define DebugMessageN6(msg, N1, N2, N3, N4, N5, N6)
|
||||
#define DebugMessageN7(msg, N1, N2, N3, N4, N5, N6, N7)
|
||||
#define DebugMessageN8(msg, N1, N2, N3, N4, N5, N6, N7, N8)
|
||||
#define DebugMessageN9(msg, N1, N2, N3, N4, N5, N6, N7, N8, N9)
|
||||
#define DEBUGPRINT(msg)
|
||||
#define vprint(msg)
|
||||
#define STOP
|
||||
#endif
|
||||
|
||||
void LogError(const char *fmt, ...); // writes to syslog (and stderr if debugging)
|
||||
|
||||
#define Assert(inCondition, inMessage) \
|
||||
if(!(inCondition)) \
|
||||
{ \
|
||||
DebugMessage(inMessage); \
|
||||
STOP; \
|
||||
}
|
||||
|
||||
#define AssertNoError(inError, inMessage) \
|
||||
{ \
|
||||
SInt32 __E__err = (inError); \
|
||||
if(__E__err != 0) \
|
||||
{ \
|
||||
DebugMessageN1(inMessage ", Error: %ld", __E__err); \
|
||||
STOP; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define AssertNoKernelError(inError, inMessage) \
|
||||
{ \
|
||||
unsigned int __E__err = (unsigned int)(inError); \
|
||||
if(__E__err != 0) \
|
||||
{ \
|
||||
DebugMessageN1(inMessage ", Error: 0x%X", __E__err); \
|
||||
STOP; \
|
||||
} \
|
||||
}
|
||||
|
||||
#define FailIf(inCondition, inHandler, inMessage) \
|
||||
if(inCondition) \
|
||||
{ \
|
||||
DebugMessage(inMessage); \
|
||||
STOP; \
|
||||
goto inHandler; \
|
||||
}
|
||||
|
||||
#define FailWithAction(inCondition, inAction, inHandler, inMessage) \
|
||||
if(inCondition) \
|
||||
{ \
|
||||
DebugMessage(inMessage); \
|
||||
STOP; \
|
||||
{ inAction; } \
|
||||
goto inHandler; \
|
||||
}
|
||||
|
||||
#if defined(__cplusplus)
|
||||
|
||||
#define ThrowIf(inCondition, inException, inMessage) \
|
||||
if(inCondition) \
|
||||
{ \
|
||||
DebugMessage(inMessage); \
|
||||
STOP; \
|
||||
throw (inException); \
|
||||
}
|
||||
|
||||
#define ThrowIfNULL(inPointer, inException, inMessage) \
|
||||
if((inPointer) == NULL) \
|
||||
{ \
|
||||
DebugMessage(inMessage); \
|
||||
STOP; \
|
||||
throw (inException); \
|
||||
}
|
||||
|
||||
#define ThrowIfKernelError(inKernelError, inException, inMessage) \
|
||||
{ \
|
||||
kern_return_t __E__err = (inKernelError); \
|
||||
if(__E__err != 0) \
|
||||
{ \
|
||||
DebugMessageN1(inMessage ", Error: 0x%X", __E__err); \
|
||||
STOP; \
|
||||
throw (inException); \
|
||||
} \
|
||||
}
|
||||
|
||||
#define ThrowIfError(inError, inException, inMessage) \
|
||||
{ \
|
||||
SInt32 __E__err = (inError); \
|
||||
if(__E__err != 0) \
|
||||
{ \
|
||||
char __4CC_string[5]; \
|
||||
*((SInt32*)__4CC_string) = __E__err; \
|
||||
__4CC_string[4] = 0; \
|
||||
DebugMessageN2(inMessage ", Error: %ld (%s)", __E__err, __4CC_string); \
|
||||
STOP; \
|
||||
throw (inException); \
|
||||
} \
|
||||
}
|
||||
|
||||
#define SubclassResponsibility(inMethodName, inException) \
|
||||
{ \
|
||||
DebugMessage(inMethodName": Subclasses must implement this method"); \
|
||||
throw (inException); \
|
||||
}
|
||||
|
||||
#endif // defined(__cplusplus)
|
||||
|
||||
#endif
|
||||
@@ -1,79 +0,0 @@
|
||||
/* Copyright: © Copyright 2003 Apple Computer, Inc. All rights reserved.
|
||||
|
||||
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc.
|
||||
("Apple") in consideration of your agreement to the following terms, and your
|
||||
use, installation, modification or redistribution of this Apple software
|
||||
constitutes acceptance of these terms. If you do not agree with these terms,
|
||||
please do not use, install, modify or redistribute this Apple software.
|
||||
|
||||
In consideration of your agreement to abide by the following terms, and subject
|
||||
to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs
|
||||
copyrights in this original Apple software (the "Apple Software"), to use,
|
||||
reproduce, modify and redistribute the Apple Software, with or without
|
||||
modifications, in source and/or binary forms; provided that if you redistribute
|
||||
the Apple Software in its entirety and without modifications, you must retain
|
||||
this notice and the following text and disclaimers in all such redistributions of
|
||||
the Apple Software. Neither the name, trademarks, service marks or logos of
|
||||
Apple Computer, Inc. may be used to endorse or promote products derived from the
|
||||
Apple Software without specific prior written permission from Apple. Except as
|
||||
expressly stated in this notice, no other rights or licenses, express or implied,
|
||||
are granted by Apple herein, including but not limited to any patent rights that
|
||||
may be infringed by your derivative works or by other works in which the Apple
|
||||
Software may be incorporated.
|
||||
|
||||
The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO
|
||||
WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
|
||||
WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN
|
||||
COMBINATION WITH YOUR PRODUCTS.
|
||||
|
||||
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION
|
||||
OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT
|
||||
(INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN
|
||||
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
/*=============================================================================
|
||||
CAException.h
|
||||
|
||||
=============================================================================*/
|
||||
#if !defined(__CAException_h__)
|
||||
#define __CAException_h__
|
||||
|
||||
//=============================================================================
|
||||
// Includes
|
||||
//=============================================================================
|
||||
|
||||
#include "CAConditionalMacros.h"
|
||||
|
||||
#if CoreAudio_Use_Framework_Includes
|
||||
#include <CoreAudio/CoreAudioTypes.h>
|
||||
#else
|
||||
#include "CoreAudioTypes.h"
|
||||
#endif
|
||||
|
||||
//=============================================================================
|
||||
// CAException
|
||||
//=============================================================================
|
||||
|
||||
class CAException
|
||||
{
|
||||
|
||||
public:
|
||||
CAException(OSStatus inError) : mError(inError) {}
|
||||
CAException(const CAException& inException) : mError(inException.mError) {}
|
||||
CAException& operator=(const CAException& inException) { mError = inException.mError; return *this; }
|
||||
~CAException() {}
|
||||
|
||||
OSStatus GetError() const { return mError; }
|
||||
|
||||
protected:
|
||||
OSStatus mError;
|
||||
};
|
||||
|
||||
#define CATry try{
|
||||
#define CACatch }catch(const CAException& inException) {} catch(...) {}
|
||||
|
||||
#endif
|
||||
@@ -1,83 +0,0 @@
|
||||
/* Copyright: © Copyright 2003 Apple Computer, Inc. All rights reserved.
|
||||
|
||||
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc.
|
||||
("Apple") in consideration of your agreement to the following terms, and your
|
||||
use, installation, modification or redistribution of this Apple software
|
||||
constitutes acceptance of these terms. If you do not agree with these terms,
|
||||
please do not use, install, modify or redistribute this Apple software.
|
||||
|
||||
In consideration of your agreement to abide by the following terms, and subject
|
||||
to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs
|
||||
copyrights in this original Apple software (the "Apple Software"), to use,
|
||||
reproduce, modify and redistribute the Apple Software, with or without
|
||||
modifications, in source and/or binary forms; provided that if you redistribute
|
||||
the Apple Software in its entirety and without modifications, you must retain
|
||||
this notice and the following text and disclaimers in all such redistributions of
|
||||
the Apple Software. Neither the name, trademarks, service marks or logos of
|
||||
Apple Computer, Inc. may be used to endorse or promote products derived from the
|
||||
Apple Software without specific prior written permission from Apple. Except as
|
||||
expressly stated in this notice, no other rights or licenses, express or implied,
|
||||
are granted by Apple herein, including but not limited to any patent rights that
|
||||
may be infringed by your derivative works or by other works in which the Apple
|
||||
Software may be incorporated.
|
||||
|
||||
The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO
|
||||
WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
|
||||
WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN
|
||||
COMBINATION WITH YOUR PRODUCTS.
|
||||
|
||||
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION
|
||||
OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT
|
||||
(INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN
|
||||
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
/*=============================================================================
|
||||
CAPrefix.h
|
||||
|
||||
=============================================================================*/
|
||||
#if !defined(__CAPrefix_h__)
|
||||
#define __CAPrefix_h__
|
||||
|
||||
//=============================================================================
|
||||
// Includes
|
||||
//=============================================================================
|
||||
|
||||
#include <TargetConditionals.h>
|
||||
|
||||
// MacTypes.h has the definitions of basic types like UInt32 and Float64
|
||||
#if TARGET_OS_MAC && TARGET_RT_MAC_MACHO
|
||||
#include <CoreServices/../Frameworks/CarbonCore.framework/Headers/MacTypes.h>
|
||||
#else
|
||||
#include <MacTypes.h>
|
||||
#endif
|
||||
|
||||
#include <CoreFoundation/CoreFoundation.h>
|
||||
#include <IOKit/IOKitLib.h>
|
||||
#include <IOKit/IOMessage.h>
|
||||
#include <IOKit/audio/IOAudioDefines.h>
|
||||
#include <IOKit/audio/IOAudioTypes.h>
|
||||
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
|
||||
#if defined(__cplusplus)
|
||||
#include <algorithm>
|
||||
#include <iterator>
|
||||
#include <list>
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <new>
|
||||
#include <numeric>
|
||||
#include <queue>
|
||||
#include <set>
|
||||
#include <stack>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@@ -1,474 +0,0 @@
|
||||
/* Copyright: © Copyright 2003 Apple Computer, Inc. All rights reserved.
|
||||
|
||||
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc.
|
||||
("Apple") in consideration of your agreement to the following terms, and your
|
||||
use, installation, modification or redistribution of this Apple software
|
||||
constitutes acceptance of these terms. If you do not agree with these terms,
|
||||
please do not use, install, modify or redistribute this Apple software.
|
||||
|
||||
In consideration of your agreement to abide by the following terms, and subject
|
||||
to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs
|
||||
copyrights in this original Apple software (the "Apple Software"), to use,
|
||||
reproduce, modify and redistribute the Apple Software, with or without
|
||||
modifications, in source and/or binary forms; provided that if you redistribute
|
||||
the Apple Software in its entirety and without modifications, you must retain
|
||||
this notice and the following text and disclaimers in all such redistributions of
|
||||
the Apple Software. Neither the name, trademarks, service marks or logos of
|
||||
Apple Computer, Inc. may be used to endorse or promote products derived from the
|
||||
Apple Software without specific prior written permission from Apple. Except as
|
||||
expressly stated in this notice, no other rights or licenses, express or implied,
|
||||
are granted by Apple herein, including but not limited to any patent rights that
|
||||
may be infringed by your derivative works or by other works in which the Apple
|
||||
Software may be incorporated.
|
||||
|
||||
The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO
|
||||
WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
|
||||
WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN
|
||||
COMBINATION WITH YOUR PRODUCTS.
|
||||
|
||||
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION
|
||||
OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT
|
||||
(INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN
|
||||
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
/*=============================================================================
|
||||
CAStreamBasicDescription.cpp
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#include "CAConditionalMacros.h"
|
||||
|
||||
#include "CAStreamBasicDescription.h"
|
||||
|
||||
#if TARGET_OS_MAC && TARGET_RT_MAC_MACHO
|
||||
#include <CoreServices/CoreServices.h>
|
||||
#else
|
||||
#include <Endian.h>
|
||||
#endif
|
||||
|
||||
const AudioStreamBasicDescription CAStreamBasicDescription::sEmpty = { 0.0, 0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
|
||||
CAStreamBasicDescription::CAStreamBasicDescription(double inSampleRate, UInt32 inFormatID,
|
||||
UInt32 inBytesPerPacket, UInt32 inFramesPerPacket,
|
||||
UInt32 inBytesPerFrame, UInt32 inChannelsPerFrame,
|
||||
UInt32 inBitsPerChannel, UInt32 inFormatFlags)
|
||||
{
|
||||
mSampleRate = inSampleRate;
|
||||
mFormatID = inFormatID;
|
||||
mBytesPerPacket = inBytesPerPacket;
|
||||
mFramesPerPacket = inFramesPerPacket;
|
||||
mBytesPerFrame = inBytesPerFrame;
|
||||
mChannelsPerFrame = inChannelsPerFrame;
|
||||
mBitsPerChannel = inBitsPerChannel;
|
||||
mFormatFlags = inFormatFlags;
|
||||
}
|
||||
|
||||
void CAStreamBasicDescription::PrintFormat(FILE *f, const char *indent, const char *name) const
|
||||
{
|
||||
fprintf(f, "%s%s ", indent, name);
|
||||
char formatID[5];
|
||||
*(UInt32 *)formatID = EndianU32_NtoB(mFormatID);
|
||||
formatID[4] = '\0';
|
||||
fprintf(f, "%2ld ch, %6.0f Hz, '%-4.4s' (0x%08lX) ",
|
||||
NumberChannels(), mSampleRate, formatID,
|
||||
mFormatFlags);
|
||||
if (mFormatID == kAudioFormatLinearPCM) {
|
||||
bool isInt = !(mFormatFlags & kLinearPCMFormatFlagIsFloat);
|
||||
int wordSize = SampleWordSize();
|
||||
const char *endian = (wordSize > 1) ?
|
||||
((mFormatFlags & kLinearPCMFormatFlagIsBigEndian) ? " big-endian" : " little-endian" ) : "";
|
||||
const char *sign = isInt ?
|
||||
((mFormatFlags & kLinearPCMFormatFlagIsSignedInteger) ? " signed" : " unsigned") : "";
|
||||
const char *floatInt = isInt ? "integer" : "float";
|
||||
char packed[32];
|
||||
if (PackednessIsSignificant()) {
|
||||
if (mFormatFlags & kLinearPCMFormatFlagIsPacked)
|
||||
sprintf(packed, "packed in %d bytes", wordSize);
|
||||
else
|
||||
sprintf(packed, "unpacked in %d bytes", wordSize);
|
||||
} else
|
||||
packed[0] = '\0';
|
||||
const char *align = AlignmentIsSignificant() ?
|
||||
((mFormatFlags & kLinearPCMFormatFlagIsAlignedHigh) ? " high-aligned" : " low-aligned") : "";
|
||||
const char *deinter = (mFormatFlags & kAudioFormatFlagIsNonInterleaved) ? ", deinterleaved" : "";
|
||||
const char *commaSpace = (packed[0]!='\0') || (align[0]!='\0') ? ", " : "";
|
||||
|
||||
fprintf(f, "%ld-bit%s%s %s%s%s%s%s\n",
|
||||
mBitsPerChannel, endian, sign, floatInt,
|
||||
commaSpace, packed, align, deinter);
|
||||
} else
|
||||
fprintf(f, "%ld bits/channel, %ld bytes/packet, %ld frames/packet, %ld bytes/frame\n",
|
||||
mBitsPerChannel, mBytesPerPacket, mFramesPerPacket, mBytesPerFrame);
|
||||
}
|
||||
|
||||
void CAStreamBasicDescription::NormalizeLinearPCMFormat(AudioStreamBasicDescription& ioDescription)
|
||||
{
|
||||
if(ioDescription.mFormatID == kAudioFormatLinearPCM)
|
||||
{
|
||||
// we have to doctor the linear PCM format because we always
|
||||
// only export 32 bit, native endian, fully packed floats
|
||||
ioDescription.mBitsPerChannel = sizeof(Float32) * 8;
|
||||
ioDescription.mBytesPerFrame = sizeof(Float32) * ioDescription.mChannelsPerFrame;
|
||||
ioDescription.mFramesPerPacket = 1;
|
||||
ioDescription.mBytesPerPacket = ioDescription.mFramesPerPacket * ioDescription.mBytesPerFrame;
|
||||
|
||||
ioDescription.mFormatFlags = kAudioFormatFlagIsFloat | kAudioFormatFlagIsPacked;
|
||||
ioDescription.mFormatFlags |= kAudioFormatFlagsNativeEndian;
|
||||
}
|
||||
}
|
||||
|
||||
void CAStreamBasicDescription::ResetFormat(AudioStreamBasicDescription& ioDescription)
|
||||
{
|
||||
ioDescription.mSampleRate = 0;
|
||||
ioDescription.mFormatID = 0;
|
||||
ioDescription.mBytesPerPacket = 0;
|
||||
ioDescription.mFramesPerPacket = 0;
|
||||
ioDescription.mBytesPerFrame = 0;
|
||||
ioDescription.mChannelsPerFrame = 0;
|
||||
ioDescription.mBitsPerChannel = 0;
|
||||
ioDescription.mFormatFlags = 0;
|
||||
}
|
||||
|
||||
void CAStreamBasicDescription::FillOutFormat(AudioStreamBasicDescription& ioDescription, const AudioStreamBasicDescription& inTemplateDescription)
|
||||
{
|
||||
if(ioDescription.mSampleRate == 0)
|
||||
{
|
||||
ioDescription.mSampleRate = inTemplateDescription.mSampleRate;
|
||||
}
|
||||
if(ioDescription.mFormatID == 0)
|
||||
{
|
||||
ioDescription.mFormatID = inTemplateDescription.mFormatID;
|
||||
}
|
||||
if(ioDescription.mFormatFlags == 0)
|
||||
{
|
||||
ioDescription.mFormatFlags = inTemplateDescription.mFormatFlags;
|
||||
}
|
||||
if(ioDescription.mBytesPerPacket == 0)
|
||||
{
|
||||
ioDescription.mBytesPerPacket = inTemplateDescription.mBytesPerPacket;
|
||||
}
|
||||
if(ioDescription.mFramesPerPacket == 0)
|
||||
{
|
||||
ioDescription.mFramesPerPacket = inTemplateDescription.mFramesPerPacket;
|
||||
}
|
||||
if(ioDescription.mBytesPerFrame == 0)
|
||||
{
|
||||
ioDescription.mBytesPerFrame = inTemplateDescription.mBytesPerFrame;
|
||||
}
|
||||
if(ioDescription.mChannelsPerFrame == 0)
|
||||
{
|
||||
ioDescription.mChannelsPerFrame = inTemplateDescription.mChannelsPerFrame;
|
||||
}
|
||||
if(ioDescription.mBitsPerChannel == 0)
|
||||
{
|
||||
ioDescription.mBitsPerChannel = inTemplateDescription.mBitsPerChannel;
|
||||
}
|
||||
}
|
||||
|
||||
void CAStreamBasicDescription::GetSimpleName(const AudioStreamBasicDescription& inDescription, char* outName, bool inAbbreviate)
|
||||
{
|
||||
switch(inDescription.mFormatID)
|
||||
{
|
||||
case kAudioFormatLinearPCM:
|
||||
{
|
||||
const char* theEndianString = NULL;
|
||||
if((inDescription.mFormatFlags & kAudioFormatFlagIsBigEndian) != 0)
|
||||
{
|
||||
#if TARGET_RT_LITTLE_ENDIAN
|
||||
theEndianString = "Big Endian";
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
#if TARGET_RT_BIG_ENDIAN
|
||||
theEndianString = "Little Endian";
|
||||
#endif
|
||||
}
|
||||
|
||||
const char* theKindString = NULL;
|
||||
if((inDescription.mFormatFlags & kAudioFormatFlagIsFloat) != 0)
|
||||
{
|
||||
theKindString = (inAbbreviate ? "Float" : "Floating Point");
|
||||
}
|
||||
else if((inDescription.mFormatFlags & kAudioFormatFlagIsSignedInteger) != 0)
|
||||
{
|
||||
theKindString = (inAbbreviate ? "SInt" : "Signed Integer");
|
||||
}
|
||||
else
|
||||
{
|
||||
theKindString = (inAbbreviate ? "UInt" : "Unsigned Integer");
|
||||
}
|
||||
|
||||
const char* thePackingString = NULL;
|
||||
if((inDescription.mFormatFlags & kAudioFormatFlagIsPacked) == 0)
|
||||
{
|
||||
if((inDescription.mFormatFlags & kAudioFormatFlagIsAlignedHigh) != 0)
|
||||
{
|
||||
thePackingString = "High";
|
||||
}
|
||||
else
|
||||
{
|
||||
thePackingString = "Low";
|
||||
}
|
||||
}
|
||||
|
||||
if(inAbbreviate)
|
||||
{
|
||||
if(theEndianString != NULL)
|
||||
{
|
||||
if(thePackingString != NULL)
|
||||
{
|
||||
sprintf(outName, "%d Ch %s %s %s%d/%s%d", (int)inDescription.mChannelsPerFrame, theEndianString, thePackingString, theKindString, (int)inDescription.mBitsPerChannel, theKindString, (int)(inDescription.mBytesPerFrame / inDescription.mChannelsPerFrame) * 8);
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf(outName, "%d Ch %s %s%d", (int)inDescription.mChannelsPerFrame, theEndianString, theKindString, (int)inDescription.mBitsPerChannel);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(thePackingString != NULL)
|
||||
{
|
||||
sprintf(outName, "%d Ch %s %s%d/%s%d", (int)inDescription.mChannelsPerFrame, thePackingString, theKindString, (int)inDescription.mBitsPerChannel, theKindString, (int)((inDescription.mBytesPerFrame / inDescription.mChannelsPerFrame) * 8));
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf(outName, "%d Ch %s%d", (int)inDescription.mChannelsPerFrame, theKindString, (int)inDescription.mBitsPerChannel);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(theEndianString != NULL)
|
||||
{
|
||||
if(thePackingString != NULL)
|
||||
{
|
||||
sprintf(outName, "%d Channel %d Bit %s %s Aligned %s in %d Bits", (int)inDescription.mChannelsPerFrame, (int)inDescription.mBitsPerChannel, theEndianString, theKindString, thePackingString, (int)(inDescription.mBytesPerFrame / inDescription.mChannelsPerFrame) * 8);
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf(outName, "%d Channel %d Bit %s %s", (int)inDescription.mChannelsPerFrame, (int)inDescription.mBitsPerChannel, theEndianString, theKindString);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf(outName, "%d Channel %d Bit %s", (int)inDescription.mChannelsPerFrame, (int)inDescription.mBitsPerChannel, theKindString);
|
||||
if(thePackingString != NULL)
|
||||
{
|
||||
sprintf(outName, "%d Channel %d Bit %s Aligned %s in %d Bits", (int)inDescription.mChannelsPerFrame, (int)inDescription.mBitsPerChannel, theKindString, thePackingString, (int)(inDescription.mBytesPerFrame / inDescription.mChannelsPerFrame) * 8);
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf(outName, "%d Channel %d Bit %s", (int)inDescription.mChannelsPerFrame, (int)inDescription.mBitsPerChannel, theKindString);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case kAudioFormatAC3:
|
||||
strcpy(outName, "AC-3");
|
||||
break;
|
||||
|
||||
case kAudioFormat60958AC3:
|
||||
strcpy(outName, "AC-3 for SPDIF");
|
||||
break;
|
||||
|
||||
default:
|
||||
{
|
||||
char* the4CCString = (char*)&inDescription.mFormatID;
|
||||
outName[0] = the4CCString[0];
|
||||
outName[1] = the4CCString[1];
|
||||
outName[2] = the4CCString[2];
|
||||
outName[3] = the4CCString[3];
|
||||
outName[4] = 0;
|
||||
}
|
||||
break;
|
||||
};
|
||||
}
|
||||
|
||||
#if CoreAudio_Debug
|
||||
#include "CALogMacros.h"
|
||||
|
||||
void CAStreamBasicDescription::PrintToLog(const AudioStreamBasicDescription& inDesc)
|
||||
{
|
||||
PrintFloat (" Sample Rate: ", inDesc.mSampleRate);
|
||||
Print4CharCode (" Format ID: ", inDesc.mFormatID);
|
||||
PrintHex (" Format Flags: ", inDesc.mFormatFlags);
|
||||
PrintInt (" Bytes per Packet: ", inDesc.mBytesPerPacket);
|
||||
PrintInt (" Frames per Packet: ", inDesc.mFramesPerPacket);
|
||||
PrintInt (" Bytes per Frame: ", inDesc.mBytesPerFrame);
|
||||
PrintInt (" Channels per Frame: ", inDesc.mChannelsPerFrame);
|
||||
PrintInt (" Bits per Channel: ", inDesc.mBitsPerChannel);
|
||||
}
|
||||
#endif
|
||||
|
||||
bool operator<(const AudioStreamBasicDescription& x, const AudioStreamBasicDescription& y)
|
||||
{
|
||||
bool theAnswer = false;
|
||||
bool isDone = false;
|
||||
|
||||
// note that if either side is 0, that field is skipped
|
||||
|
||||
// format ID is the first order sort
|
||||
if((!isDone) && ((x.mFormatID != 0) && (y.mFormatID != 0)))
|
||||
{
|
||||
if(x.mFormatID != y.mFormatID)
|
||||
{
|
||||
// formats are sorted numerically except that linear
|
||||
// PCM is always first
|
||||
if(x.mFormatID == kAudioFormatLinearPCM)
|
||||
{
|
||||
theAnswer = true;
|
||||
}
|
||||
else if(y.mFormatID == kAudioFormatLinearPCM)
|
||||
{
|
||||
theAnswer = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
theAnswer = x.mFormatID < y.mFormatID;
|
||||
}
|
||||
isDone = true;
|
||||
}
|
||||
}
|
||||
|
||||
// floating point vs integer for linear PCM only
|
||||
if((!isDone) && ((x.mFormatID == kAudioFormatLinearPCM) && (y.mFormatID == kAudioFormatLinearPCM)))
|
||||
{
|
||||
if((x.mFormatFlags & kAudioFormatFlagIsFloat) != (y.mFormatFlags & kAudioFormatFlagIsFloat))
|
||||
{
|
||||
// floating point is better than integer
|
||||
theAnswer = y.mFormatFlags & kAudioFormatFlagIsFloat;
|
||||
isDone = true;
|
||||
}
|
||||
}
|
||||
|
||||
// bit depth
|
||||
if((!isDone) && ((x.mBitsPerChannel != 0) && (y.mBitsPerChannel != 0)))
|
||||
{
|
||||
if(x.mBitsPerChannel != y.mBitsPerChannel)
|
||||
{
|
||||
// deeper bit depths are higher quality
|
||||
theAnswer = x.mBitsPerChannel < y.mBitsPerChannel;
|
||||
isDone = true;
|
||||
}
|
||||
}
|
||||
|
||||
// sample rate
|
||||
if((!isDone) && ((x.mSampleRate != 0) && (y.mSampleRate != 0)))
|
||||
{
|
||||
if(x.mSampleRate != y.mSampleRate)
|
||||
{
|
||||
// higher sample rates are higher quality
|
||||
theAnswer = x.mSampleRate < y.mSampleRate;
|
||||
isDone = true;
|
||||
}
|
||||
}
|
||||
|
||||
// number of channels
|
||||
if((!isDone) && ((x.mChannelsPerFrame != 0) && (y.mChannelsPerFrame != 0)))
|
||||
{
|
||||
if(x.mChannelsPerFrame != y.mChannelsPerFrame)
|
||||
{
|
||||
// more channels is higher quality
|
||||
theAnswer = x.mChannelsPerFrame < y.mChannelsPerFrame;
|
||||
isDone = true;
|
||||
}
|
||||
}
|
||||
|
||||
return theAnswer;
|
||||
}
|
||||
|
||||
static bool MatchFormatFlags(const AudioStreamBasicDescription& x, const AudioStreamBasicDescription& y)
|
||||
{
|
||||
UInt32 xFlags = x.mFormatFlags;
|
||||
UInt32 yFlags = y.mFormatFlags;
|
||||
|
||||
// match wildcards
|
||||
if (x.mFormatID == 0 || y.mFormatID == 0 || xFlags == 0 || yFlags == 0)
|
||||
return true;
|
||||
|
||||
if (x.mFormatID == kAudioFormatLinearPCM)
|
||||
{
|
||||
// knock off the all clear flag
|
||||
xFlags = xFlags & ~kAudioFormatFlagsAreAllClear;
|
||||
yFlags = yFlags & ~kAudioFormatFlagsAreAllClear;
|
||||
|
||||
// if both kAudioFormatFlagIsPacked bits are set, then we don't care about the kAudioFormatFlagIsAlignedHigh bit.
|
||||
if (xFlags & yFlags & kAudioFormatFlagIsPacked) {
|
||||
xFlags = xFlags & ~kAudioFormatFlagIsAlignedHigh;
|
||||
yFlags = yFlags & ~kAudioFormatFlagIsAlignedHigh;
|
||||
}
|
||||
|
||||
// if both kAudioFormatFlagIsFloat bits are set, then we don't care about the kAudioFormatFlagIsSignedInteger bit.
|
||||
if (xFlags & yFlags & kAudioFormatFlagIsFloat) {
|
||||
xFlags = xFlags & ~kAudioFormatFlagIsSignedInteger;
|
||||
yFlags = yFlags & ~kAudioFormatFlagIsSignedInteger;
|
||||
}
|
||||
|
||||
// if the bit depth is 8 bits or less and the format is packed, we don't care about endianness
|
||||
if((x.mBitsPerChannel <= 8) && ((xFlags & kAudioFormatFlagIsPacked) == kAudioFormatFlagIsPacked))
|
||||
{
|
||||
xFlags = xFlags & ~kAudioFormatFlagIsBigEndian;
|
||||
}
|
||||
if((y.mBitsPerChannel <= 8) && ((yFlags & kAudioFormatFlagIsPacked) == kAudioFormatFlagIsPacked))
|
||||
{
|
||||
yFlags = yFlags & ~kAudioFormatFlagIsBigEndian;
|
||||
}
|
||||
}
|
||||
return xFlags == yFlags;
|
||||
}
|
||||
|
||||
bool operator==(const AudioStreamBasicDescription& x, const AudioStreamBasicDescription& y)
|
||||
{
|
||||
// the semantics for equality are:
|
||||
// 1) Values must match exactly
|
||||
// 2) wildcard's are ignored in the comparison
|
||||
|
||||
#define MATCH(name) ((x.name) == 0 || (y.name) == 0 || (x.name) == (y.name))
|
||||
|
||||
return
|
||||
// check the sample rate
|
||||
MATCH(mSampleRate)
|
||||
|
||||
// check the format ids
|
||||
&& MATCH(mFormatID)
|
||||
|
||||
// check the format flags
|
||||
&& MatchFormatFlags(x, y)
|
||||
|
||||
// check the bytes per packet
|
||||
&& MATCH(mBytesPerPacket)
|
||||
|
||||
// check the frames per packet
|
||||
&& MATCH(mFramesPerPacket)
|
||||
|
||||
// check the bytes per frame
|
||||
&& MATCH(mBytesPerFrame)
|
||||
|
||||
// check the channels per frame
|
||||
&& MATCH(mChannelsPerFrame)
|
||||
|
||||
// check the channels per frame
|
||||
&& MATCH(mBitsPerChannel) ;
|
||||
}
|
||||
|
||||
bool SanityCheck(const AudioStreamBasicDescription& x)
|
||||
{
|
||||
// This function returns false if there are sufficiently insane values in any field.
|
||||
// It is very conservative so even some very unlikely values will pass.
|
||||
// This is just meant to catch the case where the data from a file is corrupted.
|
||||
|
||||
return
|
||||
(x.mSampleRate >= 0. && x.mSampleRate < 1e6)
|
||||
&& (x.mBytesPerPacket < 1000000)
|
||||
&& (x.mFramesPerPacket < 1000000)
|
||||
&& (x.mBytesPerFrame < 1000000)
|
||||
&& (x.mChannelsPerFrame <= 1024)
|
||||
&& (x.mBitsPerChannel <= 1024);
|
||||
}
|
||||
@@ -1,214 +0,0 @@
|
||||
/* Copyright: © Copyright 2003 Apple Computer, Inc. All rights reserved.
|
||||
|
||||
Disclaimer: IMPORTANT: This Apple software is supplied to you by Apple Computer, Inc.
|
||||
("Apple") in consideration of your agreement to the following terms, and your
|
||||
use, installation, modification or redistribution of this Apple software
|
||||
constitutes acceptance of these terms. If you do not agree with these terms,
|
||||
please do not use, install, modify or redistribute this Apple software.
|
||||
|
||||
In consideration of your agreement to abide by the following terms, and subject
|
||||
to these terms, Apple grants you a personal, non-exclusive license, under AppleÕs
|
||||
copyrights in this original Apple software (the "Apple Software"), to use,
|
||||
reproduce, modify and redistribute the Apple Software, with or without
|
||||
modifications, in source and/or binary forms; provided that if you redistribute
|
||||
the Apple Software in its entirety and without modifications, you must retain
|
||||
this notice and the following text and disclaimers in all such redistributions of
|
||||
the Apple Software. Neither the name, trademarks, service marks or logos of
|
||||
Apple Computer, Inc. may be used to endorse or promote products derived from the
|
||||
Apple Software without specific prior written permission from Apple. Except as
|
||||
expressly stated in this notice, no other rights or licenses, express or implied,
|
||||
are granted by Apple herein, including but not limited to any patent rights that
|
||||
may be infringed by your derivative works or by other works in which the Apple
|
||||
Software may be incorporated.
|
||||
|
||||
The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES NO
|
||||
WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED
|
||||
WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND OPERATION ALONE OR IN
|
||||
COMBINATION WITH YOUR PRODUCTS.
|
||||
|
||||
IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, MODIFICATION AND/OR DISTRIBUTION
|
||||
OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT
|
||||
(INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN
|
||||
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
/*=============================================================================
|
||||
CAStreamBasicDescription.h
|
||||
|
||||
=============================================================================*/
|
||||
|
||||
#ifndef __CAStreamBasicDescription_h__
|
||||
#define __CAStreamBasicDescription_h__
|
||||
|
||||
#include "CAConditionalMacros.h"
|
||||
|
||||
#if CoreAudio_Use_Framework_Includes
|
||||
#include <CoreAudio/CoreAudioTypes.h>
|
||||
#include <CoreFoundation/CoreFoundation.h>
|
||||
#else
|
||||
#include "CoreAudioTypes.h"
|
||||
#include "CFPropertyList.h"
|
||||
#endif
|
||||
|
||||
#include "CADebugMacros.h"
|
||||
#include <cstring> // for memset, memcpy
|
||||
#include <cstdio> // for FILE *
|
||||
|
||||
//=============================================================================
|
||||
// CAStreamBasicDescription
|
||||
//
|
||||
// This is a wrapper class for the AudioStreamBasicDescription struct.
|
||||
// It adds a number of convenience routines, but otherwise adds nothing
|
||||
// to the footprint of the original struct.
|
||||
//=============================================================================
|
||||
class CAStreamBasicDescription :
|
||||
public AudioStreamBasicDescription
|
||||
{
|
||||
|
||||
// Constants
|
||||
public:
|
||||
static const AudioStreamBasicDescription sEmpty;
|
||||
|
||||
// Construction/Destruction
|
||||
public:
|
||||
CAStreamBasicDescription() { memset (this, 0, sizeof(AudioStreamBasicDescription)); }
|
||||
|
||||
CAStreamBasicDescription(const AudioStreamBasicDescription &desc)
|
||||
{
|
||||
SetFrom(desc);
|
||||
}
|
||||
|
||||
CAStreamBasicDescription( double inSampleRate, UInt32 inFormatID,
|
||||
UInt32 inBytesPerPacket, UInt32 inFramesPerPacket,
|
||||
UInt32 inBytesPerFrame, UInt32 inChannelsPerFrame,
|
||||
UInt32 inBitsPerChannel, UInt32 inFormatFlags);
|
||||
|
||||
// Assignment
|
||||
CAStreamBasicDescription& operator=(const AudioStreamBasicDescription& v) { SetFrom(v); return *this; }
|
||||
|
||||
void SetFrom(const AudioStreamBasicDescription &desc)
|
||||
{
|
||||
memcpy(this, &desc, sizeof(AudioStreamBasicDescription));
|
||||
}
|
||||
|
||||
// _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
||||
//
|
||||
// interrogation
|
||||
|
||||
bool IsPCM() const { return mFormatID == kAudioFormatLinearPCM; }
|
||||
|
||||
bool PackednessIsSignificant() const
|
||||
{
|
||||
Assert(IsPCM(), "PackednessIsSignificant only applies for PCM");
|
||||
return (SampleWordSize() << 3) != mBitsPerChannel;
|
||||
}
|
||||
|
||||
bool AlignmentIsSignificant() const
|
||||
{
|
||||
return PackednessIsSignificant() || (mBitsPerChannel & 7) != 0;
|
||||
}
|
||||
|
||||
bool IsInterleaved() const
|
||||
{
|
||||
return !IsPCM() || !(mFormatFlags & kAudioFormatFlagIsNonInterleaved);
|
||||
}
|
||||
|
||||
// for sanity with interleaved/deinterleaved possibilities, never access mChannelsPerFrame, use these:
|
||||
UInt32 NumberInterleavedChannels() const { return IsInterleaved() ? mChannelsPerFrame : 1; }
|
||||
UInt32 NumberChannelStreams() const { return IsInterleaved() ? 1 : mChannelsPerFrame; }
|
||||
UInt32 NumberChannels() const { return mChannelsPerFrame; }
|
||||
UInt32 SampleWordSize() const { return (mBytesPerFrame > 0) ? mBytesPerFrame / NumberInterleavedChannels() : 0;}
|
||||
|
||||
UInt32 FramesToBytes(UInt32 nframes) const { return nframes * mBytesPerFrame; }
|
||||
UInt32 BytesToFrames(UInt32 nbytes) const {
|
||||
Assert(mBytesPerFrame > 0, "bytesPerFrame must be > 0 in BytesToFrames");
|
||||
return nbytes / mBytesPerFrame;
|
||||
}
|
||||
|
||||
bool SameChannelsAndInterleaving(const CAStreamBasicDescription &a) const
|
||||
{
|
||||
return this->NumberChannels() == a.NumberChannels() && this->IsInterleaved() == a.IsInterleaved();
|
||||
}
|
||||
|
||||
// _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
||||
//
|
||||
// manipulation
|
||||
|
||||
void SetCanonical(UInt32 nChannels, bool interleaved)
|
||||
// note: leaves sample rate untouched
|
||||
{
|
||||
mFormatID = kAudioFormatLinearPCM;
|
||||
mFormatFlags = kAudioFormatFlagsNativeFloatPacked;
|
||||
mBitsPerChannel = 32;
|
||||
mChannelsPerFrame = nChannels;
|
||||
mFramesPerPacket = 1;
|
||||
if (interleaved)
|
||||
mBytesPerPacket = mBytesPerFrame = nChannels * sizeof(Float32);
|
||||
else {
|
||||
mBytesPerPacket = mBytesPerFrame = sizeof(Float32);
|
||||
mFormatFlags |= kAudioFormatFlagIsNonInterleaved;
|
||||
}
|
||||
}
|
||||
|
||||
void ChangeNumberChannels(UInt32 nChannels, bool interleaved)
|
||||
// alter an existing format
|
||||
{
|
||||
Assert(IsPCM(), "ChangeNumberChannels only works for PCM formats");
|
||||
UInt32 wordSize = SampleWordSize(); // get this before changing ANYTHING
|
||||
mChannelsPerFrame = nChannels;
|
||||
mFramesPerPacket = 1;
|
||||
if (interleaved) {
|
||||
mBytesPerPacket = mBytesPerFrame = nChannels * wordSize;
|
||||
mFormatFlags &= ~kAudioFormatFlagIsNonInterleaved;
|
||||
} else {
|
||||
mBytesPerPacket = mBytesPerFrame = wordSize;
|
||||
mFormatFlags |= kAudioFormatFlagIsNonInterleaved;
|
||||
}
|
||||
}
|
||||
|
||||
// _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
||||
//
|
||||
// other
|
||||
|
||||
void Print() const
|
||||
{
|
||||
Print (stdout);
|
||||
}
|
||||
|
||||
void Print(FILE* file) const
|
||||
{
|
||||
PrintFormat (file, "", "AudioStreamBasicDescription:");
|
||||
}
|
||||
|
||||
void PrintFormat(FILE *f, const char *indent, const char *name) const;
|
||||
|
||||
OSStatus Save(CFPropertyListRef *outData) const;
|
||||
|
||||
OSStatus Restore(CFPropertyListRef &inData);
|
||||
|
||||
// Operations
|
||||
static void NormalizeLinearPCMFormat(AudioStreamBasicDescription& ioDescription);
|
||||
static void ResetFormat(AudioStreamBasicDescription& ioDescription);
|
||||
static void FillOutFormat(AudioStreamBasicDescription& ioDescription, const AudioStreamBasicDescription& inTemplateDescription);
|
||||
static void GetSimpleName(const AudioStreamBasicDescription& inDescription, char* outName, bool inAbbreviate);
|
||||
#if CoreAudio_Debug
|
||||
static void PrintToLog(const AudioStreamBasicDescription& inDesc);
|
||||
#endif
|
||||
};
|
||||
|
||||
bool operator<(const AudioStreamBasicDescription& x, const AudioStreamBasicDescription& y);
|
||||
bool operator==(const AudioStreamBasicDescription& x, const AudioStreamBasicDescription& y);
|
||||
#if TARGET_OS_MAC
|
||||
inline bool operator!=(const AudioStreamBasicDescription& x, const AudioStreamBasicDescription& y) { return !(x == y); }
|
||||
inline bool operator<=(const AudioStreamBasicDescription& x, const AudioStreamBasicDescription& y) { return (x < y) || (x == y); }
|
||||
inline bool operator>=(const AudioStreamBasicDescription& x, const AudioStreamBasicDescription& y) { return !(x < y); }
|
||||
inline bool operator>(const AudioStreamBasicDescription& x, const AudioStreamBasicDescription& y) { return !((x < y) || (x == y)); }
|
||||
#endif
|
||||
|
||||
bool SanityCheck(const AudioStreamBasicDescription& x);
|
||||
|
||||
|
||||
#endif // __CAStreamBasicDescription_h__
|
||||
Reference in New Issue
Block a user