Browse Source

Fixed WAV writer to set correct sample rate

master
waxfrenzy 21 years ago
parent
commit
e9a9a30a32
2 changed files with 53 additions and 38 deletions
  1. +6
    -3
      SpiralSound/Plugins/DiskWriterPlugin/DiskWriterPlugin.C
  2. +47
    -35
      SpiralSound/RiffWav.C

+ 6
- 3
SpiralSound/Plugins/DiskWriterPlugin/DiskWriterPlugin.C View File

@@ -122,7 +122,7 @@ void DiskWriterPlugin::Execute()
if (t<-1) t=-1; if (t<-1) t=-1;
Buffer[on]=lrintf(t*SHRT_MAX); Buffer[on]=lrintf(t*SHRT_MAX);
on++; on++;
t=GetInput(1,n); t=GetInput(1,n);
if (t>1) t=1; if (t>1) t=1;
if (t<-1) t=-1; if (t<-1) t=-1;
@@ -141,12 +141,15 @@ void DiskWriterPlugin::ExecuteCommands()
{ {
switch(m_AudioCH->GetCommand()) switch(m_AudioCH->GetCommand())
{ {
case OPENWAV :
case OPENWAV :
if (m_Wav.GetSamplerate() != GetHostInfo()->SAMPLERATE) {
m_Wav.SetSamplerate(GetHostInfo()->SAMPLERATE);
}
m_Wav.Open(m_GUIArgs.Name,WavFile::WRITE, WavFile::STEREO); m_Wav.Open(m_GUIArgs.Name,WavFile::WRITE, WavFile::STEREO);
break; break;
case CLOSEWAV : m_Wav.Close(); break; case CLOSEWAV : m_Wav.Close(); break;
case RECORD : m_Recording=true; break; case RECORD : m_Recording=true; break;
case STOP : m_Recording=false; break;
case STOP : m_Recording=false; break;
default : break; default : break;
} }
} }


+ 47
- 35
SpiralSound/RiffWav.C View File

@@ -27,7 +27,7 @@
#include <sys/stat.h> #include <sys/stat.h>
#include <fcntl.h> #include <fcntl.h>


//#define TRACE_OUT
#define TRACE_OUT


using namespace std; using namespace std;


@@ -66,36 +66,48 @@ int WavFile::Open(string FileName, Mode mode, Channels channels)
m_Header.RiffName[1]='I'; m_Header.RiffName[1]='I';
m_Header.RiffName[2]='F'; m_Header.RiffName[2]='F';
m_Header.RiffName[3]='F'; m_Header.RiffName[3]='F';
m_Header.RiffFileLength=HEADERLEN; // bzzt - wrong m_Header.RiffFileLength=HEADERLEN; // bzzt - wrong
m_Header.RiffTypeName[0]='W'; m_Header.RiffTypeName[0]='W';
m_Header.RiffTypeName[1]='A'; m_Header.RiffTypeName[1]='A';
m_Header.RiffTypeName[2]='V'; m_Header.RiffTypeName[2]='V';
m_Header.RiffTypeName[3]='E'; m_Header.RiffTypeName[3]='E';
m_Header.FmtName[0]='f'; m_Header.FmtName[0]='f';
m_Header.FmtName[1]='m'; m_Header.FmtName[1]='m';
m_Header.FmtName[2]='t'; m_Header.FmtName[2]='t';
m_Header.FmtName[3]=' '; m_Header.FmtName[3]=' ';
m_Header.FmtLength=0x00000010; // length of fmt data (16 bytes) m_Header.FmtLength=0x00000010; // length of fmt data (16 bytes)
m_Header.FmtTag=0x0001; // Format tag: 1 = PCM m_Header.FmtTag=0x0001; // Format tag: 1 = PCM
if (channels==STEREO) m_Header.FmtChannels=2;
else m_Header.FmtChannels=1;
if (channels==STEREO) m_Header.FmtChannels=2;
else m_Header.FmtChannels=1;
m_Header.FmtSamplerate=WavFile::m_Samplerate; m_Header.FmtSamplerate=WavFile::m_Samplerate;
m_Header.FmtBitsPerSample=16; m_Header.FmtBitsPerSample=16;
m_Header.FmtBlockAlign=m_Header.FmtChannels*m_Header.FmtBitsPerSample/8;
m_Header.FmtBytesPerSec=m_Header.FmtSamplerate*m_Header.FmtBlockAlign; m_Header.FmtBytesPerSec=m_Header.FmtSamplerate*m_Header.FmtBlockAlign;
m_Header.FmtBlockAlign=m_Header.FmtChannels*m_Header.FmtBitsPerSample/8;


m_DataHeader.DataName[0]='d';
m_DataHeader.DataName[0]='d';
m_DataHeader.DataName[1]='a'; m_DataHeader.DataName[1]='a';
m_DataHeader.DataName[2]='t'; m_DataHeader.DataName[2]='t';
m_DataHeader.DataName[3]='a'; m_DataHeader.DataName[3]='a';
m_DataHeader.DataLengthBytes=0; m_DataHeader.DataLengthBytes=0;

#ifdef TRACE_OUT
cerr<<FileName<<endl;
cerr<<"RiffFileLength "<<m_Header.RiffFileLength<<endl;
cerr<<"FmtLength "<<m_Header.FmtLength<<endl;
cerr<<"FmtTag "<<m_Header.FmtTag<<endl;
cerr<<"FmtChannels "<<m_Header.FmtChannels<<endl;
cerr<<"FmtSamplerate "<<m_Header.FmtSamplerate<<endl;
cerr<<"FmtBytesPerSec "<<m_Header.FmtBytesPerSec<<endl;
cerr<<"FmtBlockAlign "<<m_Header.FmtBlockAlign<<endl;
cerr<<"FmtBitsPerSample "<<m_Header.FmtBitsPerSample<<endl;
#endif

SWAPINT(m_Header.RiffFileLength); SWAPINT(m_Header.RiffFileLength);
SWAPINT(m_Header.FmtLength); SWAPINT(m_Header.FmtLength);
SWAPSHORT(m_Header.FmtTag); SWAPSHORT(m_Header.FmtTag);
@@ -105,10 +117,10 @@ int WavFile::Open(string FileName, Mode mode, Channels channels)
SWAPSHORT(m_Header.FmtBlockAlign); SWAPSHORT(m_Header.FmtBlockAlign);
SWAPSHORT(m_Header.FmtBitsPerSample); SWAPSHORT(m_Header.FmtBitsPerSample);
SWAPINT(m_DataHeader.DataLengthBytes); SWAPINT(m_DataHeader.DataLengthBytes);
fwrite(&m_Header,1,sizeof(CanonicalWavHeader),m_Stream);
fwrite(&m_DataHeader,1,sizeof(DataHeader),m_Stream);
fwrite(&m_Header,1,sizeof(CanonicalWavHeader),m_Stream);
fwrite(&m_DataHeader,1,sizeof(DataHeader),m_Stream);
return 1; return 1;
} }
else else
@@ -125,7 +137,7 @@ int WavFile::Open(string FileName, Mode mode, Channels channels)
SWAPSHORT(m_Header.FmtBlockAlign); SWAPSHORT(m_Header.FmtBlockAlign);
SWAPSHORT(m_Header.FmtBitsPerSample); SWAPSHORT(m_Header.FmtBitsPerSample);


#ifdef TRACE_OUT
#ifdef TRACE_OUT
cerr<<FileName<<endl; cerr<<FileName<<endl;
cerr<<"RiffFileLength "<<m_Header.RiffFileLength<<endl; cerr<<"RiffFileLength "<<m_Header.RiffFileLength<<endl;
cerr<<"FmtLength "<<m_Header.FmtLength<<endl; cerr<<"FmtLength "<<m_Header.FmtLength<<endl;
@@ -136,42 +148,42 @@ int WavFile::Open(string FileName, Mode mode, Channels channels)
cerr<<"FmtBlockAlign "<<m_Header.FmtBlockAlign<<endl; cerr<<"FmtBlockAlign "<<m_Header.FmtBlockAlign<<endl;
cerr<<"FmtBitsPerSample "<<m_Header.FmtBitsPerSample<<endl; cerr<<"FmtBitsPerSample "<<m_Header.FmtBitsPerSample<<endl;
#endif #endif
// skip the rest of the fmt header if necissary // skip the rest of the fmt header if necissary
if (m_Header.FmtLength>16) if (m_Header.FmtLength>16)
{ {
fseek(m_Stream,m_Header.FmtLength-16,SEEK_CUR); fseek(m_Stream,m_Header.FmtLength-16,SEEK_CUR);
} }
fread(&m_DataHeader,sizeof(DataHeader),1,m_Stream); fread(&m_DataHeader,sizeof(DataHeader),1,m_Stream);


SWAPINT(m_DataHeader.DataLengthBytes); SWAPINT(m_DataHeader.DataLengthBytes);


while (m_DataHeader.DataName[0]!='d' ||
m_DataHeader.DataName[1]!='a' ||
m_DataHeader.DataName[2]!='t' ||
while (m_DataHeader.DataName[0]!='d' ||
m_DataHeader.DataName[1]!='a' ||
m_DataHeader.DataName[2]!='t' ||
m_DataHeader.DataName[3]!='a') m_DataHeader.DataName[3]!='a')
{ {
// crawl through the rest of the propriatory headers // crawl through the rest of the propriatory headers
// if we need to to try and get to the data header // if we need to to try and get to the data header
if (feof(m_Stream) || fseek(m_Stream,-(sizeof(DataHeader)-1),SEEK_CUR)==-1) if (feof(m_Stream) || fseek(m_Stream,-(sizeof(DataHeader)-1),SEEK_CUR)==-1)
{
cerr<<"WavFile: File open error, wrong format ["<<FileName<<"]"<<endl;
{
cerr<<"WavFile: File open error, wrong format ["<<FileName<<"]"<<endl;
return 0; return 0;
} }
fread(&m_DataHeader,sizeof(DataHeader),1,m_Stream); fread(&m_DataHeader,sizeof(DataHeader),1,m_Stream);
} }
fgetpos(m_Stream,(fpos_t*)&m_DataStart); fgetpos(m_Stream,(fpos_t*)&m_DataStart);
m_CurSeekPos=m_DataStart; m_CurSeekPos=m_DataStart;
#ifdef TRACE_OUT
#ifdef TRACE_OUT
cerr<<m_DataHeader.DataName[0]<<m_DataHeader.DataName[1]<< cerr<<m_DataHeader.DataName[0]<<m_DataHeader.DataName[1]<<
m_DataHeader.DataName[2]<<m_DataHeader.DataName[3]<<endl; m_DataHeader.DataName[2]<<m_DataHeader.DataName[3]<<endl;
cerr<<"DataLengthBytes "<<m_DataHeader.DataLengthBytes<<endl; cerr<<"DataLengthBytes "<<m_DataHeader.DataLengthBytes<<endl;
#endif
#endif
// check we have a wav file here // check we have a wav file here
if (m_Header.RiffName[0]=='R' && if (m_Header.RiffName[0]=='R' &&
m_Header.RiffName[1]=='I' && m_Header.RiffName[1]=='I' &&
@@ -180,7 +192,7 @@ int WavFile::Open(string FileName, Mode mode, Channels channels)
{ {
return 1; return 1;
} }
fclose(m_Stream); fclose(m_Stream);
cerr<<"WavFile: File open error, wrong format ["<<FileName<<"]"<<endl; cerr<<"WavFile: File open error, wrong format ["<<FileName<<"]"<<endl;
return 0; return 0;
@@ -190,18 +202,18 @@ int WavFile::Open(string FileName, Mode mode, Channels channels)


int WavFile::Close() int WavFile::Close()
{ {
if (m_Stream==NULL)
if (m_Stream==NULL)
{ {
return 0; return 0;
} }


// write the total length in
// write the total length in
fseek(m_Stream, 40, SEEK_SET); fseek(m_Stream, 40, SEEK_SET);
fwrite(&m_DataHeader.DataLengthBytes,4,1,m_Stream); fwrite(&m_DataHeader.DataLengthBytes,4,1,m_Stream);
fclose(m_Stream);
fclose(m_Stream);


m_Stream=NULL; m_Stream=NULL;
return 1;
return 1;
} }


int WavFile::Save(Sample &data) int WavFile::Save(Sample &data)


Loading…
Cancel
Save