ALSA - 样本转换

时间:2015-04-02 09:53:58

标签: c++ audio usb alsa resampling

我有一个文本转语音应用程序,它可以生成22kHz采样率的音频流(原始数据)。

我有一个仅支持44kHz的USB-SoundCard。

使用我的asound.conf,我可以播放包含22kHz和44kHz音频流的wav文件,而不会出现问题。

我的应用程序使用alsa-libs并设置设备的采样率。 在这种情况下,只有44kHz会成功,因为硬件仅支持此采样率。但现在,当我将生成的音频流写入alsa时,听起来是错误的,因为采样率不匹配。音频流(原始数据)不包含任何标题信息,所以我认为alsa不使用任何插件zu转换采样率。 Alsa不知道流有不同的采样率

现在我的问题是,告诉alsa的正确方法是,生成的音频流具有不同的采样率,因此alsa-plugin会对其进行转换。

以下代码仅适用于 sampleRate = 44100 的USB SoundCard,否则会发生错误(-22,参数无效)。

void initAlsa()
{
    const char* name = "default";

    alsaAudio = true;
    writeRiffAtClose = false;
    int err = snd_pcm_open (&alsaPlaybackHandle, name, SND_PCM_STREAM_PLAYBACK, 0);
    if (err < 0)
        throw TtsException({"Alsa: cannot open playback audio device ", name, " (" , snd_strerror (err), ")"}, 0);

    sampleRate = 44100;
    err = snd_pcm_set_params(alsaPlaybackHandle,                 // pcm PCM handle
                             SND_PCM_FORMAT_S16_LE,                 // format required PCM format
                             SND_PCM_ACCESS_RW_INTERLEAVED,      // access required PCM access
                             2,                                  // channels required PCM channels (Stereo)
                             sampleRate,                         // rate required sample rate in Hz
                             1,                                  // soft_resample 0 = disallow alsa-lib resample stream, 1 = allow resampling
                             250000);          /* 0.25sec */     // latency required overall latency in us
    if (err < 0)
        throw TtsException({"Alsa: cannot set parameters (" , err, " = " , snd_strerror(err), ") on ", name}, 0);

    LOG_DEBUG("Alsa audio initialized");
}

其他方式是,我把它转换为采样率,然后我把它放到alsa之前,但我认为:为什么不使用alsa-plugin。

我无法从tts-engine获取44kHz音频流(这是另一款软件)。

或者以另一种方式存在,我看不到?

最好的问候。

0 个答案:

没有答案