zoukankan      html  css  js  c++  java
  • sdl play .pcm

    {

    #include <iostream>
    #include <SDL.h>
    
    static Uint8 *pAudio_chunk;
    static Uint32 audio_len;
    static Uint8 *pAudio_pos;
    
    void fill_audio_buffer(void *userdata, Uint8 * stream, int len)
    {
    	SDL_memset(stream, 0, len);
    	// 判断是否有读到数据
    	if (audio_len == 0)
    		return;
    
    	len = (len > audio_len ? audio_len : len);
    	SDL_MixAudio(stream, pAudio_pos, len, SDL_MIX_MAXVOLUME);
    	pAudio_pos += len;
    	audio_len -= len;
    }
    
    int SDL_main(int argc, char *argv[])
    //int main(int argc, char *argv[])
    {
    
    
    	/*** 初始化SDL ***/
    	if (SDL_Init(SDL_INIT_AUDIO | SDL_INIT_TIMER))
    	{
    		printf("Initialize SDL failed: %s
    ", SDL_GetError());
    		return -1;
    	}
    	/****************/
    
    	/*** 初始化初始化SDL_AudioSpec结构体 ***/
    	SDL_AudioSpec audioSpec;
    
    	// 音频数据的采样率。常用的有48000,44100等
    	audioSpec.freq = 48000;
    
    	// 音频数据的格式
    	audioSpec.format = AUDIO_F32LSB;
    
    	// 声道数。例如单声道取值为1,立体声取值为2
    	audioSpec.channels = 2;
    
    	// 设置静音的值
    	audioSpec.silence = 0;
    
    	// 音频缓冲区中的采样个数,要求必须是2的n次方
    	audioSpec.samples = 1024;
    
    	// 填充音频缓冲区的回调函数
    	audioSpec.callback = fill_audio_buffer;
    	/************************************/
    
    	// 打开音频设备
    	if (SDL_OpenAudio(&audioSpec, nullptr) < 0)
    	{
    		printf("Can not open audio!");
    		return -1;
    	}
    
    	FILE *pAudioFile = fopen("D:/out.pcm", "rb+");
    	if (pAudioFile == nullptr)
    	{
    		printf("Can not open audio file!");
    		return -1;
    	}
    
    	int pcm_buffer_size = 48000;
    	char *pcm_buffer = (char *)malloc(pcm_buffer_size);
    	int data_count = 0;
    
    	SDL_PauseAudio(0);
    
    	for (;;)
    	{
    		// 循环播放
    		if (fread(pcm_buffer, 1, pcm_buffer_size, pAudioFile) != pcm_buffer_size)
    		{
    			fseek(pAudioFile, 0, SEEK_SET);
    			fread(pcm_buffer, 1, pcm_buffer_size, pAudioFile);
    			data_count = 0;
    		}
    		printf("Playing %10d Bytes data.
    ", data_count);
    		data_count += pcm_buffer_size;
    
    		pAudio_chunk = (Uint8 *)pcm_buffer;
    		audio_len = pcm_buffer_size;
    		pAudio_pos = pAudio_chunk;
    
    		while (audio_len > 0)
    			SDL_Delay(0);
    	}
    	free(pcm_buffer);
    	SDL_Quit();
    
    	return 0;
    }
    

    }

  • 相关阅读:
    java基础(初始化和清理)
    jquery的常用操作(转载)+ 开发中经常犯的错误总结(原创) (不断补充)
    java基础常见错误归纳(值传递和引用传递)
    FormPanel 综合使用 忆江南
    MyEclipse下Jquery代码自动提示 忆江南
    HQL查询 忆江南
    MD5密码保护 忆江南
    FormPanel数据提交 忆江南
    新手上路
    编码总结,以及对BOM的理解
  • 原文地址:https://www.cnblogs.com/YZFHKMS-X/p/13200594.html
Copyright © 2011-2022 走看看