diff options
author | Alexis Menard <alexis.menard@nokia.com> | 2009-04-17 14:06:06 (GMT) |
---|---|---|
committer | Alexis Menard <alexis.menard@nokia.com> | 2009-04-17 14:06:06 (GMT) |
commit | f15b8a83e2e51955776a3f07cb85ebfc342dd8ef (patch) | |
tree | c5dc684986051654898db11ce73e03b9fec8db99 /src/3rdparty/phonon/qt7/audiodevice.mm | |
download | Qt-f15b8a83e2e51955776a3f07cb85ebfc342dd8ef.zip Qt-f15b8a83e2e51955776a3f07cb85ebfc342dd8ef.tar.gz Qt-f15b8a83e2e51955776a3f07cb85ebfc342dd8ef.tar.bz2 |
Initial import of statemachine branch from the old kinetic repository
Diffstat (limited to 'src/3rdparty/phonon/qt7/audiodevice.mm')
-rw-r--r-- | src/3rdparty/phonon/qt7/audiodevice.mm | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/src/3rdparty/phonon/qt7/audiodevice.mm b/src/3rdparty/phonon/qt7/audiodevice.mm new file mode 100644 index 0000000..6bec62d --- /dev/null +++ b/src/3rdparty/phonon/qt7/audiodevice.mm @@ -0,0 +1,177 @@ +/* This file is part of the KDE project. + + Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). + + This library is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 2.1 or 3 of the License. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this library. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "audiodevice.h" +#include "audiograph.h" +#include <QtCore/QVector> +#include "backendheader.h" + +QT_BEGIN_NAMESPACE + +namespace Phonon +{ +namespace QT7 +{ + +QList<AudioDeviceID> AudioDevice::devices(Scope scope) +{ + QList<AudioDeviceID> devices; + + // Insert the default device explicit + if (AudioDeviceID defdev = defaultDevice(scope)) + devices << defdev; + + // How many input/output devices are awailable: + UInt32 deviceCount = 0; + OSStatus err = AudioHardwareGetPropertyInfo(kAudioHardwarePropertyDevices, &deviceCount, 0); + BACKEND_ASSERT3(err == noErr, "Could not get number of audio devices awailable.", FATAL_ERROR, devices) + + // Get list of all devices: + AudioDeviceID deviceArray[deviceCount]; + err = AudioHardwareGetProperty(kAudioHardwarePropertyDevices, &deviceCount, &deviceArray); + BACKEND_ASSERT3(err == noErr, "Could not get audio devices list.", FATAL_ERROR, devices) + + for (uint i=0; i<deviceCount; i++){ + if (!devices.contains(deviceArray[i])){ + // Check if the current device is input or output: + UInt32 size; + err = AudioDeviceGetPropertyInfo(deviceArray[i], 0, scope == In, kAudioDevicePropertyStreams, &size, 0); + if (err == noErr && size > 0) + devices << deviceArray[i]; + } + } + return devices; +} + +AudioDeviceID AudioDevice::defaultSystemDevice(Scope scope) +{ + ARGUMENT_UNSUPPORTED(scope, In, NORMAL_ERROR, 0) + AudioDeviceID deviceID = 0; + UInt32 size = sizeof(deviceID); + OSStatus err = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultSystemOutputDevice, &size, &deviceID); + BACKEND_ASSERT3(err == noErr, "Could not get default system audio device.", FATAL_ERROR, 0) + return deviceID; +} + +AudioDeviceID AudioDevice::defaultDevice(Scope scope) +{ + ARGUMENT_UNSUPPORTED(scope, In, NORMAL_ERROR, 0) + AudioDeviceID deviceID = 0; + UInt32 size = sizeof(deviceID); + OSStatus err = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice, &size, &deviceID); + BACKEND_ASSERT3(err == noErr, "Could not get default output audio device.", FATAL_ERROR, 0) + return deviceID; +} + +AudioDeviceID AudioDevice::currentDevice(AudioUnit /*unit*/, Scope /*scope*/) +{ + return 0; +#if 0 + +kAudioDevicePropertyDeviceUID + + if (!m_audioUnit) + return 0; + AudioDeviceID deviceID = 0; + UInt32 size = sizeof(deviceID); + OSStatus err = AudioUnitGetProperty(m_audioUnit, kAudioOutputUnitProperty_CurrentDevice, kAudioUnitScope_Global, 0, &size, &deviceID); + BACKEND_ASSERT3(err == noErr, "Could not get current audio device.", FATAL_ERROR, 0) + return deviceID; +#endif +} + +bool AudioDevice::setDevice(AudioUnit unit, AudioDeviceID deviceID, Scope scope) +{ + ARGUMENT_UNSUPPORTED(scope, In, NORMAL_ERROR, false) + UInt32 size = sizeof(deviceID); + OSStatus err = AudioUnitSetProperty(unit, kAudioOutputUnitProperty_CurrentDevice, kAudioUnitScope_Global, 0, &deviceID, size); + if (err != noErr) + return false; + return true; +} + +QString AudioDevice::deviceSourceNameElseDeviceName(AudioDeviceID deviceID) +{ + QString name = deviceSourceName(deviceID); + if (name.isEmpty()) + name = deviceName(deviceID); + return name; +} + +QString AudioDevice::deviceNameElseDeviceSourceName(AudioDeviceID deviceID) +{ + QString name = deviceName(deviceID); + if (name.isEmpty()) + name = deviceSourceName(deviceID); + return name; +} + +QString AudioDevice::deviceName(AudioDeviceID deviceID) +{ + if (!deviceID) + return QString(); + CFStringRef cfString = 0; + UInt32 size = sizeof(cfString); + OSStatus err = AudioDeviceGetProperty(deviceID, 0, 0, kAudioDevicePropertyDeviceNameCFString, &size, &cfString); + if (err != noErr) + return QString(); + QString name = PhononCFString::toQString(cfString); + CFRelease(cfString); + return name; +} + +QString AudioDevice::deviceSourceName(AudioDeviceID deviceID) +{ + if (!deviceID) + return QString(); + UInt32 dataSource = 0; + UInt32 size = sizeof(dataSource); + OSStatus err = AudioDeviceGetProperty(deviceID, 0, 0, kAudioDevicePropertyDataSource, &size, &dataSource); + if (err != noErr) + return QString(); + + CFStringRef cfName = 0; + AudioValueTranslation translation = {&dataSource, sizeof(dataSource), &cfName, sizeof(cfName)}; + size = sizeof(translation); + err = AudioDeviceGetProperty(deviceID, 0, 0, kAudioDevicePropertyDataSourceNameForIDCFString, &size, &translation); + if (err != noErr){ + CFRelease(cfName); + return QString(); + } + QString name = PhononCFString::toQString(cfName); + CFRelease(cfName); + return name; +} + +QString AudioDevice::deviceUID(AudioDeviceID deviceID) +{ + if (!deviceID) + return QString(); + + CFStringRef cfString = 0; + UInt32 size = sizeof(cfString); + OSStatus err = AudioDeviceGetProperty(deviceID, 0, 0, kAudioDevicePropertyDeviceUID, &size, &cfString); + if (err != noErr) + return QString(); + QString uid = PhononCFString::toQString(cfString); + CFRelease(cfString); + return uid; +} + +}} //namespace Phonon::QT7 + +QT_END_NAMESPACE |