void AlsaPMO::GetVolume(int32 &left, int32 &right) { int err; snd_mixer_t *pMixer = NULL; err = snd_mixer_open(&pMixer, m_iCard, 0); if (err != 0) { return; } if (m_iChannel >= 0) { err = snd_mixer_group_read(pMixer, &m_group); if (err < 0) return; } else return; snd_mixer_close(pMixer); left = (int)(((float)((m_group.volume.values[0] - m_group.min) * 100) / (float)(m_group.max - m_group.min)) + 0.5); right = (int)(((float)((m_group.volume.values[1] - m_group.min) * 100) / (float)(m_group.max - m_group.min)) + 0.5); }
void AlsaPMO::SetVolume(int32 left, int32 right) { int err; snd_mixer_t *pMixer; err = snd_mixer_open(&pMixer, m_iCard, 0); if (err < 0) return; if (m_iChannel >= 0) { err = snd_mixer_group_read(pMixer, &m_group); if (err < 0) return; left = (int)((double)(m_group.max - m_group.min) * (double)left * 0.01) + m_group.min; right = (int)((double)(m_group.max - m_group.min) * (double)right * 0.01) + m_group.min; for (int chn = 0; chn <= SND_MIXER_CHN_LAST; chn++) { if (!(m_group.channels & (1<<chn))) continue; if (chn == 0) m_group.volume.values[chn] = left; else if (chn == 1) m_group.volume.values[chn] = right; else m_group.volume.values[chn] = (left + right) / 2; } snd_mixer_group_write(pMixer, &m_group); } snd_mixer_close(pMixer); }
void setVolume(int level) { int volume; snd_mixer_t *mixer_handle; if (snd_mixer_open (&mixer_handle, card, device) < 0) { slogf( _SLOG_SETCODE(_SLOGC_AUDIO, 0), _SLOG_CRITICAL, "Unable to open mixer\n"); return; } snd_mixer_group_read(mixer_handle, &group); volume = (float)(group.max - group.min) * ( level / 100.0) + group.min; if (group.channels & SND_MIXER_CHN_MASK_FRONT_LEFT) group.volume.names.front_left = volume; if (group.channels & SND_MIXER_CHN_MASK_REAR_LEFT) group.volume.names.rear_left = volume; if (group.channels & SND_MIXER_CHN_MASK_FRONT_CENTER) group.volume.names.front_center = volume; if (group.channels & SND_MIXER_CHN_MASK_FRONT_RIGHT) group.volume.names.front_right = volume; if (group.channels & SND_MIXER_CHN_MASK_REAR_RIGHT) group.volume.names.rear_right = volume; if (group.channels & SND_MIXER_CHN_MASK_WOOFER) group.volume.names.woofer = volume; snd_mixer_group_write(mixer_handle, &group); snd_mixer_close (mixer_handle); }
static void alsa_mute_mic(audio_desc_t ad) { snd_mixer_gid_t mic; snd_mixer_group_t group; snd_mixer_t *CurMixer = 0; snd_mixer_open(&CurMixer, ad, 0); /* assume mixer 0 */ memset(&mic, 0, sizeof(mic)); strcpy(mic.name, SND_MIXER_IN_MIC); memset(&group, 0, sizeof(group)); group.gid = mic; snd_mixer_group_read(CurMixer, &group); group.mute = SND_MIXER_CHN_MASK_STEREO; snd_mixer_group_write(CurMixer, &group); snd_mixer_close(CurMixer); }
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; }