/* This is called when PulseAudio adds an output ("sink") device. */ static void SinkInfoCallback(pa_context *c, const pa_sink_info *i, int is_last, void *data) { if (i) { SDL_AddAudioDevice(SDL_FALSE, i->description, (void *) ((size_t) i->index+1)); } }
static void XAUDIO2_DetectDevices(void) { IXAudio2 *ixa2 = NULL; UINT32 devcount = 0; UINT32 i = 0; if (XAudio2Create(&ixa2, 0, XAUDIO2_DEFAULT_PROCESSOR) != S_OK) { SDL_SetError("XAudio2: XAudio2Create() failed at detection."); return; } else if (IXAudio2_GetDeviceCount(ixa2, &devcount) != S_OK) { SDL_SetError("XAudio2: IXAudio2::GetDeviceCount() failed."); IXAudio2_Release(ixa2); return; } for (i = 0; i < devcount; i++) { XAUDIO2_DEVICE_DETAILS details; if (IXAudio2_GetDeviceDetails(ixa2, i, &details) == S_OK) { char *str = WIN_StringToUTF8(details.DisplayName); if (str != NULL) { SDL_AddAudioDevice(SDL_FALSE, str, (void *) ((size_t) i+1)); SDL_free(str); /* SDL_AddAudioDevice made a copy of the string. */ } } } IXAudio2_Release(ixa2); }
static void addToDevList(const char *name, const int iscapture, AudioDeviceID devId, void *data) { if (add_to_internal_dev_list(iscapture, devId)) { SDL_AddAudioDevice(iscapture, name, (void *) ((size_t) devId)); } }
/* This is called when PulseAudio adds a capture ("source") device. */ static void SourceInfoCallback(pa_context *c, const pa_source_info *i, int is_last, void *data) { if (i) { /* Skip "monitor" sources. These are just output from other sinks. */ if (i->monitor_of_sink == PA_INVALID_INDEX) { SDL_AddAudioDevice(SDL_TRUE, i->description, (void *) ((size_t) i->index+1)); } } }
static void build_device_change_list(const char *name, const int iscapture, AudioDeviceID devId, void *data) { AudioDeviceList **list = (AudioDeviceList **) data; AudioDeviceList *item; for (item = *list; item != NULL; item = item->next) { if (item->devid == devId) { item->alive = SDL_TRUE; return; } } add_to_internal_dev_list(iscapture, devId); /* new device, add it. */ SDL_AddAudioDevice(iscapture, name, (void *) ((size_t) devId)); }
static BOOL CALLBACK FindAllDevs(LPGUID guid, LPCWSTR desc, LPCWSTR module, LPVOID data) { const int iscapture = (int) ((size_t) data); if (guid != NULL) { /* skip default device */ char *str = WIN_LookupAudioDeviceName(desc, guid); if (str != NULL) { LPGUID cpyguid = (LPGUID) SDL_malloc(sizeof (GUID)); SDL_memcpy(cpyguid, guid, sizeof (GUID)); SDL_AddAudioDevice(iscapture, str, cpyguid); SDL_free(str); /* addfn() makes a copy of this string. */ } } return TRUE; /* keep enumerating. */ }
static void QSA_DetectDevices(void) { uint32_t it; uint32_t cards; uint32_t devices; int32_t status; /* Detect amount of available devices */ /* this value can be changed in the runtime */ cards = snd_cards(); /* If io-audio manager is not running we will get 0 as number */ /* of available audio devices */ if (cards == 0) { /* We have no any available audio devices */ return; } /* !!! FIXME: code duplication */ /* Find requested devices by type */ { /* output devices */ /* Playback devices enumeration requested */ for (it = 0; it < cards; it++) { devices = 0; do { status = snd_card_get_longname(it, qsa_playback_device [qsa_playback_devices].name, QSA_MAX_NAME_LENGTH); if (status == EOK) { snd_pcm_t *handle; /* Add device number to device name */ sprintf(qsa_playback_device[qsa_playback_devices].name + SDL_strlen(qsa_playback_device [qsa_playback_devices].name), " d%d", devices); /* Store associated card number id */ qsa_playback_device[qsa_playback_devices].cardno = it; /* Check if this device id could play anything */ status = snd_pcm_open(&handle, it, devices, SND_PCM_OPEN_PLAYBACK); if (status == EOK) { qsa_playback_device[qsa_playback_devices].deviceno = devices; status = snd_pcm_close(handle); if (status == EOK) { SDL_AddAudioDevice(SDL_FALSE, qsa_playback_device[qsa_playback_devices].name, &qsa_playback_device[qsa_playback_devices]); qsa_playback_devices++; } } else { /* Check if we got end of devices list */ if (status == -ENOENT) { break; } } } else { break; } /* Check if we reached maximum devices count */ if (qsa_playback_devices >= QSA_MAX_DEVICES) { break; } devices++; } while (1); /* Check if we reached maximum devices count */ if (qsa_playback_devices >= QSA_MAX_DEVICES) { break; } } } { /* capture devices */ /* Capture devices enumeration requested */ for (it = 0; it < cards; it++) { devices = 0; do { status = snd_card_get_longname(it, qsa_capture_device [qsa_capture_devices].name, QSA_MAX_NAME_LENGTH); if (status == EOK) { snd_pcm_t *handle; /* Add device number to device name */ sprintf(qsa_capture_device[qsa_capture_devices].name + SDL_strlen(qsa_capture_device [qsa_capture_devices].name), " d%d", devices); /* Store associated card number id */ qsa_capture_device[qsa_capture_devices].cardno = it; /* Check if this device id could play anything */ status = snd_pcm_open(&handle, it, devices, SND_PCM_OPEN_CAPTURE); if (status == EOK) { qsa_capture_device[qsa_capture_devices].deviceno = devices; status = snd_pcm_close(handle); if (status == EOK) { SDL_AddAudioDevice(SDL_TRUE, qsa_capture_device[qsa_capture_devices].name, &qsa_capture_device[qsa_capture_devices]); qsa_capture_devices++; } } else { /* Check if we got end of devices list */ if (status == -ENOENT) { break; } } /* Check if we reached maximum devices count */ if (qsa_capture_devices >= QSA_MAX_DEVICES) { break; } } else { break; } devices++; } while (1); /* Check if we reached maximum devices count */ if (qsa_capture_devices >= QSA_MAX_DEVICES) { break; } } } }