SDL教程-002.wav音频文件播放以及混音测试

SDL教程-002.wav音频文件播放

单文音频文件播放

#include <iostream>
#include <SDL.h>
#include<stdlib.h>
#include<stdio.h>
#include <SDL_image.h>
#include<SDL_config.h>


static SDL_AudioSpec spec;
static Uint8 *sound = NULL;
static Uint32 soundlen = 0;

static int posindex = 0;
static Uint32 positions[64];

static void quit(int rc)
{
	SDL_Quit();
	exit(rc);
}

/*
_pos:userdata的数据
stream:需要填充的流
len:相应stream的大小

简单来说就是将音频在内存中的地址复制给stream,SDL会播放stream中对应地址的数据
*/
void SDLCALL fillerup(void *_pos, Uint8 *stream, int len)
{

	Uint32 pos = *((Uint32*)_pos);

	Uint8 *waveptr;
	int waveleft;

	/*设置当前声音指针
	声音指针+当前播放的位置
	*/
	waveptr = sound + pos;

	//剩余声音数据   声音数据长度-当前播放的位置   
	waveleft = soundlen - pos;

	/* 如果剩余数据<需要的长度 */
	while (waveleft <= len)
	{
		//拷贝剩余数据到音频缓冲区  
		SDL_memcpy(stream, waveptr, waveleft);

		//音频缓冲区stream指针后移  
		stream += waveleft;
		len -= waveleft;

		//拷贝玩剩余数据  
		//waveptr指向 声音数据开头    
		waveptr = sound;

		//长度等于len
		waveleft = soundlen;
		pos = 0;
	}

	SDL_memcpy(stream, waveptr, len);
	pos += len;
	*((Uint32*)_pos) = pos;

}

static int done = 0;

void poked(int sig)
{
	done = 1;
}

static void iteration()
{
	SDL_Event e;
	SDL_AudioDeviceID dev;

	//获取当前等待的事件
	while (SDL_PollEvent(&e))
	{
		if (e.type == SDL_QUIT)
		{
			done = 1;
		}
		else if (e.type == SDL_AUDIODEVICEADDED)//音频添加
		{
			const char *name = SDL_GetAudioDeviceName(e.adevice.which, 0);
			SDL_Log("new %s audio device :%s\n", e.adevice.iscapture ? "capture" : "output", name);

			if (!e.adevice.iscapture)
			{
				positions[posindex] = 0;

				spec.userdata = &positions[posindex++];

				spec.callback = fillerup;

				dev = SDL_OpenAudioDevice(name, 0, &spec, NULL, 0);

				if (!dev)
				{
					SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "can not open '%s':%s\n", name, SDL_GetError());
				}
				else
				{
					SDL_Log("opened '%s' as %u \n", name, (unsigned int)dev);

					//循环播放音乐
					SDL_PauseAudioDevice(dev, 0);

					SDL_OpenAudio(&spec, NULL);
				}

			}
			else if (e.type == SDL_AUDIODEVICEREMOVED)//音频移除
			{
				dev = (SDL_AudioDeviceID)e.adevice.which;
				SDL_Log("%s device %u removed.\n", e.adevice.iscapture ? "capture" : "output", (unsigned int)dev);

				//关闭音频设备
				SDL_CloseAudioDevice(dev);
			}
		}

	}

}


/**
音频播放的步骤
1.初始化SDL模块,这里是要播放音乐,所有初始化SDL_INIT_AUDIO和视频模块
2.创建窗口
3.加载音频
4.播放音频
5.视频音频
6.退出SDL
*/

int main(int argc, char* argv[])
{
	int i;
	char *filename = "G:\\code\\AudioDemo\\Res\\audios\\test_music.wav";

	//设置显示application 的log信息
	SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);


	//设置sdl要初始化的模块
	if (SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO)<0)
	{
		SDL_LogError(SDL_LOG_CATEGORY_APPLICATION , "couldn't initialize SDL:%s\n", SDL_GetError());
		return 1;
	}

	//创建窗口
	//SDL_MinimizeWindow(SDL_CreateWindow("test", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, 0));


	/**
	将音频文件加载到内存中
	filename:文件名
	spec:音频的规格
	sound:音频的句柄
	soundlen:音频文件的长度
	*/
	if (SDL_LoadWAV(filename, &spec, &sound, &soundlen) == NULL)
	{
		SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "cound't load %s:%s \n", filename, SDL_GetError());
		quit(1);
	}


	SDL_Log("available audio drivers");


	//打印音频设备
	for (i = 0; i < SDL_GetNumAudioDrivers(); i++)
	{
		SDL_Log("%i:%s", i, SDL_GetAudioDriver(i));
	}

	//查看当前使用的音频设备
	SDL_Log("Using audio driver:%s\n", SDL_GetCurrentAudioDriver());


	while (!done)
	{
		SDL_Delay(100);
		iteration();
	}

	//释放音频内存
	SDL_FreeWAV(sound);

	//退出sdl
	SDL_Quit();


	system("pause");
	return 0;
}

两个音频文件混音后播放代码

混音算法:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: sdl2-2.0.12.tar.gz 是一种压缩文件格式,通常用于将软件、库或者其他文件打包和传输。这个文件的后缀 ".tar.gz" 表示它是一个经过 tar 和 gzip 压缩的文件。 要下载 sdl2-2.0.12.tar.gz 文件,您可以按照以下步骤进行操作: 1. 打开您的网络浏览器,进入您常用的搜索引擎网站,例如 Google 或者百度。 2. 在搜索框中输入 "sdl2-2.0.12.tar.gz 下载",并点击搜索按钮。 3. 在搜索结果中,您可能会看到来自不同网站的下载链接,请选择您信任的网站。 4. 点击下载链接,浏览器将开始下载 sdl2-2.0.12.tar.gz 文件。 5. 下载完成后,您可以在浏览器的默认下载文件夹中找到该文件。您还可以选择将其移动到您希望存储的位置,例如桌面或者其他文件夹。 6. 解压缩下载的 sdl2-2.0.12.tar.gz 文件。在大多数操作系统中,您可以右键点击该文件,然后选择相应的解压选项。解压后,您将得到一个文件夹,其中包含 sdl2-2.0.12 版本的相关文件。 7. 现在,您可以根据您的需求使用这些文件,例如编译和安装该软件、库或者进行其他操作。 请注意,下载 sdl2-2.0.12.tar.gz 文件需要一个可用的网络连接,并且需要注意从可信赖的网站下载,以确保文件的安全性。 ### 回答2: SDL2-2.0.12.tar.gz是Simple DirectMedia Layer 2(简称SDL2)的软件开发包。SDL2是一种跨平台的多媒体库,可以用于开发游戏、多媒体应用程序和图形用户界面等。在SDL2的官方网站(https://www.libsdl.org/)可以找到该软件包的下载链接。 要下载SDL2-2.0.12.tar.gz文件,可以按照以下步骤进行: 1. 首先,打开SDL2的官方网站,进入下载页面。 2. 在下载页面,找到SDL2-2.0.12版本的下载链接。一般会有多个下载方式,例如通过HTTP或FTP下载,可以根据自己的需求选择适合自己的方式下载。 3. 点击下载链接后,会开始下载SDL2-2.0.12.tar.gz压缩文件。等待下载完成。 4. 下载完成后,可以在下载目录中找到SDL2-2.0.12.tar.gz文件。 5. 将该压缩文件解压缩到指定的目录中,可以使用解压缩软件(如WinRAR或7-Zip)进行解压操作。 6. 解压完成后,在目录中可以找到SDL2-2.0.12文件夹,其中包含了SDL2的源代码和相关文件。 7. 接下来,可以根据需要进行编译安装操作,具体步骤可以参考SDL2的官方文档或README文件。 总结:通过以上步骤,你可以成功下载SDL2-2.0.12.tar.gz文件,并在本地进行后续的编译安装操作。 ### 回答3: sdl2-2.0.12.tar.gz 是一个文件的压缩包,通常用于在Linux系统中安装SDL2库。在下载这个文件之前,您需要确认您的系统是否支持SDL2库,并且已经安装了相关的依赖。 您可以在SDL官方网站(https://www.libsdl.org/download-2.0.php)上找到该文件的下载链接。点击链接后,浏览器会开始下载这个压缩包。 下载完毕后,您可以将该文件保存到您想要的位置,比如主目录下的Downloads文件夹中。 接下来,您需要解压这个压缩包。您可以通过命令行来解压,使用以下命令: tar -zxvf sdl2-2.0.12.tar.gz 解压完成后,您可以进入解压得到的文件夹: cd sdl2-2.0.12 在这个文件夹中,您可以执行一系列的配置、编译和安装命令来安装SDL2库。具体的安装步骤可以在解压得到的文件夹中的README文件中找到,它会提供给您所需的详尽说明。 请注意,安装过程中可能需要root权限,因此您可以在安装命令前加上sudo。安装完成后,您可以通过编译和运行一个简单的SDL2程序来测试您的安装是否成功。 希望以上信息对您有所帮助,祝您安装成功!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值