溫馨提示×

c語言如何實現(xiàn)聲音輸出

小億
227
2023-10-25 19:19:43
欄目: 編程語言

在C語言中,可以使用音頻庫來進行聲音輸出。以下是使用ALSA音頻庫來實現(xiàn)聲音輸出的示例代碼:

#include <alsa/asoundlib.h>

int main() {
    int err;
    snd_pcm_t *handle;
    snd_pcm_hw_params_t *params;
    unsigned int sample_rate = 44100;
    int dir;
    snd_pcm_uframes_t frames = 32;
    char *buffer;

    // 打開默認音頻設備
    err = snd_pcm_open(&handle, "default", SND_PCM_STREAM_PLAYBACK, 0);
    if (err < 0) {
        printf("無法打開音頻設備 (%s)\n", snd_strerror(err));
        return -1;
    }

    // 分配硬件參數(shù)對象
    snd_pcm_hw_params_alloca(&params);

    // 填充默認值
    snd_pcm_hw_params_any(handle, params);

    // 設置參數(shù)為交錯模式,16位小端格式
    snd_pcm_hw_params_set_access(handle, params, SND_PCM_ACCESS_RW_INTERLEAVED);
    snd_pcm_hw_params_set_format(handle, params, SND_PCM_FORMAT_S16_LE);

    // 設置采樣率
    snd_pcm_hw_params_set_rate_near(handle, params, &sample_rate, &dir);

    // 設置通道數(shù)
    snd_pcm_hw_params_set_channels(handle, params, 2);

    // 設置周期大小
    snd_pcm_hw_params_set_period_size_near(handle, params, &frames, &dir);

    // 設置硬件參數(shù)
    err = snd_pcm_hw_params(handle, params);
    if (err < 0) {
        printf("無法設置硬件參數(shù) (%s)\n", snd_strerror(err));
        return -1;
    }

    // 分配緩沖區(qū)
    buffer = malloc(frames * snd_pcm_format_width(SND_PCM_FORMAT_S16_LE) / 8 * 2);

    // 清零緩沖區(qū)
    memset(buffer, 0, frames * snd_pcm_format_width(SND_PCM_FORMAT_S16_LE) / 8 * 2);

    // 寫入音頻數(shù)據(jù)到緩沖區(qū)
    while (1) {
        err = snd_pcm_writei(handle, buffer, frames);
        if (err == -EPIPE) {
            // 檢測是否需要恢復
            snd_pcm_prepare(handle);
        } else if (err < 0) {
            printf("無法寫入音頻數(shù)據(jù) (%s)\n", snd_strerror(err));
            break;
        }
    }

    // 釋放緩沖區(qū)
    free(buffer);

    // 關閉音頻設備
    snd_pcm_close(handle);

    return 0;
}

注意:以上代碼僅為示例,具體的實現(xiàn)可能因音頻設備和操作系統(tǒng)而異。在使用該代碼之前,請確保你已經(jīng)正確安裝ALSA音頻庫,并且編譯時鏈接了相應的庫文件。

0