找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 5110|回复: 1

[C++] 使用XAudio2播放音频

[复制链接]
发表于 2014-10-4 10:05:17 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
本帖最后由 mzflz 于 2014-10-4 10:38 编辑

XAudio2其实也是DirectX的一部分


写了使用XAudio2播放音频的例子,虽然播放的是白噪音

不多说了
上代码:




  1. #include "stdafx.h"
  2. #include <Windows.h>
  3. #include <XAudio2.h>
  4. #include<conio.h>
  5. int _tmain(int argc, _TCHAR* argv[])
  6. {
  7.        
  8.         CoInitializeEx(NULL,COINIT_MULTITHREADED ); //初始化COM库
  9.         IXAudio2 * paudio = NULL; //IXAduio2接口
  10.         IXAudio2MasteringVoice * pmaster = NULL; //管理缓冲区
  11.         IXAudio2SourceVoice * pSource = NULL; //次缓冲区
  12.         WAVEFORMATEX format;
  13.         XAUDIO2_BUFFER sBuffer; //次缓冲
  14.         BYTE * pVBuffer = new BYTE[1024];
  15.         XAUDIO2_VOICE_STATE pState = {0};//


  16.         for(int i =0 ;i<1024;i++)
  17.         {
  18.                 pVBuffer[i] = rand()%255;
  19.         }
  20.         ZeroMemory(&format,sizeof(WAVEFORMATEX)); //
  21.         format.nChannels = 2 ;//声道数
  22.         format.nSamplesPerSec = 11025; //位深
  23.         format.wFormatTag  = WAVE_FORMAT_PCM ;//PCM标志
  24.         //format.nAvgBytesPerSec = ; // 频率
  25.         format.wBitsPerSample = 16; //位深
  26.         format.nAvgBytesPerSec = (format.wBitsPerSample * format.nSamplesPerSec*format.nChannels)/8;
  27.         format.nBlockAlign = (format.nSamplesPerSec/8)*2; //数据块大小
  28.         ZeroMemory(&sBuffer,sizeof(XAUDIO2_BUFFER));
  29.         sBuffer.Flags = 0;//流缓冲
  30.         sBuffer.AudioBytes = 1024;
  31.         sBuffer.pAudioData = pVBuffer;



  32.         if(XAudio2Create(&paudio)!=S_OK)
  33.         {
  34.                 printf("0");
  35.                 return 0;
  36.         }
  37.        

  38.         if(        paudio->CreateMasteringVoice(&pmaster)!=S_OK)
  39.         {
  40.                 printf("2");
  41.                 return 0;
  42.         }
  43.        
  44.                 if(paudio->CreateSourceVoice(&pSource,(WAVEFORMATEX *)&format)!=S_OK)
  45.                 {

  46.                         printf("3");
  47.                         return 0;
  48.                 }
  49.                
  50.                 if(pSource->SubmitSourceBuffer(&sBuffer)!=S_OK)
  51.                         printf("4");
  52.                 pSource->Start();
  53.                 while(1)
  54.                 {
  55.                         pSource->GetState(&pState);
  56.                         printf("\n\n\n%d\n\n",pState.BuffersQueued);
  57.                         if(pState.BuffersQueued==0)
  58.                         {
  59.                                 for(int i = 0;i<1024;i++)
  60.                                 {
  61.                                         pVBuffer[i] = rand()%255; //填充白噪音
  62.                                 }
  63.                                 if(pSource->SubmitSourceBuffer(&sBuffer)!=S_OK)
  64.                                         printf("4");
  65.                         }
  66.                         if(GetAsyncKeyState(VK_ESCAPE))
  67.                                 goto EXIT;
  68.                 //Sleep(40);
  69.                 }
  70.                

  71.                 EXIT:
  72.                
  73.                
  74.                 pSource->DestroyVoice();
  75.                 delete [] pVBuffer;
  76.                 paudio->Release();
  77.                        
  78.        
  79.        
  80.         return 0;
  81. }
复制代码




Audio.zip

3.71 KB, 下载次数: 2

回复

使用道具 举报

发表于 2014-10-4 10:58:59 | 显示全部楼层
哈哈 。不错不错。
代码很简短。
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-22 17:43 , Processed in 0.032487 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表