IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]SDL_BuildAudioCVT函数

    caimouse发表于 2016-12-07 17:23:47
    love 0
    SDL_BuildAudioCVT函数:

    用此函数来初始化结构SDL_AudioCVT,为转换作准备。


    int SDL_BuildAudioCVT(SDL_AudioCVT*   cvt,
                          SDL_AudioFormat src_format,
                          Uint8           src_channels,
                          int             src_rate,
                          SDL_AudioFormat dst_format,
                          Uint8           dst_channels,
                          int             dst_rate)


    例子:

    void play_sound(const char *file)
    {
        int index;
        SDL_AudioSpec wave;
        Uint8 *data;
        Uint32 dlen;
        SDL_AudioCVT cvt;
    
        /* 寻找一个空的(或者完成了的)音频口 */
        for ( index=0; index<NUM_SOUNDS; ++index ) {
            if ( sounds[index].dpos == sounds[index].dlen ) {
                break;
            }
        }
        if ( index == NUM_SOUNDS )
            return;
    
        /* 加载声音文件,并转换成16位、立体声、22kHz格式 */
        if ( SDL_LoadWAV(file, &wave, &data, &dlen) == NULL ) {
            fprintf(stderr, "无法加载 %s: %s\n", file, SDL_GetError());
            return;
        }
        SDL_BuildAudioCVT(&cvt, wave.format, wave.channels, wave.freq,
                                AUDIO_S16,   2,             22050);
        cvt.buf = (unsigned char *)malloc(dlen*cvt.len_mult);
        memcpy(cvt.buf, data, dlen);
        cvt.len = dlen;
        SDL_ConvertAudio(&cvt);
        SDL_FreeWAV(data);
    
        /* 将音频数据放入音频口(立刻开始回放了) */
        if ( sounds[index].data ) {
            free(sounds[index].data);
        }
        SDL_LockAudio();
        sounds[index].data = cvt.buf;
        sounds[index].dlen = cvt.len_cvt;
        sounds[index].dpos = 0;
        SDL_UnlockAudio();
    }


    蔡军生

    老蔡学堂





沪ICP备19023445号-2号
友情链接