static void au_card_detect(MSSndCardManager * m) { OSStatus err; UInt32 slen; int count; Boolean writable; int i; writable = 0; slen = 0; err = AudioHardwareGetPropertyInfo(kAudioHardwarePropertyDevices, &slen, &writable); if (err != kAudioHardwareNoError) { ms_error("get kAudioHardwarePropertyDevices error %ld", err); return; } AudioDeviceID devices[slen / sizeof(AudioDeviceID)]; err = AudioHardwareGetProperty(kAudioHardwarePropertyDevices, &slen, devices); if (err != kAudioHardwareNoError) { ms_error("get kAudioHardwarePropertyDevices error %ld", err); return; } /*first, add Default AudioUnit does not work: why ? */ /*ms_snd_card_manager_add_card(m,ca_card_new("Default", "",-1, MS_SND_CARD_CAP_CAPTURE|MS_SND_CARD_CAP_PLAYBACK)); */ count = slen / sizeof(AudioDeviceID); for (i = 0; i < count; i++) { MSSndCard *card; char uidname[256]= {0},devname[256]= {0}; int card_capacity=0; if (check_card_capability(devices[i],FALSE,devname,uidname,sizeof(uidname))) { card_capacity|=MS_SND_CARD_CAP_PLAYBACK; } if (check_card_capability(devices[i],TRUE,devname,uidname,sizeof(uidname))) { card_capacity|=MS_SND_CARD_CAP_CAPTURE; } if (card_capacity) { card=ca_card_new(devname, uidname, devices[i], card_capacity); ms_snd_card_manager_add_card(m, card); } } }
static void cacard_detect(MSSndCardManager * m) { #ifndef TARGET_OS_IPHONE OSStatus err; UInt32 slen; int count; Boolean writable; int i; writable = 0; slen = 0; err = AudioHardwareGetPropertyInfo(kAudioHardwarePropertyDevices, &slen, &writable); if (err != kAudioHardwareNoError) { ms_error("get kAudioHardwarePropertyDevices error %ld", err); return; } AudioDeviceID V[slen / sizeof(AudioDeviceID)]; err = AudioHardwareGetProperty(kAudioHardwarePropertyDevices, &slen, V); if (err != kAudioHardwareNoError) { ms_error("get kAudioHardwarePropertyDevices error %ld", err); return; } count = slen / sizeof(AudioDeviceID); for (i = 0; i < count; i++) { char devname_in[256]; char uidname_in[256]; char devname_out[256]; char uidname_out[256]; int cap = 0; /* OUTPUT CARDS */ slen = 256; err = AudioDeviceGetProperty(V[i], 0, FALSE, kAudioDevicePropertyDeviceName, &slen, devname_out); if (err != kAudioHardwareNoError) { ms_error("get kAudioDevicePropertyDeviceName error %ld", err); continue; } slen = strlen(devname_out); /* trim whitespace */ while ((slen > 0) && (devname_out[slen - 1] == ' ')) { slen--; } devname_out[slen] = '\0'; err = AudioDeviceGetPropertyInfo(V[i], 0, FALSE, kAudioDevicePropertyStreamConfiguration, &slen, &writable); if (err != kAudioHardwareNoError) { ms_error("get kAudioDevicePropertyDeviceName error %ld", err); continue; } AudioBufferList *buflist = ms_malloc(slen); if (buflist == NULL) { ms_error("alloc AudioBufferList %ld", err); continue; } err = AudioDeviceGetProperty(V[i], 0, FALSE, kAudioDevicePropertyStreamConfiguration, &slen, buflist); if (err != kAudioHardwareNoError) { ms_error("get kAudioDevicePropertyDeviceName error %ld", err); ms_free(buflist); continue; } UInt32 j; for (j = 0; j < buflist->mNumberBuffers; j++) { if (buflist->mBuffers[j].mNumberChannels > 0) { cap = MS_SND_CARD_CAP_PLAYBACK; break; } } ms_free(buflist); /* INPUT CARDS */ slen = 256; err = AudioDeviceGetProperty(V[i], 0, TRUE, kAudioDevicePropertyDeviceName, &slen, devname_in); if (err != kAudioHardwareNoError) { ms_error("get kAudioDevicePropertyDeviceName error %ld", err); continue; } slen = strlen(devname_in); /* trim whitespace */ while ((slen > 0) && (devname_in[slen - 1] == ' ')) { slen--; } devname_in[slen] = '\0'; err = AudioDeviceGetPropertyInfo(V[i], 0, TRUE, kAudioDevicePropertyStreamConfiguration, &slen, &writable); if (err != kAudioHardwareNoError) { ms_error("get kAudioDevicePropertyDeviceName error %ld", err); continue; } err = AudioDeviceGetPropertyInfo(V[i], 0, TRUE, kAudioDevicePropertyStreamConfiguration, &slen, &writable); if (err != kAudioHardwareNoError) { ms_error("get kAudioDevicePropertyDeviceName error %ld", err); continue; } buflist = ms_malloc(slen); if (buflist == NULL) { ms_error("alloc error %ld", err); continue; } err = AudioDeviceGetProperty(V[i], 0, TRUE, kAudioDevicePropertyStreamConfiguration, &slen, buflist); if (err != kAudioHardwareNoError) { ms_error("get kAudioDevicePropertyDeviceName error %ld", err); ms_free(buflist); continue; } for (j = 0; j < buflist->mNumberBuffers; j++) { if (buflist->mBuffers[j].mNumberChannels > 0) { cap |= MS_SND_CARD_CAP_CAPTURE; break; } } ms_free(buflist); if (cap & MS_SND_CARD_CAP_PLAYBACK) { CFStringRef dUID_out; dUID_out = NULL; slen = sizeof(CFStringRef); err = AudioDeviceGetProperty(V[i], 0, false, kAudioDevicePropertyDeviceUID, &slen, &dUID_out); if (err != kAudioHardwareNoError) { ms_error("get kAudioHardwarePropertyDevices error %ld", err); continue; } CFStringGetCString(dUID_out, uidname_out, 256, CFStringGetSystemEncoding()); ms_message("CA: devname_out:%s uidname_out:%s", devname_out, uidname_out); AudioStreamBasicDescription devicewriteFormat; slen = sizeof(devicewriteFormat); err = AudioDeviceGetProperty(V[i], 0, false, kAudioDevicePropertyStreamFormat, &slen, &devicewriteFormat); if (err == kAudioHardwareNoError) { show_format("output device", &devicewriteFormat); } MSSndCard *card = ca_card_new(devname_out, dUID_out, V[i], MS_SND_CARD_CAP_PLAYBACK); ms_snd_card_manager_add_card(m, card); } if (cap & MS_SND_CARD_CAP_CAPTURE) { CFStringRef dUID_in; dUID_in = NULL; slen = sizeof(CFStringRef); err = AudioDeviceGetProperty(V[i], 0, true, kAudioDevicePropertyDeviceUID, &slen, &dUID_in); if (err != kAudioHardwareNoError) { ms_error("get kAudioHardwarePropertyDevices error %ld", err); continue; } CFStringGetCString(dUID_in, uidname_in, 256, CFStringGetSystemEncoding()); ms_message("CA: devname_in:%s uidname_in:%s", devname_in, uidname_in); AudioStreamBasicDescription devicereadFormat; slen = sizeof(devicereadFormat); err = AudioDeviceGetProperty(V[i], 0, true, kAudioDevicePropertyStreamFormat, &slen, &devicereadFormat); if (err == kAudioHardwareNoError) { show_format("input device", &devicereadFormat); } MSSndCard *card = ca_card_new(devname_in, dUID_in, V[i], MS_SND_CARD_CAP_CAPTURE); ms_snd_card_manager_add_card(m, card); } } #else AudioStreamBasicDescription deviceFormat; memset(&deviceFormat, 0, sizeof(AudioStreamBasicDescription)); MSSndCard *card = ca_card_new("AudioUnit Device", NULL, 0 /*?*/, MS_SND_CARD_CAP_PLAYBACK|MS_SND_CARD_CAP_CAPTURE); ms_snd_card_manager_add_card(m, card); #endif }