tags:

views:

392

answers:

3

Hi All,

How can i get audio device UID (USB speaker) to pass into NSSound's setPlaybackDeviceIdentifier: method

Thanks

A: 

ok i got it myself...

the theCFString will contain the device UID

UInt32          theSize;
char            theString[kMaxStringSize];
UInt32          theNumberDevices;
AudioDeviceID   *theDeviceList = NULL;
UInt32          theDeviceIndex;
CFStringRef     theCFString     = NULL;
OSStatus        theStatus = noErr;

// this is our driver
const char      *nameString = "Burr-Brown Japan PCM2702";
const char      *manufacturerString = "Burr-Brown Japan";



// device list size
theSize = 0;
theStatus = AudioHardwareGetPropertyInfo(kAudioHardwarePropertyDevices, &theSize, NULL);


theNumberDevices = theSize / sizeof(AudioDeviceID);

// allocate the device list
theDeviceList = (AudioDeviceID*)malloc(theNumberDevices * sizeof(AudioDeviceID));

// get the device list
theSize = theNumberDevices * sizeof(AudioDeviceID);
theStatus = AudioHardwareGetProperty(kAudioHardwarePropertyDevices, &theSize, theDeviceList);

// iterate through the device list, find our device and return the UID
for(theDeviceIndex = 0; theDeviceIndex < theNumberDevices; ++theDeviceIndex)
{
    // get name
    theSize = kMaxStringSize;
    theStatus = AudioDeviceGetProperty(theDeviceList[theDeviceIndex],
                                       0, 0, kAudioDevicePropertyDeviceName, &theSize, theString);

    NSLog(@"%s",theString);


    // is it me?
    if (strncmp(theString, nameString, strlen(nameString)) == 0) {

        // get manufacturer
        theSize = kMaxStringSize;
        theStatus = AudioDeviceGetProperty(theDeviceList[theDeviceIndex], 0, 0,
                                           kAudioDevicePropertyDeviceManufacturer, &theSize, theString);

        NSLog(@"%s",theString);
        // is it really me?
        if (strncmp(theString, manufacturerString, strlen(manufacturerString)) == 0) {
            // get device UID
            theSize = sizeof(CFStringRef);
            theStatus = AudioDeviceGetProperty(theDeviceList[theDeviceIndex],
                                               0, 0, kAudioDevicePropertyDeviceUID, &theSize, &theCFString);
            NSLog(@"%s",theCFString);



            break;
        }
    }
}
Saurabh
A: 

AudioHardwareGetProperty is deprecated in snow leopard.

sandeep
Yes but this thing is working in snow leopard.
Saurabh
As AudioHardwareGetProperty is deprecated,AudioObjectGetPropertyData has to be used instead.It is always better to avoid the usage of deprecated APIs.
sandeep
A: 

To avoid the deprecated AudioHardwareGetProperty and AudioDeviceGetProperty calls replace them with something like this:

AudioObjectPropertyAddress  propertyAddress;
AudioObjectID               *deviceIDs;
UInt32                      propertySize;
NSInteger                   numDevices;

propertyAddress.mSelector = kAudioHardwarePropertyDevices;
propertyAddress.mScope = kAudioObjectPropertyScopeGlobal;
propertyAddress.mElement = kAudioObjectPropertyElementMaster;
if (AudioObjectGetPropertyDataSize(kAudioObjectSystemObject, &propertyAddress, 0, NULL, &propertySize) == noErr) {
    numDevices = propertySize / sizeof(AudioDeviceID);
    deviceIDs = (AudioDeviceID *)calloc(numDevices, sizeof(AudioDeviceID));

    if (AudioObjectGetPropertyData(kAudioObjectSystemObject, &propertyAddress, 0, NULL, &propertySize, deviceIDs) == noErr) {
        AudioObjectPropertyAddress      deviceAddress;
        char                            deviceName[64];
        char                            manufacturerName[64];

        for (NSInteger idx=0; idx<numDevices; idx++) {
            propertySize = sizeof(deviceName);
            deviceAddress.mSelector = kAudioDevicePropertyDeviceName;
            deviceAddress.mScope = kAudioObjectPropertyScopeGlobal;
            deviceAddress.mElement = kAudioObjectPropertyElementMaster;
            if (AudioObjectGetPropertyData(deviceIDs[idx], &deviceAddress, 0, NULL, &propertySize, deviceName) == noErr) {
                propertySize = sizeof(manufacturerName);
                deviceAddress.mSelector = kAudioDevicePropertyDeviceManufacturer;
                deviceAddress.mScope = kAudioObjectPropertyScopeGlobal;
                deviceAddress.mElement = kAudioObjectPropertyElementMaster;
                if (AudioObjectGetPropertyData(deviceIDs[idx], &deviceAddress, 0, NULL, &propertySize, manufacturerName) == noErr) {
                    CFStringRef     uidString;

                    propertySize = sizeof(uidString);
                    deviceAddress.mSelector = kAudioDevicePropertyDeviceUID;
                    deviceAddress.mScope = kAudioObjectPropertyScopeGlobal;
                    deviceAddress.mElement = kAudioObjectPropertyElementMaster;
                    if (AudioObjectGetPropertyData(deviceIDs[idx], &deviceAddress, 0, NULL, &propertySize, &uidString) == noErr) {
                        NSLog(@"device %s by %s id %@", deviceName, manufacturerName, uidString);

                        CFRelease(uidString);
                    }
                }
            }
        }
    }

    free(deviceIDs);
}
somegeekintn