Click here to Skip to main content
16,018,394 members
Articles / Desktop Programming / MFC
Article

Concatenating Wave Files

Rate me:
Please Sign up or sign in to vote.
4.56/5 (12 votes)
16 Jun 2003 163.8K   2.5K   65   30
An article about concatenating .WAV files "on the fly"

Introduction

Those who deal with voiceprints and prompts often should have prerecorded waves for testing/development, and sometimes you want to output a "joined wave", and even more better - get it dynamically. This article tries to solve this problem and create merged wave output "on the fly".

Background

It would be good for you to have a brief overview about wave format.

Using the code

The main points of CWave class are it's constructor :

CWave(string fileName) throw(LPCSTR);

and operator+

CWave operator+(const CWave& w) const throw(LPCSTR);

The concatenation is implemented as follows:

CWave CWave::operator+ (const CWave &w) const{
    if (fmt.wFormatTag!=w.fmt.wFormatTag)
        throw "Can't concatenate waves with different format tags";
    CWave ret_val;
    ret_val.fmt = w.fmt;
    ret_val.riff = w.riff;
    ret_val.data = w.data;
    ret_val.data.dataSIZE= data.dataSIZE+w.data.dataSIZE;

     
    ret_val.extraParamLength = w.extraParamLength;
    ret_val.extraParam = w.extraParam;
    ret_val.wave = new BYTE[ret_val.data.dataSIZE];
    memcpy(ret_val.wave,wave,data.dataSIZE);
    memcpy(ret_val.wave+data.dataSIZE,w.wave,w.data.dataSIZE);

    string folder = getFileFolder(fileName);
    string title1 = getFileTitle(fileName);
    string title2 = getFileTitle(w.fileName);
    
    
    ret_val.fileName = folder;
    ret_val.fileName.append(title1);
    ret_val.fileName.append(title2);
    ret_val.fileName.append(".wav");

    return ret_val;
}

The usage is very simple:

CWave wave1("a1.wav");
CWave wave("b7.wav");
CWave wave3(wave1+wave2);
wave3.saveToFile();
//by default fileName of wave3 instance is concatenation of wave1 and wave2 fileNames
//wave3.getFileName()=="a1b7.wav"
//you can specify another fileName by:
//wave3.setFileName("anotherName.wav");

Limitations

For the time being the CWave class can deal with PCM waves, extraParams and "fact" chunks in wave header. You can parse another chunks if your waves contain ones. Also, the two wave files must have the same encoding format.

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
Web Developer
Israel Israel
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
GeneralDifferent sample rates/bps Pin
pimb213-Aug-09 3:46
pimb213-Aug-09 3:46 
Questionsomething need u help Pin
naohboy25-Feb-08 21:46
naohboy25-Feb-08 21:46 
Questioncan u guide me i am new for mixer control Pin
rajneshmalik30-Aug-07 2:21
rajneshmalik30-Aug-07 2:21 
Generalhelp me please about how i could read a waw file and write its values to a tex file Pin
vangurad6663-May-07 0:52
vangurad6663-May-07 0:52 
AnswerRe: help me please about how i could read a waw file and write its values to a tex file Pin
Furer Alexander3-May-07 4:17
Furer Alexander3-May-07 4:17 
GeneralCombine .WAV's from timecode value Pin
charliev4-Feb-07 6:01
charliev4-Feb-07 6:01 
GeneralUsing EVC4 Pin
dano187-Mar-06 10:24
dano187-Mar-06 10:24 
GeneralAmplitude Equalisation at bounderies Pin
Yash856-Mar-06 0:48
Yash856-Mar-06 0:48 
GeneralPlaying the concatenated file without saving to disk Pin
Yash858-Feb-06 11:02
Yash858-Feb-06 11:02 
AnswerRe: Playing the concatenated file without saving to disk Pin
Furer Alexander8-Feb-06 12:42
Furer Alexander8-Feb-06 12:42 
GeneralRe: Playing the concatenated file without saving to disk Pin
Yash8511-Feb-06 12:40
Yash8511-Feb-06 12:40 
GeneralRe: Playing the concatenated file without saving to disk Pin
Furer Alexander12-Feb-06 0:36
Furer Alexander12-Feb-06 0:36 
Generalthis site is pointless and knowone cares Pin
Anonymous1-Aug-05 17:15
Anonymous1-Aug-05 17:15 
GeneralThat demo zip is rubbish Pin
Anonymous1-Aug-05 17:13
Anonymous1-Aug-05 17:13 
Generalpoo head Pin
Anonymous1-Aug-05 17:10
Anonymous1-Aug-05 17:10 
GeneralProblem with MS SoundRec32 Pin
B.Damian23-Mar-05 1:01
B.Damian23-Mar-05 1:01 
GeneralRe: Problem with MS SoundRec32 Pin
Koray Balci22-Jun-06 6:40
Koray Balci22-Jun-06 6:40 
Generalvery interesting Pin
abaddon32524-Feb-05 23:00
abaddon32524-Feb-05 23:00 
GeneralWAV file mixing Pin
CalicoSkies16-Feb-05 15:55
CalicoSkies16-Feb-05 15:55 
I have been looking for a way to do WAV mixing (not concatenating, but mixing so that each sound from the separate WAV files plays simultaneously). Information on how to do this seems elusive.

I've been working with DirectX (specifically, DirectMusic and DirectSound) in my application. DirectX is able to mix sounds before it passes the audio to the sound card.. Is there perhaps a way to simply have it re-direct the audio to a WAV file on the hard drive instead?

Eric
Generalgreat!! Pin
uttam h6-Mar-04 10:07
uttam h6-Mar-04 10:07 
QuestionConcatenating AVI Files ? Pin
attckboy2-Aug-03 3:04
attckboy2-Aug-03 3:04 
AnswerRe: Concatenating AVI Files ? Pin
DaFrawg26-May-04 22:05
DaFrawg26-May-04 22:05 
Generalconvert one wave type to another Pin
pearlmagic13-Jul-03 23:33
pearlmagic13-Jul-03 23:33 
QuestionConcatenating MPG Files ? Pin
wobble20-Jun-03 5:08
wobble20-Jun-03 5:08 
AnswerRe: Concatenating MPG Files ? Pin
MarkusStr22-Jun-03 22:56
MarkusStr22-Jun-03 22:56 

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.