Click here to Skip to main content
15,887,485 members
Articles / Mobile Apps / Windows Mobile
Article

Voice Recording/Playing back using simple classes

,
Rate me:
Please Sign up or sign in to vote.
4.62/5 (43 votes)
16 Apr 20051 min read 472K   12.2K   130   104
This article introduces some useful classes that wrap the WAVE APIs.

Introduction

Most of us are familiar with at least one multimedia recording software. Windows has one of the simplest ones: Sound Recorder. In this article I want to introduce some simple but useful classes for recording/playing back of voice that wrap the WAVE APIs.

WAVE APIs

Here is the list of all the Wave APIs that I have used:

Recording

waveInOpenOpen the Wave device for recording.
waveInPrepareHeaderPrepare the Wave header for recording.
waveInAddBufferAdd buffer
waveInStartStart recording. Recorded data will be saved in a specified buffer.
waveInUnprepareHeaderAfter finishing the record process, should un-prepare Wave header.
waveInCloseClose the recording device.

Playing

waveOutOpenOpen the Wave device for playing.
waveOutPrepareHeaderPrepare the Wave header for playing.
waveOutWritePlay the buffer.
waveOutUnprepareHeaderUn-prepare the Wave header.
waveOutCloseClose the playing device.

As you can see, working with these APIs are straightforward but if you want to skip them and simply do a copy/paste code in your project, my classes are for you.

Here is the definition of the classes:

class CVoiceBase  
{
public:
    
    CString m_result;
    MMRESULT res;
    enum 
    {
        SPS_8K=8000,
        SPS_11K=11025,
        SPS_22K=22050,
        SPS_44K=44100
    };

    enum
    {
        CH_MONO=1,
        CH_STEREO=2
    };

    char* buffer;
    WAVEHDR WaveHeader;
    WAVEFORMATEX PCMfmt;

    void SetFormat(DWORD nSamplesPerSec,  
            WORD  wBitsPerSample,WORD  nChannels);
    BOOL CopyBuffer(LPVOID lpBuffer, DWORD ntime);
    CString GetLastError();
    void GetMMResult(MMRESULT res);
    void DestroyBuffer();
    BOOL PrepareBuffer(DWORD ntime);
    
    CVoiceBase();
    virtual ~CVoiceBase();
};

class CVoiceRecording : public CVoiceBase  
{
public:
    void RecordFinished();
    BOOL IsOpen();
    BOOL Close();
    BOOL Open();    
    BOOL Record();
    
    HWAVEIN hWaveIn;
    
    CVoiceRecording();
    virtual ~CVoiceRecording();
};

class CVoicePlaying : public CVoiceBase  
{
public:
    void PlayFinished();
    BOOL IsOpen();
    BOOL Close();
    BOOL Open();
    BOOL Play();

    HWAVEOUT hWaveOut;

    CVoicePlaying();
    virtual ~CVoicePlaying();
};

Also, for notifying of events, such as finishing recording/playing, I have used two callback functions:

BOOL CALLBACK VoiceWaveInProc(HWAVEIN hwi,       
            UINT uMsg,         
            DWORD dwInstance,  
            DWORD dwParam1,    
            DWORD dwParam2     
                );

BOOL CALLBACK VoiceWaveOutProc(HWAVEOUT hwi,       
            UINT uMsg,         
            DWORD dwInstance,  
            DWORD dwParam1,    
            DWORD dwParam2     
                );

Example

Just declare two variables of type CVoiceRecording and CVoicePlaying. Use SetFormat, PrepareBuffer, Open and Record or Play member functions to work with them:

CVoiceRecording m_Record;
CVoicePlaying m_Play;

m_Record.PrepareBuffer(10);    //prepare buffer for recording 10 seconds.
m_Record.Open();
    
m_Play.PrepareBuffer(10);    //prepare buffer for playing of 10 seconds of data
m_Play.Open();    

if (m_Record.IsOpen())
{
    m_Record.Record();
}

//after finishing the record scenario,
//play the buffer, first copy recorded buffer to m_Play buffer
m_Play.CopyBuffer(m_Record.buffer, 10);
        
if (m_Play.IsOpen())
{
    m_Play.Play();
}

Enjoy!

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
CEO Solaris Electronics LLC
United Arab Emirates United Arab Emirates
I was born in Shiraz, a very beautiful famous city in Iran. I started programming when I was 12 years old with GWBASIC. Since now, I worked with various programming languages from Basic, Foxpro, C/C++, Visual Basic, Pascal to MATLAB and now Visual C++.
I graduated from Iran University of Science & Technology in Communication Eng., and now work as a system programmer for a telecommunication industry.
I wrote several programs and drivers for Synthesizers, Power Amplifiers, GPIB, GPS devices, Radio cards, Data Acquisition cards and so many related devices.
I'm author of several books like Learning C (primary and advanced), Learning Visual Basic, API application for VB, Teach Yourself Object Oriented Programming (OOP) and etc.
I'm winner of January, May, August 2003 and April 2005 best article of month competition, my articles are:


You can see list of my articles, by clicking here


Written By
Web Developer
Iran (Islamic Republic of) Iran (Islamic Republic of)
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
AnswerRe: how to select a recording device? Pin
Abbas_Riazi26-May-06 10:00
professionalAbbas_Riazi26-May-06 10:00 
AnswerRe: how to select a recording device? Pin
Haitham Khedre26-May-06 10:15
Haitham Khedre26-May-06 10:15 
GeneralStereo Mix Pin
Orell21-May-06 18:41
Orell21-May-06 18:41 
GeneralThank You For The Code Pin
Yoavf2-May-06 9:49
Yoavf2-May-06 9:49 
QuestionCan we!!! Pin
amit4all10-Apr-06 19:03
amit4all10-Apr-06 19:03 
Generaluse this component in C++builder Pin
mr_naz5-Apr-06 16:06
mr_naz5-Apr-06 16:06 
QuestionCan I use C# for recording/playback Pin
Litty7427-Mar-06 2:03
Litty7427-Mar-06 2:03 
AnswerRe: Can I use C# for recording/playback Pin
Abbas_Riazi27-Mar-06 9:16
professionalAbbas_Riazi27-Mar-06 9:16 
QuestionPlay and record over Modem! Pin
oasis_i3-Mar-06 6:03
oasis_i3-Mar-06 6:03 
AnswerRe: Play and record over Modem! Pin
Abbas_Riazi3-Mar-06 19:15
professionalAbbas_Riazi3-Mar-06 19:15 
QuestionRe: Play and record over Modem! Pin
oasis_i3-Mar-06 19:27
oasis_i3-Mar-06 19:27 
AnswerRe: Play and record over Modem! Pin
Abbas_Riazi3-Mar-06 19:42
professionalAbbas_Riazi3-Mar-06 19:42 
GeneralPlease provide some sample for Double buffering Pin
jigneshrpatel2-Mar-06 18:32
jigneshrpatel2-Mar-06 18:32 
AnswerRe: Please provide some sample for Double buffering Pin
Abbas_Riazi2-Mar-06 19:36
professionalAbbas_Riazi2-Mar-06 19:36 
GeneralRe: Please provide some sample for Double buffering Pin
jigneshrpatel6-Mar-06 19:06
jigneshrpatel6-Mar-06 19:06 
AnswerRe: Please provide some sample for Double buffering Pin
Abbas_Riazi7-Mar-06 0:59
professionalAbbas_Riazi7-Mar-06 0:59 
GeneralVoice input output Pin
rajajee1-Mar-06 5:12
rajajee1-Mar-06 5:12 
AnswerRe: Voice input output Pin
Abbas_Riazi2-Mar-06 0:15
professionalAbbas_Riazi2-Mar-06 0:15 
GeneralGSM 610 Pin
rahul soni25-Feb-06 17:31
rahul soni25-Feb-06 17:31 
AnswerRe: GSM 610 Pin
Abbas_Riazi26-Feb-06 9:56
professionalAbbas_Riazi26-Feb-06 9:56 
Generalcode not compile Pin
Alishan Rao17-Feb-06 19:25
Alishan Rao17-Feb-06 19:25 
GeneralAwesome! Pin
jc0dex4-Feb-06 16:54
jc0dex4-Feb-06 16:54 
GeneralRe: Awesome! Pin
Abbas_Riazi4-Feb-06 18:38
professionalAbbas_Riazi4-Feb-06 18:38 
QuestionHow do I save to a wav file Pin
narayan1014-Jan-06 16:25
narayan1014-Jan-06 16:25 
AnswerRe: How do I save to a wav file Pin
CharlesMachette8-Feb-06 12:20
CharlesMachette8-Feb-06 12:20 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.