如何解决Alsa-在服务中运行时,在应用程序中设置音量的工作原理有所不同
我有一个使用Alsa播放声音的应用程序。下面我显示了代码片段。问题在于,如果我的软件作为systemd服务运行,则stVolume方法中的范围在0到31之间。当我从命令行作为标准应用程序运行软件时,范围在0到65536之间。第一种情况,声音非常失真且响亮,我听到噪音。在第二种情况下要好得多。是什么原因?为什么以不同方式运行的同一代码似乎对Alsa /声卡的使用方式不同?为什么在两种情况下Alsa都会返回不同的射程?
void init() {
snd_mixer_open(&mMixer.handle,0);
snd_mixer_attach(mMixer.handle,mCardName);
snd_mixer_selem_register(mMixer.handle,NULL,NULL);
snd_mixer_load(mMixer.handle);
snd_mixer_selem_id_alloca(&mMixer.sid);
snd_mixer_selem_id_set_index(mMixer.sid,0);
snd_mixer_selem_id_set_name(mMixer.sid,mMixerName);
mMixer.slider = snd_mixer_find_selem(mMixer.handle,mMixer.sid);
}
其中mMixer是以下结构:
struct {
snd_mixer_t *handle;
snd_mixer_selem_id_t *sid;
snd_mixer_elem_t *slider;
} mMixer;
以及mCardName和mMixerName是:
const char *mCardName = "default";
const char *mMixerName = "Master";
当我想播放声音时,我调用以下方法:
void on() {
try {
// open audio device
int err = snd_pcm_open(&mHandle,mCardName,SND_PCM_STREAM_PLAYBACK,SND_PCM_NONBLOCK);
if (err < 0)
throw std::runtime_error(snd_strerror(err));
// configure audio
g_assert_nonnull(mHandle);
err = snd_pcm_set_params(mHandle,SND_PCM_FORMAT_U8,SND_PCM_ACCESS_RW_INTERLEAVED,1,// channels
SAMPLE_RATE,// sample rate
1,// soft resample allowed
500000); // latency (in us)
if (err < 0)
throw std::runtime_error(snd_strerror(err));
} catch(std::runtime_error &e) {
g_printerr("Can't configure audio: %s\n",e.what());
}
}
然后设置音量:
void setVolume(unsigned volume) {
long min = 0,max = 0; // NOLINT (type required by ALSA
snd_mixer_selem_get_playback_volume_range(mMixer.slider,&min,&max);
snd_mixer_selem_set_playback_volume_all(mMixer.slider,volume * max / 100);
g_warning("FHR probe volume %ld. Min: %ld,Max: %ld",volume * max / 100,min,max);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。