用DirectSound在C++.net平台上实现录音功能

  最近在做一个普通话纠正练习软件,里面要有一个录音的功能。关于音频的东西之前没怎么接触,所以在网上找了一些相关资料。由于.net窗体程序和mmsystem.h的头文件各种报错,所以最后决定用DirectSound来实现。如果是MFC程序的话,可能有mmsystem.h会更方便点。。。

主要参考了http://www.cnblogs.com/stg609/archive/2008/10/24/1318931.html 这个人的博客。

总体思路是:

  • 设置wave文件的格式//这里要了解一下波形捕捉的基本知识,比如说采样率什么的。
  • 捕获录音设备
  • 创建捕获缓冲区
  • 创建wave文件
  • 创建缓冲区通知
  • 开始录音
  • 新开一条线程捕获波形
  • 把捕获到的写入wave文件
  • 停止录音,关闭缓冲区和新线程,把文件长度,数据长度写入文件

  参考的博客上写的是C#代码,所以转到C++.net上会有各种奇怪的格式错误等等,所以了解了不少C#和托管C++的类型转换。

头文件
1 #pragma once
2
3  #define iNotifyNum 16
4 typedef unsigned char byte;
5
6  using namespace System;
7  using namespace System::IO;
8  using namespace System::Threading;
9  using namespace Microsoft::DirectX;
10  using namespace Microsoft::DirectX::DirectSound;
11
12  enum RecordMode{Recording, Stop, Pause};
13
14  public ref class SoundRecord
15 {
16  public:
17 SoundRecord();//构造函数
18   ~SoundRecord();//析构函数
19   void recordingStart(String^ path); //开始录音
20   void recordingStop();//停止录音
21 void recordingPause();//暂停录音
22 void recordingResume();//恢复录音
23 RecordMode recordMode;
24
25 private:
26 Notify^ myNotify;//缓冲区提示事件
27 FileStream^ fsWav;//保存的文件流
28 int iBufferOffset ;//本次数据起始点, 上一次数据的终点。
29 int iSampleSize;//所采集到的数据大小
30 int iNotifySize;//通知所在区域大小
31 int iBufferSize;//缓冲区大小
32 BinaryWriter^ mWriter;
33 Microsoft::DirectX::DirectSound::Capture^ capture;//捕捉设备对象
34 CaptureBuffer^ capturebuffer;//捕捉缓冲区
35 AutoResetEvent^ notifyevent;
36 Thread^ notifythread ;
37 WaveFormat mWavFormat;//PCM格式
38
39 WaveFormat SetWaveFormat();
40 void CreateWaveFile(String^ strFileName);
41 bool CreateCaputerDevice();
42 void CreateCaptureBuffer();
43 void CreateNotification();
44 void RecoData();
45 void RecordCapturedData();
46 };

代码下载:https://files.cnblogs.com/sandywong/SoundRecord.rar

posted @ 2011-04-07 17:21  free_swallow  阅读(720)  评论(0编辑  收藏  举报