INT32 PORT_GetPortMixerCount() { INT32 mixerCount; int card; char devname[16]; int err; snd_ctl_t *handle; snd_ctl_card_info_t* info; TRACE0("> PORT_GetPortMixerCount\n"); initAlsaSupport(); snd_ctl_card_info_malloc(&info); card = -1; mixerCount = 0; if (snd_card_next(&card) >= 0) { while (card >= 0) { sprintf(devname, ALSA_HARDWARE_CARD, card); TRACE1("PORT_GetPortMixerCount: Opening alsa device \"%s\"...\n", devname); err = snd_ctl_open(&handle, devname, 0); if (err < 0) { ERROR2("ERROR: snd_ctl_open, card=%d: %s\n", card, snd_strerror(err)); } else { mixerCount++; snd_ctl_close(handle); } if (snd_card_next(&card) < 0) { break; } } } snd_ctl_card_info_free(info); TRACE0("< PORT_GetPortMixerCount\n"); return mixerCount; }
INT32 PORT_GetPortMixerDescription(INT32 mixerIndex, PortMixerDescription* description) { snd_ctl_t* handle; snd_ctl_card_info_t* card_info; char devname[16]; int err; char buffer[100]; TRACE0("> PORT_GetPortMixerDescription\n"); snd_ctl_card_info_malloc(&card_info); sprintf(devname, ALSA_HARDWARE_CARD, (int) mixerIndex); TRACE1("Opening alsa device \"%s\"...\n", devname); err = snd_ctl_open(&handle, devname, 0); if (err < 0) { ERROR2("ERROR: snd_ctl_open, card=%d: %s\n", (int) mixerIndex, snd_strerror(err)); return FALSE; } err = snd_ctl_card_info(handle, card_info); if (err < 0) { ERROR2("ERROR: snd_ctl_card_info, card=%d: %s\n", (int) mixerIndex, snd_strerror(err)); } strncpy(description->name, snd_ctl_card_info_get_id(card_info), PORT_STRING_LENGTH - 1); sprintf(buffer, " [%s]", devname); strncat(description->name, buffer, PORT_STRING_LENGTH - 1 - strlen(description->name)); strncpy(description->vendor, "ALSA (http://www.alsa-project.org)", PORT_STRING_LENGTH - 1); strncpy(description->description, snd_ctl_card_info_get_name(card_info), PORT_STRING_LENGTH - 1); strncat(description->description, ", ", PORT_STRING_LENGTH - 1 - strlen(description->description)); strncat(description->description, snd_ctl_card_info_get_mixername(card_info), PORT_STRING_LENGTH - 1 - strlen(description->description)); getALSAVersion(description->version, PORT_STRING_LENGTH - 1); snd_ctl_close(handle); snd_ctl_card_info_free(card_info); TRACE0("< PORT_GetPortMixerDescription\n"); return TRUE; }
/*---------------------------------------------------------------------------- ** ALSA_AddUserSpecifiedDevice ** Add a device given from the registry */ static int ALSA_AddUserSpecifiedDevice(const char *ctlname, const char *pcmname) { int rc; int okay = 0; snd_ctl_t *ctl = NULL; snd_pcm_t *pcm = NULL; if (ctlname) { rc = snd_ctl_open(&ctl, ctlname, SND_CTL_NONBLOCK); if (rc < 0) ctl = NULL; } rc = snd_pcm_open(&pcm, pcmname, SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK); if (rc >= 0) { ALSA_AddPlaybackDevice(ctl, pcm, pcmname, FALSE); okay++; snd_pcm_close(pcm); } rc = snd_pcm_open(&pcm, pcmname, SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK); if (rc >= 0) { ALSA_AddCaptureDevice(ctl, pcm, pcmname, FALSE); okay++; snd_pcm_close(pcm); } if (ctl) snd_ctl_close(ctl); return (okay == 0); }
std::vector<String> AudioOutputDeviceAlsa::ParameterCard::PossibilitiesAsString(std::map<String,String> Parameters) { int err; std::vector<String> CardNames; // iterate through all cards int card_index = -1; while (snd_card_next(&card_index) >= 0 && card_index >= 0) { String hw_name = "hw:" + ToString(card_index); snd_ctl_t* hCardCtrl; if ((err = snd_ctl_open(&hCardCtrl, hw_name.c_str(), 0)) < 0) { std::cerr << "AudioOutputDeviceAlsa: Cannot open sound control for card " << card_index << " - " << snd_strerror(err) << std::endl; continue; } // iterate through all devices of that card int device_index = -1; while (!snd_ctl_pcm_next_device(hCardCtrl, &device_index) && device_index >= 0) { String name = ToString(card_index) + "," + ToString(device_index); //dmsg(1,("[possibility:%s]", name.c_str())); CardNames.push_back(name); } snd_ctl_close(hCardCtrl); } return CardNames; }
static const char* search_device(void) { int card, err; snd_hwdep_info_t* info; snd_hwdep_info_alloca(&info); card = -1; while (snd_card_next(&card) >= 0 && card >= 0) { char ctl_name[20]; snd_ctl_t* ctl; int device; sprintf(ctl_name, "hw:CARD=%d", card); err = snd_ctl_open(&ctl, ctl_name, SND_CTL_NONBLOCK); if (err < 0) continue; device = -1; while (snd_ctl_hwdep_next_device(ctl, &device) >= 0 && device >= 0) { snd_hwdep_info_set_device(info, device); err = snd_ctl_hwdep_info(ctl, info); if (err >= 0 && snd_hwdep_info_get_iface(info) == SND_HWDEP_IFACE_SB_RC) { static char name[36]; sprintf(name, "hw:CARD=%d,DEV=%d", card, device); snd_ctl_close(ctl); return name; } } snd_ctl_close(ctl); } return NULL; }
void scan_cycle(alsa_rawmidi_t *midi) { int card = -1, err; scan_t scan; midi_port_t **ports; //debug_log("scan: cleanup"); scan_cleanup(midi); scan.midi = midi; scan.iterator = &midi->scan.ports; snd_rawmidi_info_alloca(&scan.info); //debug_log("scan: rescan"); while ((err = snd_card_next(&card))>=0 && card>=0) { char name[32]; snprintf(name, sizeof(name), "hw:%d", card); if ((err = snd_ctl_open(&scan.ctl, name, SND_CTL_NONBLOCK))>=0) { scan_card(&scan); snd_ctl_close(scan.ctl); } else alsa_error("scan: snd_ctl_open", err); } // delayed open to workaround alsa<1.0.14 bug (can't open more than 1 subdevice if ctl is opened). ports = &midi->scan.ports; while (*ports) { midi_port_t *port = *ports; if (port->state == PORT_CREATED) ports = scan_port_open(midi, ports); else ports = &port->next; } }
static int open_ctl(snd_use_case_mgr_t *uc_mgr, snd_ctl_t **ctl, const char *ctl_dev) { int err; /* FIXME: add a list of ctl devices to uc_mgr structure and cache accesses for multiple opened ctl devices */ if (uc_mgr->ctl_dev != NULL && strcmp(ctl_dev, uc_mgr->ctl_dev) == 0) { *ctl = uc_mgr->ctl; return 0; } if (uc_mgr->ctl_dev) { free(uc_mgr->ctl_dev); uc_mgr->ctl_dev = NULL; snd_ctl_close(uc_mgr->ctl); uc_mgr->ctl = NULL; } err = snd_ctl_open(ctl, ctl_dev, 0); if (err < 0) return err; uc_mgr->ctl_dev = strdup(ctl_dev); if (uc_mgr->ctl_dev == NULL) { snd_ctl_close(*ctl); return -ENOMEM; } uc_mgr->ctl = *ctl; return 0; }
static int cards(lua_State *lstate) { snd_ctl_t *handle; int ret, card, ord; char buf[32]; snd_ctl_card_info_t *info; snd_ctl_card_info_alloca(&info); ord = 1; card = -1; lua_newtable(lstate); while (1) { if ((snd_card_next(&card) < 0) || (card < 0)) break; sprintf(buf, "hw:%d", card); if ((ret = snd_ctl_open(&handle, buf, 0)) < 0) { logmsg("control open: %s\n", snd_strerror(ret)); continue; } if ((ret = snd_ctl_card_info(handle, info)) < 0) { logmsg("control info: %s\n", snd_strerror(ret)); continue; } lua_pushinteger(lstate, ord++); lua_newtable(lstate); set_string(lstate, "dev", buf); set_string(lstate, "name", snd_ctl_card_info_get_name(info)); lua_settable(lstate, -3); snd_ctl_close(handle); //view_card(buf); } return 1; }
/** * Partly based on get_cards function in alsamixer. * This gets all alsa cards and fills the global * GSList 'cards'. * The list always starts with the 'default' card. */ static void get_cards(void) { int err, num; snd_ctl_card_info_t *info; snd_ctl_t *ctl; char buf[10]; struct acard *cur_card, *default_card; if (cards != NULL) g_slist_free_full(cards, card_free); cards = NULL; default_card = g_malloc(sizeof(struct acard)); default_card->name = g_strdup("(default)"); default_card->dev = g_strdup("default"); default_card->channels = get_channels("default"); cards = g_slist_append(cards, default_card); // don't need to free this as it's alloca'd snd_ctl_card_info_alloca(&info); num = -1; for (;;) { err = snd_card_next(&num); if (err < 0) { report_error("Can't get sounds cards: %s", snd_strerror(err)); return; } if (num < 0) break; sprintf(buf, "hw:%d", num); if (snd_ctl_open(&ctl, buf, 0) < 0) continue; err = snd_ctl_card_info(ctl, info); snd_ctl_close(ctl); if (err < 0) continue; cur_card = g_malloc(sizeof(struct acard)); cur_card->name = g_strdup(snd_ctl_card_info_get_name(info)); sprintf(buf, "hw:%d", num); cur_card->dev = g_strdup(buf); cur_card->channels = get_channels(buf); cards = g_slist_append(cards, cur_card); } #ifdef DEBUG GSList *tmp = cards; if (tmp) { printf("------ Card list ------\n"); while (tmp) { struct acard *c = tmp->data; printf("\t%s\t%s\t%s\n", c->dev, c->name, c->channels ? "" : "No chann"); tmp = tmp->next; } printf("-----------------------\n"); } #endif }
void audio_set_default_levels() { int err; snd_ctl_t *ctl; snd_ctl_elem_value_t *val; snd_ctl_elem_value_alloca(&val); if (snd_ctl_open(&ctl, ALSA_DEVICE, 0)) { fprintf(stderr, "can't open audio device"); return; } /* unmute microphone */ snd_ctl_elem_value_set_interface(val, SND_CTL_ELEM_IFACE_MIXER); snd_ctl_elem_value_set_name(val, "Mic Capture Switch"); snd_ctl_elem_value_set_integer(val, 0, 1); err = snd_ctl_elem_write(ctl, val); if (err) fprintf(stderr, "can't unmute microphone: %s\n", snd_strerror(err)); /* unmute speaker */ snd_ctl_elem_value_clear(val); snd_ctl_elem_value_set_interface(val, SND_CTL_ELEM_IFACE_MIXER); snd_ctl_elem_value_set_name(val, "Speaker Playback Switch"); snd_ctl_elem_value_set_integer(val, 0, 1); err = snd_ctl_elem_write(ctl, val); if (err) fprintf(stderr, "can't unmute speaker: %s\n", snd_strerror(err)); /* set mic volume */ snd_ctl_elem_value_clear(val); snd_ctl_elem_value_set_interface(val, SND_CTL_ELEM_IFACE_MIXER); snd_ctl_elem_value_set_name(val, "Mic Capture Volume"); snd_ctl_elem_value_set_integer(val, 0, DEFAULT_MIC_VOL); err = snd_ctl_elem_write(ctl, val); if (err) fprintf(stderr, "can't set microphone volume: %s\n", snd_strerror(err)); /* set speaker volume */ snd_ctl_elem_value_clear(val); snd_ctl_elem_value_set_interface(val, SND_CTL_ELEM_IFACE_MIXER); snd_ctl_elem_value_set_name(val, "Speaker Playback Volume"); snd_ctl_elem_value_set_integer(val, 0, DEFAULT_SPKR_VOL); snd_ctl_elem_value_set_integer(val, 1, DEFAULT_SPKR_VOL); err = snd_ctl_elem_write(ctl, val); if (err) fprintf(stderr, "can't set speaker volume: %s\n", snd_strerror(err)); /* set capture source */ snd_ctl_elem_value_clear(val); snd_ctl_elem_value_set_interface(val, SND_CTL_ELEM_IFACE_MIXER); snd_ctl_elem_value_set_name(val, "PCM Capture Source"); snd_ctl_elem_value_set_integer(val, 0, 0); err = snd_ctl_elem_write(ctl, val); if (err) fprintf(stderr, "can't set capture source: %s\n", snd_strerror(err)); snd_ctl_close(ctl); }
int main(int argc, char **argv) { register int err; int cardNum; // Start with first card cardNum = -1; for (;;) { snd_ctl_t *cardHandle; // Get next sound card's card number. When "cardNum" == -1, then ALSA // fetches the first card if ((err = snd_card_next(&cardNum)) < 0) { printf("Can't get the next card number: %s\n", snd_strerror(err)); break; } // No more cards? ALSA sets "cardNum" to -1 if so if (cardNum < 0) break; // Open this card's control interface. We specify only the card number -- not // any device nor sub-device too { char str[64]; sprintf(str, "hw:%i", cardNum); if ((err = snd_ctl_open(&cardHandle, str, 0)) < 0) { printf("Can't open card %i: %s\n", cardNum, snd_strerror(err)); continue; } } { snd_ctl_card_info_t *cardInfo; // We need to get a snd_ctl_card_info_t. Just alloc it on the stack snd_ctl_card_info_alloca(&cardInfo); // Tell ALSA to fill in our snd_ctl_card_info_t with info about this card if ((err = snd_ctl_card_info(cardHandle, cardInfo)) < 0) printf("Can't get info for card %i: %s\n", cardNum, snd_strerror(err)); else printf("Card %i = %s\n", cardNum, snd_ctl_card_info_get_name(cardInfo)); } // Close the card's control interface after we're done with it snd_ctl_close(cardHandle); } // ALSA allocates some mem to load its config file when we call some of the // above functions. Now that we're done getting the info, let's tell ALSA // to unload the info and free up that mem snd_config_update_free_global(); }
static char *ListAvailableDevices( demux_t *p_demux, bool b_probe ) { snd_ctl_card_info_t *p_info = NULL; snd_ctl_card_info_alloca( &p_info ); snd_pcm_info_t *p_pcminfo = NULL; snd_pcm_info_alloca( &p_pcminfo ); if( !b_probe ) msg_Dbg( p_demux, "Available alsa capture devices:" ); int i_card = -1; while( !snd_card_next( &i_card ) && i_card >= 0 ) { char psz_devname[10]; snprintf( psz_devname, 10, "hw:%d", i_card ); snd_ctl_t *p_ctl = NULL; if( snd_ctl_open( &p_ctl, psz_devname, 0 ) < 0 ) continue; snd_ctl_card_info( p_ctl, p_info ); if( !b_probe ) msg_Dbg( p_demux, " %s (%s)", snd_ctl_card_info_get_id( p_info ), snd_ctl_card_info_get_name( p_info ) ); int i_dev = -1; while( !snd_ctl_pcm_next_device( p_ctl, &i_dev ) && i_dev >= 0 ) { snd_pcm_info_set_device( p_pcminfo, i_dev ); snd_pcm_info_set_subdevice( p_pcminfo, 0 ); snd_pcm_info_set_stream( p_pcminfo, SND_PCM_STREAM_CAPTURE ); if( snd_ctl_pcm_info( p_ctl, p_pcminfo ) < 0 ) continue; if( !b_probe ) msg_Dbg( p_demux, " hw:%d,%d : %s (%s)", i_card, i_dev, snd_pcm_info_get_id( p_pcminfo ), snd_pcm_info_get_name( p_pcminfo ) ); else { char *psz_device; if( asprintf( &psz_device, "hw:%d,%d", i_card, i_dev ) > 0 ) { if( ProbeAudioDevAlsa( p_demux, psz_device ) ) { snd_ctl_close( p_ctl ); return psz_device; } else free( psz_device ); } } } snd_ctl_close( p_ctl ); } return NULL; }
bool MainWindowImpl::FindRadioshark(string& device) { int card = -1; int dev = -1; snd_ctl_t *handle = NULL; snd_ctl_card_info_t *info = NULL; snd_pcm_info_t *pcminfo = NULL; snd_pcm_stream_t stream = SND_PCM_STREAM_CAPTURE; char card_id[32]; char *name = NULL; snd_ctl_card_info_alloca (&info); snd_pcm_info_alloca (&pcminfo); if (snd_card_next (&card) < 0 || card < 0) { return false; } while(card >= 0) { snprintf (card_id, 32, "hw:%d", card); if (snd_ctl_open (&handle, card_id, 0) == 0) { snd_ctl_card_info (handle, info); while (1) { snd_ctl_pcm_next_device (handle, &dev); if (dev < 0){ break; } snd_pcm_info_set_device (pcminfo, dev); snd_pcm_info_set_subdevice (pcminfo, 0); snd_pcm_info_set_stream (pcminfo, stream); if (snd_ctl_pcm_info (handle, pcminfo) >= 0) { snd_card_get_name (card, &name); if(strncmp(name,"radioSHARK",32) == 0) {void PokeScreensaver(void); snd_ctl_close(handle); free (name); snprintf (card_id, 32, "hw:%d,%d", card,dev); device = string(card_id); return true; } free (name); } } snd_ctl_close(handle); } snd_card_next (&card); } return false;//didn't find the proper Radioshark card. }
static void deviceList(int type, vector_DevMap *devmap) { snd_ctl_t* handle; snd_pcm_info_t pcminfo; int max_cards, card, err, dev; DevMap entry; char name[1024]; struct snd_ctl_hw_info info; void* temp; max_cards = snd_cards(); if(max_cards < 0) return; VECTOR_RESERVE(*devmap, max_cards+1); VECTOR_RESIZE(*devmap, 0); entry.name = strdup(qsaDevice); entry.card = 0; entry.dev = 0; VECTOR_PUSH_BACK(*devmap, entry); for(card = 0;card < max_cards;card++) { if((err=snd_ctl_open(&handle, card)) < 0) continue; if((err=snd_ctl_hw_info(handle, &info)) < 0) { snd_ctl_close(handle); continue; } for(dev = 0;dev < (int)info.pcmdevs;dev++) { if((err=snd_ctl_pcm_info(handle, dev, &pcminfo)) < 0) continue; if((type==SND_PCM_CHANNEL_PLAYBACK && (pcminfo.flags&SND_PCM_INFO_PLAYBACK)) || (type==SND_PCM_CHANNEL_CAPTURE && (pcminfo.flags&SND_PCM_INFO_CAPTURE))) { snprintf(name, sizeof(name), "%s [%s] (hw:%d,%d)", info.name, pcminfo.name, card, dev); entry.name = strdup(name); entry.card = card; entry.dev = dev; VECTOR_PUSH_BACK(*devmap, entry); TRACE("Got device \"%s\", card %d, dev %d\n", name, card, dev); } } snd_ctl_close(handle); } }
std::vector<HwIDPair> AlsaLayer::getAudioDeviceIndexMap(bool getCapture) const { snd_ctl_t* handle; snd_ctl_card_info_t *info; snd_pcm_info_t* pcminfo; snd_ctl_card_info_alloca(&info); snd_pcm_info_alloca(&pcminfo); int numCard = -1; std::vector<HwIDPair> audioDevice; if (snd_card_next(&numCard) < 0 || numCard < 0) return audioDevice; do { std::stringstream ss; ss << numCard; std::string name = "hw:" + ss.str(); if (snd_ctl_open(&handle, name.c_str(), 0) == 0) { if (snd_ctl_card_info(handle, info) == 0) { snd_pcm_info_set_device(pcminfo, 0); snd_pcm_info_set_stream(pcminfo, getCapture ? SND_PCM_STREAM_CAPTURE : SND_PCM_STREAM_PLAYBACK); int err; if ((err = snd_ctl_pcm_info(handle, pcminfo)) < 0) { WARN("Cannot get info for %s %s: %s", getCapture ? "capture device" : "playback device", name.c_str(), snd_strerror(err)); } else { DEBUG("card %i : %s [%s]", numCard, snd_ctl_card_info_get_id(info), snd_ctl_card_info_get_name(info)); std::string description = snd_ctl_card_info_get_name(info); description.append(" - "); description.append(snd_pcm_info_get_name(pcminfo)); // The number of the sound card is associated with a string description audioDevice.push_back(HwIDPair(numCard, description)); } } snd_ctl_close(handle); } } while (snd_card_next(&numCard) >= 0 && numCard >= 0); return audioDevice; }
/** * \brief Opens an HCTL * \param hctlp Returned HCTL handle * \param name ASCII identifier of the underlying CTL handle * \param mode Open mode (see #SND_CTL_NONBLOCK, #SND_CTL_ASYNC) * \return 0 on success otherwise a negative error code */ int snd_hctl_open(snd_hctl_t **hctlp, const char *name, int mode) { snd_ctl_t *ctl; int err; if ((err = snd_ctl_open(&ctl, name, mode)) < 0) return err; err = snd_hctl_open_ctl(hctlp, ctl); if (err < 0) snd_ctl_close(ctl); return err; }
int V4LRadioControl::volume() const { const QString ctlName("Line DAC Playback Volume"); const QString card("hw:0"); int volume = 0; int err; static snd_ctl_t *handle = NULL; snd_ctl_elem_info_t *info; snd_ctl_elem_id_t *id; snd_ctl_elem_value_t *control; snd_ctl_elem_info_alloca(&info); snd_ctl_elem_id_alloca(&id); snd_ctl_elem_value_alloca(&control); snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_MIXER); /* MIXER */ snd_ctl_elem_id_set_name(id, ctlName.toAscii()); if ((err = snd_ctl_open(&handle, card.toAscii(), 0)) < 0) { return 0; } snd_ctl_elem_info_set_id(info, id); if ((err = snd_ctl_elem_info(handle, info)) < 0) { snd_ctl_close(handle); handle = NULL; return 0; } snd_ctl_elem_info_get_id(info, id); /* FIXME: Remove it when hctl find works ok !!! */ snd_ctl_elem_value_set_id(control, id); snd_ctl_close(handle); handle = NULL; snd_hctl_t *hctl; snd_hctl_elem_t *elem; if ((err = snd_hctl_open(&hctl, card.toAscii(), 0)) < 0) { return 0; } if ((err = snd_hctl_load(hctl)) < 0) { return 0; } elem = snd_hctl_find_elem(hctl, id); if (elem) volume = vol(elem); snd_hctl_close(hctl); return (volume/118.0) * 100; }
/** * ags_devout_list_cards: * @soundcard: the #AgsSoundcard * @card_id: alsa identifier * @card_name: card name * * List available soundcards. * * Since: 0.4 */ void ags_devout_list_cards(AgsSoundcard *soundcard, GList **card_id, GList **card_name) { snd_ctl_t *card_handle; snd_ctl_card_info_t *card_info; char *name; gchar *str; int card_num; int error; *card_id = NULL; *card_name = NULL; card_num = -1; while(TRUE){ error = snd_card_next(&card_num); if(card_num < 0){ break; } if(error < 0){ continue; } str = g_strdup_printf("hw:%i\0", card_num); error = snd_ctl_open(&card_handle, str, 0); if(error < 0){ continue; } snd_ctl_card_info_alloca(&card_info); error = snd_ctl_card_info(card_handle, card_info); if(error < 0){ continue; } *card_id = g_list_prepend(*card_id, str); *card_name = g_list_prepend(*card_name, g_strdup(snd_ctl_card_info_get_name(card_info))); snd_ctl_close(card_handle); } snd_config_update_free_global(); *card_id = g_list_reverse(*card_id); *card_name = g_list_reverse(*card_name); }
int get_gain(int idx, int src, int dst) { int err; int val = HDSPMM_ERROR_NO_CARD; snd_ctl_elem_id_t *id; snd_ctl_elem_value_t *ctl; snd_ctl_t *handle; if(idx >= HDSPMM_MAX_CARDS || idx < 0) return HDSPMM_ERROR_WRONG_IDX; snd_ctl_elem_value_alloca(&ctl); snd_ctl_elem_id_alloca(&id); snd_ctl_elem_id_set_name(id, "Mixer"); snd_ctl_elem_id_set_numid(id, 0); snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_HWDEP); snd_ctl_elem_id_set_device(id, 0); snd_ctl_elem_id_set_subdevice(id, 0); snd_ctl_elem_id_set_index(id, 0); snd_ctl_elem_value_set_id(ctl, id); if ((err = snd_ctl_open(&handle, card_name[cardid], SND_CTL_NONBLOCK)) < 0) { #ifndef QUIET fprintf(stderr, "Alsa error: %s\n", snd_strerror(err)); #endif return HDSPMM_ERROR_ALSA_OPEN; } snd_ctl_elem_value_set_integer(ctl, 0, src); snd_ctl_elem_value_set_integer(ctl, 1, dst); if ((err = snd_ctl_elem_read(handle, ctl)) < 0) { #ifndef QUIET fprintf(stderr, "Alsa error: %s\n", snd_strerror(err)); #endif return HDSPMM_ERROR_ALSA_READ; } val = snd_ctl_elem_value_get_integer(ctl, 2); snd_ctl_close(handle); return val; SETFLOAT(x->x_at+1, delta); SETFLOAT(x->x_at+2, phi); outlet_list(x->x_out_para, &s_list, 3, x->x_at); outlet_anything(x->x_obj.ob_outlet, s, x->x_size2d+1, x->x_at); }
int set_gain(int idx, int src, int dst, int val) { int err; snd_ctl_elem_id_t *id; snd_ctl_elem_value_t *ctl; snd_ctl_t *handle; if(idx >= HDSPMM_MAX_CARDS || idx < 0) return HDSPMM_ERROR_WRONG_IDX; snd_ctl_elem_value_alloca(&ctl); snd_ctl_elem_id_alloca(&id); snd_ctl_elem_id_set_name(id, "Mixer"); snd_ctl_elem_id_set_numid(id, 0); snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_HWDEP); snd_ctl_elem_id_set_device(id, 0); snd_ctl_elem_id_set_subdevice(id, 0); snd_ctl_elem_id_set_index(id, 0); snd_ctl_elem_value_set_id(ctl, id); if ((err = snd_ctl_open(&handle, card_name[idx], SND_CTL_NONBLOCK)) < 0) { #ifndef QUIET fprintf(stderr, "Alsa error: %s\n", snd_strerror(err)); #endif return HDSPMM_ERROR_ALSA_OPEN; } snd_ctl_elem_value_set_integer(ctl, 0, src); snd_ctl_elem_value_set_integer(ctl, 1, dst); snd_ctl_elem_value_set_integer(ctl, 2, val); if ((err = snd_ctl_elem_write(handle, ctl)) < 0) { #ifndef QUIET fprintf(stderr, "Alsa error: %s\n", snd_strerror(err)); #endif return HDSPMM_ERROR_ALSA_WRITE; } val = snd_ctl_elem_value_get_integer(ctl, 2); snd_ctl_close(handle); return val; }
static int open_ctl(const char *name, snd_ctl_t **ctlp) { snd_ctl_t *ctl; if (snd_ctl_open(&ctl, name, SND_CTL_READONLY) < 0) { fprintf(stderr, "Cannot open ctl %s\n", name); return 1; } if (snd_ctl_subscribe_events(ctl, 1) < 0) { fprintf(stderr, "Cannot open subscribe events to ctl %s\n", name); snd_ctl_close(ctl); return 1; } *ctlp = ctl; return 0; }
bool AlsaLayer::soundCardIndexExists(int card, DeviceType stream) { snd_pcm_info_t *pcminfo; snd_pcm_info_alloca(&pcminfo); std::string name("hw:"); std::stringstream ss; ss << card; name.append(ss.str()); snd_ctl_t* handle; if (snd_ctl_open(&handle, name.c_str(), 0) != 0) return false; snd_pcm_info_set_stream(pcminfo, stream == DeviceType::PLAYBACK ? SND_PCM_STREAM_PLAYBACK : SND_PCM_STREAM_CAPTURE); bool ret = snd_ctl_pcm_info(handle, pcminfo) >= 0; snd_ctl_close(handle); return ret; }
const std::string AlsaWork::getCardName(int index) { const std::string card(AlsaDevice::formatCardName(index)); snd_ctl_t *ctl; int err = snd_ctl_open(&ctl, card.c_str(), SND_CTL_NONBLOCK); if (err < 0) { checkError(err); return std::string(); } snd_ctl_card_info_t *cardInfo; snd_ctl_card_info_alloca(&cardInfo); err = snd_ctl_card_info(ctl, cardInfo); if (err < 0) { checkError(err); return std::string(); } const std::string cardName = snd_ctl_card_info_get_name(cardInfo); checkError(snd_ctl_close(ctl)); return cardName; }
void list_cards(void) { snd_ctl_card_info_t *p_info = NULL; snd_ctl_card_info_alloca(&p_info); snd_pcm_info_t *p_pcminfo = NULL; snd_pcm_info_alloca(&p_pcminfo); printf("Availible alsa capture devices:\n"); int i_card = -1; while (!snd_card_next(&i_card) && i_card >= 0) { char devname[10]; snprintf( devname, 10, "hw:%d", i_card ); snd_ctl_t *p_ctl = NULL; if ( snd_ctl_open( &p_ctl, devname, 0 ) < 0) continue; snd_ctl_card_info( p_ctl, p_info); printf("\t%s (%s)\n", snd_ctl_card_info_get_id(p_info), snd_ctl_card_info_get_name(p_info)); int i_dev = -1; while (!snd_ctl_pcm_next_device(p_ctl, &i_dev) && i_dev >= 0) { snd_pcm_info_set_device(p_pcminfo, i_dev); snd_pcm_info_set_subdevice(p_pcminfo, 0); snd_pcm_info_set_stream(p_pcminfo, SND_PCM_STREAM_CAPTURE); if (snd_ctl_pcm_info(p_ctl, p_pcminfo) < 0) continue; printf("\t\thw:%d,%d : %s (%s)\n", i_card, i_dev, snd_pcm_info_get_id(p_pcminfo), snd_pcm_info_get_name(p_pcminfo)); } snd_ctl_close(p_ctl); } }
static void as_setup_card_combo (GtkWidget *combo , SoundParams *sparams) { int card; int i ; int err; snd_ctl_t *handle; snd_ctl_card_info_t *info; char name[32]; gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), "- default"); snd_ctl_card_info_alloca(&info); sparams->firstcard = -1; card = -1; for( i = 0 ; ; i++ ){ if (snd_card_next(&card) < 0 || card < 0) { if ( i == 0 ) { msg_error(_("no soundcards found...")); } return; } if ( sparams->firstcard < 0 ) { sparams->firstcard = card; } sprintf(name, "hw:%d", card); if ((err = snd_ctl_open(&handle, name, 0)) < 0) { msg_error(_("control open (%i): %s"), card, snd_strerror(err)); continue; } if ((err = snd_ctl_card_info(handle, info)) < 0) { msg_error(_("control hardware info (%i): %s"), card, snd_strerror(err)); snd_ctl_close(handle); continue; } sprintf(name, "%d %s", card, snd_ctl_card_info_get_name(info) ); gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (combo), name ); snd_ctl_close(handle); } }
void list_midi_devices_on_card(int card) { snd_ctl_t *ctl; char name[32]; int device = -1; int status; sprintf(name, "hw:%d", card); if ((status = snd_ctl_open(&ctl, name, 0)) < 0) { error("cannot open control for card %d: %s", card, snd_strerror(status)); return; } do { status = snd_ctl_rawmidi_next_device(ctl, &device); if (status < 0) { error("cannot determine device number: %s", snd_strerror(status)); break; } if (device >= 0) { list_subdevice_info(ctl, card, device); } } while (device >= 0); snd_ctl_close(ctl); }
static int card_to_num(const char* device) { int err; char* ctl_name; snd_ctl_card_info_t *card_info; snd_ctl_t* ctl_handle; int i = -1; snd_ctl_card_info_alloca (&card_info); ctl_name = get_control_device_name(device); if (ctl_name == NULL) { jack_error("get_control_device_name() failed."); goto fail; } if ((err = snd_ctl_open (&ctl_handle, ctl_name, 0)) < 0) { jack_error ("control open \"%s\" (%s)", ctl_name, snd_strerror(err)); goto free; } if ((err = snd_ctl_card_info(ctl_handle, card_info)) < 0) { jack_error ("control hardware info \"%s\" (%s)", device, snd_strerror (err)); goto close; } i = snd_ctl_card_info_get_card(card_info); close: snd_ctl_close(ctl_handle); free: free(ctl_name); fail: return i; }
static int pyalsacontrol_init(struct pyalsacontrol *pyctl, PyObject *args, PyObject *kwds) { char *name = "default"; int mode = 0, err; static char * kwlist[] = { "name", "mode", NULL }; pyctl->handle = NULL; if (!PyArg_ParseTupleAndKeywords(args, kwds, "|si", kwlist, &name, &mode)) return -1; err = snd_ctl_open(&pyctl->handle, name, mode); if (err < 0) { PyErr_Format(PyExc_IOError, "Control open error: %s", strerror(-err)); return -1; } return 0; }
int check_card (int card) { snd_ctl_t *handle; snd_ctl_hw_info_t info; int rc; if ((rc = snd_ctl_open (&handle, card)) < 0) { Con_Printf ("Error: control open (%i): %s\n", card, snd_strerror (rc)); return rc; } if ((rc = snd_ctl_hw_info (handle, &info)) < 0) { Con_Printf ("Error: control hardware info (%i): %s\n", card, snd_strerror (rc)); snd_ctl_close (handle); return rc; } snd_ctl_close (handle); if (dev == -1) { for (dev = 0; dev < info.pcmdevs; dev++) { if ((rc = snd_pcm_open (&pcm_handle, card, dev, SND_PCM_OPEN_PLAYBACK | SND_PCM_OPEN_NONBLOCK)) == 0) { return 0; } } } else { if (dev >= 0 && dev < info.pcmdevs) { if ((rc = snd_pcm_open (&pcm_handle, card, dev, SND_PCM_OPEN_PLAYBACK | SND_PCM_OPEN_NONBLOCK)) == 0) { return 0; } } } return 1; }
ALSAControl::ALSAControl(const char *device) { snd_ctl_open(&mHandle, device, 0); }