int audio_open(struct audio_info_struct *ai) { int err; int card=0,device=0; char scard[128], sdevice[128]; if(!ai) return -1; if(ai->device) { /* parse ALSA device name */ if(strchr(ai->device,':')) { /* card with device */ strncpy(scard, ai->device, sizeof(scard)-1); scard[sizeof(scard)-1] = '\0'; if (strchr(scard,':')) *strchr(scard,':') = '\0'; card = snd_card_name(scard); if (card < 0) { fprintf(stderr, "wrong soundcard number: %s\n", scard); exit(1); } strncpy(sdevice, strchr(ai->device, ':') + 1, sizeof(sdevice)-1); } else { strncpy(sdevice, ai->device, sizeof(sdevice)-1); } sdevice[sizeof(sdevice)-1] = '\0'; device = atoi(sdevice); if (!isdigit(sdevice[0]) || device < 0 || device > 31) { fprintf(stderr, "wrong device number: %s\n", sdevice); exit(1); } } if((err=snd_pcm_open(&ai->handle, card, device, SND_PCM_OPEN_PLAYBACK)) < 0 ) { fprintf(stderr, "open failed: %s\n", snd_strerror(err)); exit(1); } if(audio_reset_parameters(ai) < 0) { audio_close(ai); return -1; } return 0; }
AlsaPMO::AlsaPMO(FAContext *context) : PhysicalMediaOutput(context) { uint32 deviceNameSize = 128; char scard[128]; snd_mixer_t *pMixer; char mixer_id[25]="Master"; m_properlyInitialized = false; myInfo = new OutputInfo(); memset(myInfo, 0, sizeof(OutputInfo)); m_pBufferThread = NULL; m_iOutputBufferSize = 0; m_iBytesPerSample = 0; m_iBaseTime = -1; m_iDataSize = 0; if (!m_pBufferThread) { m_pBufferThread = Thread::CreateThread(); assert(m_pBufferThread); m_pBufferThread->Create(AlsaPMO::StartWorkerThread, this); } m_handle = NULL; m_device = NULL; m_channels = -1; m_rate = -1; m_device = (char *) malloc(deviceNameSize); m_pContext->prefs->GetPrefString(kALSADevicePref, m_device, &deviceNameSize); if (m_device) { if (sscanf(m_device, "%[^:]: %d", scard, &m_iDevice) != 2) { ReportError("The ALSADevice statement in the preference file" "is improperly formatted. Format: ALSADevice: " "[card name/card number]:[device number]"); return; } m_iCard = snd_card_name(scard); if (m_iCard < 0) { ReportError("Invalid ALSA card name/number specified."); return; } if (m_iDevice < 0 || m_iDevice > 31) { ReportError("Invalid ALSA device number specified."); return; } } else m_iCard = m_iDevice = 0; switch (m_iDevice) { case 0: strncpy(mixer_id,"PCM",sizeof(mixer_id)); break; case 1: strncpy(mixer_id,"PCM1",sizeof(mixer_id)); break; } parse_gid(mixer_id, &m_gid); snd_mixer_open(&pMixer, m_iCard, 0); bzero(&m_group, sizeof(m_group)); m_group.gid = m_gid; if ((m_iChannel = snd_mixer_group_read(pMixer, &m_group )) < 0) { strncpy(mixer_id,"Master",sizeof(mixer_id)); parse_gid(mixer_id, &m_gid); m_group.gid = m_gid; m_iChannel = snd_mixer_group_read(pMixer, &m_group ); } snd_mixer_close(pMixer); delete m_device; }