Exemplo n.º 1
0
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);
        }

    }
}
Exemplo n.º 2
0
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
}