From 7ca497feb116be4e2705a92597820b27711014e2 Mon Sep 17 00:00:00 2001 From: aj_genius Date: Thu, 13 Nov 2003 01:18:44 +0000 Subject: [PATCH] add support for 24bit & 32bit wav ouput --- .../DiskWriterPlugin/DiskWriterPlugin.C | 18 ++- .../DiskWriterPlugin/DiskWriterPlugin.h | 1 + .../DiskWriterPlugin/DiskWriterPluginGUI.C | 42 ++++++- .../DiskWriterPlugin/DiskWriterPluginGUI.h | 12 ++ .../Plugins/DiskWriterPlugin/Makefile.in | 3 + SpiralSound/RiffWav.C | 104 +++++++++++++----- SpiralSound/RiffWav.h | 5 +- 7 files changed, 149 insertions(+), 36 deletions(-) diff --git a/SpiralSound/Plugins/DiskWriterPlugin/DiskWriterPlugin.C b/SpiralSound/Plugins/DiskWriterPlugin/DiskWriterPlugin.C index 63afb56..2ea70a4 100644 --- a/SpiralSound/Plugins/DiskWriterPlugin/DiskWriterPlugin.C +++ b/SpiralSound/Plugins/DiskWriterPlugin/DiskWriterPlugin.C @@ -74,15 +74,18 @@ DiskWriterPlugin::DiskWriterPlugin() : m_Recording(false) { m_PluginInfo.Name="DiskWriter"; - m_PluginInfo.Width=100; - m_PluginInfo.Height=66; + m_PluginInfo.Width=140; + m_PluginInfo.Height=90; m_PluginInfo.NumInputs=3; m_PluginInfo.NumOutputs=0; m_PluginInfo.PortTips.push_back("Left Out"); m_PluginInfo.PortTips.push_back("Right Out"); m_PluginInfo.PortTips.push_back("Record Controller"); + m_GUIArgs.BitsPerSample = 16; + m_AudioCH->RegisterData("Filename",ChannelHandler::INPUT,m_GUIArgs.Name,256); + m_AudioCH->Register("BitsPerSample",&m_GUIArgs.BitsPerSample,ChannelHandler::INPUT); } DiskWriterPlugin::~DiskWriterPlugin() @@ -107,12 +110,12 @@ SpiralGUIType *DiskWriterPlugin::CreateGUI() void DiskWriterPlugin::Execute() { + int Bps = m_GUIArgs.BitsPerSample/8; if(m_Recording && m_Wav.IsOpen()) { int on=0; float t; - - short Buffer[host->BUFSIZE*2]; + short Buffer[host->BUFSIZE*Bps]; for (int n=0; nBUFSIZE; n++) { @@ -130,8 +133,8 @@ void DiskWriterPlugin::Execute() on++; } - // stereo 16bit * bufsize - m_Wav.Save(Buffer,host->BUFSIZE*2*2); + // stereo Bps * bufsize + m_Wav.Save(Buffer,host->BUFSIZE*2*Bps); } } @@ -145,6 +148,9 @@ void DiskWriterPlugin::ExecuteCommands() if (m_Wav.GetSamplerate() != GetHostInfo()->SAMPLERATE) { m_Wav.SetSamplerate(GetHostInfo()->SAMPLERATE); } + if (m_Wav.GetBitsPerSample() != m_GUIArgs.BitsPerSample) { + m_Wav.SetBitsPerSample(m_GUIArgs.BitsPerSample); + } m_Wav.Open(m_GUIArgs.Name,WavFile::WRITE, WavFile::STEREO); break; case CLOSEWAV : m_Wav.Close(); break; diff --git a/SpiralSound/Plugins/DiskWriterPlugin/DiskWriterPlugin.h b/SpiralSound/Plugins/DiskWriterPlugin/DiskWriterPlugin.h index 40aa91b..8c0b32c 100644 --- a/SpiralSound/Plugins/DiskWriterPlugin/DiskWriterPlugin.h +++ b/SpiralSound/Plugins/DiskWriterPlugin/DiskWriterPlugin.h @@ -40,6 +40,7 @@ public: struct GUIArgs { char Name[256]; + int BitsPerSample; }; private: diff --git a/SpiralSound/Plugins/DiskWriterPlugin/DiskWriterPluginGUI.C b/SpiralSound/Plugins/DiskWriterPlugin/DiskWriterPluginGUI.C index 3f02bc3..7aaaf8e 100644 --- a/SpiralSound/Plugins/DiskWriterPlugin/DiskWriterPluginGUI.C +++ b/SpiralSound/Plugins/DiskWriterPlugin/DiskWriterPluginGUI.C @@ -25,7 +25,23 @@ using namespace std; DiskWriterPluginGUI::DiskWriterPluginGUI(int w, int h, SpiralPlugin *o, ChannelHandler *ch,const HostInfo *Info) : SpiralPluginGUI(w,h,o,ch) { - Open = new Fl_Button(5, 15, 90, 20, "Open"); + m_16bits = new Fl_LED_Button (0, 15, 23, 23, "16bit"); + m_16bits->type (FL_RADIO_BUTTON); + m_16bits->labelsize(10); + m_16bits->set(); + m_16bits->callback((Fl_Callback*)cb_16bits); + + m_24bits = new Fl_LED_Button (0, 38, 23, 23, "24bit"); + m_24bits->type (FL_RADIO_BUTTON); + m_24bits->labelsize(10); + m_24bits->callback((Fl_Callback*)cb_24bits); + + m_32bits = new Fl_LED_Button (0, 61, 23, 23, "32bit"); + m_32bits->type (FL_RADIO_BUTTON); + m_32bits->labelsize(10); + m_32bits->callback((Fl_Callback*)cb_32bits); + + Open = new Fl_Button(50, 20, 90, 20, "Open"); Open->type(1); Open->box (FL_PLASTIC_UP_BOX); Open->color (Info->GUI_COLOUR); @@ -33,7 +49,7 @@ SpiralPluginGUI(w,h,o,ch) Open->labelsize(10); Open->callback((Fl_Callback*)cb_Open); - Record = new Fl_Button(5, 38, 90, 20, "Record"); + Record = new Fl_Button(50, 60, 90, 20, "Record"); Record->type(1); Record->box (FL_PLASTIC_UP_BOX); Record->color (Info->GUI_COLOUR); @@ -74,6 +90,7 @@ inline void DiskWriterPluginGUI::cb_Open_i(Fl_Button* o, void* v) m_GUICH->SetCommand(DiskWriterPlugin::CLOSEWAV); } } + void DiskWriterPluginGUI::cb_Open(Fl_Button* o, void* v) { ((DiskWriterPluginGUI*)(o->parent()))->cb_Open_i(o,v); } @@ -85,6 +102,27 @@ inline void DiskWriterPluginGUI::cb_Record_i(Fl_Button* o, void* v) void DiskWriterPluginGUI::cb_Record(Fl_Button* o, void* v) { ((DiskWriterPluginGUI*)(o->parent()))->cb_Record_i(o,v); } +inline void DiskWriterPluginGUI::cb_16bits_i(Fl_Button* o, void* v) +{ + m_GUICH->Set("BitsPerSample",16); +} +void DiskWriterPluginGUI::cb_16bits(Fl_Button* o, void* v) +{ ((DiskWriterPluginGUI*)(o->parent()))->cb_16bits_i(o,v); } + +inline void DiskWriterPluginGUI::cb_24bits_i(Fl_Button* o, void* v) +{ + m_GUICH->Set("BitsPerSample",24); +} +void DiskWriterPluginGUI::cb_24bits(Fl_Button* o, void* v) +{ ((DiskWriterPluginGUI*)(o->parent()))->cb_24bits_i(o,v); } + +inline void DiskWriterPluginGUI::cb_32bits_i(Fl_Button* o, void* v) +{ + m_GUICH->Set("BitsPerSample",32); +} +void DiskWriterPluginGUI::cb_32bits(Fl_Button* o, void* v) +{ ((DiskWriterPluginGUI*)(o->parent()))->cb_32bits_i(o,v); } + const string DiskWriterPluginGUI::GetHelpText(const string &loc){ return string("") + "One way of recording your creations to disk. First open a file\n" diff --git a/SpiralSound/Plugins/DiskWriterPlugin/DiskWriterPluginGUI.h b/SpiralSound/Plugins/DiskWriterPlugin/DiskWriterPluginGUI.h index 48d1c2e..e5e1404 100644 --- a/SpiralSound/Plugins/DiskWriterPlugin/DiskWriterPluginGUI.h +++ b/SpiralSound/Plugins/DiskWriterPlugin/DiskWriterPluginGUI.h @@ -20,6 +20,7 @@ #include #include "DiskWriterPlugin.h" #include "../SpiralPluginGUI.h" +#include "../Widgets/Fl_LED_Button.H" #ifndef DISK_WRITER_GUI_H #define DISK_WRITER_GUI_H @@ -39,12 +40,23 @@ private: Fl_Button *Open; Fl_Button *Record; + Fl_LED_Button *m_16bits; + Fl_LED_Button *m_24bits; + Fl_LED_Button *m_32bits; + //// Callbacks //// inline void cb_Record_i(Fl_Button* o, void* v); static void cb_Record(Fl_Button* o, void* v); inline void cb_Open_i(Fl_Button* o, void* v); static void cb_Open(Fl_Button* o, void* v); + + inline void cb_16bits_i(Fl_Button* o, void* v); + static void cb_16bits(Fl_Button* o, void* v); + inline void cb_24bits_i(Fl_Button* o, void* v); + static void cb_24bits(Fl_Button* o, void* v); + inline void cb_32bits_i(Fl_Button* o, void* v); + static void cb_32bits(Fl_Button* o, void* v); }; #endif diff --git a/SpiralSound/Plugins/DiskWriterPlugin/Makefile.in b/SpiralSound/Plugins/DiskWriterPlugin/Makefile.in index 2a9cfc2..0eb2703 100644 --- a/SpiralSound/Plugins/DiskWriterPlugin/Makefile.in +++ b/SpiralSound/Plugins/DiskWriterPlugin/Makefile.in @@ -45,6 +45,7 @@ HEADERS = DiskWriterPlugin.h \ ../../ChannelHandler.h \ ../../Sample.h \ ../../RiffWav.h \ + ../Widgets/Fl_LED_Button.H \ ../../../GUI/Widgets/SpiralGUI.H SOURCES = DiskWriterPlugin.C \ DiskWriterPluginGUI.C \ @@ -53,6 +54,7 @@ SOURCES = DiskWriterPlugin.C \ ../../ChannelHandler.C \ ../../Sample.C \ ../../RiffWav.C \ + ../Widgets/Fl_LED_Button.cxx \ ../../../GUI/Widgets/SpiralGUI.C OBJECTS = DiskWriterPlugin.o \ DiskWriterPluginGUI.o \ @@ -61,6 +63,7 @@ OBJECTS = DiskWriterPlugin.o \ ../../ChannelHandler.o \ ../../Sample.o \ ../../RiffWav.o \ + ../Widgets/Fl_LED_Button.o \ ../../../GUI/Widgets/SpiralGUI.o INTERFACES = UICDECLS = diff --git a/SpiralSound/RiffWav.C b/SpiralSound/RiffWav.C index fdabd25..e69ba66 100644 --- a/SpiralSound/RiffWav.C +++ b/SpiralSound/RiffWav.C @@ -36,11 +36,27 @@ const int HEADERLEN = (4+24+8); #if __BYTE_ORDER == BIG_ENDIAN #define SWAPSHORT(a) (a)=(((a)<<8)|(((a)>>8)&0xff)) #define SWAPINT(a) (a)=(((a)&0x000000ff)<<24)|(((a)&0x0000ff00)<<8)|(((a)&0x00ff0000)>>8)|(((a)&0xff000000)>>24) +#define SWAPFLOAT(a) swap_be_to_le_float(&a) #else #define SWAPSHORT(a) #define SWAPINT(a) +#define SWAPFLOAT(a) #endif +static void swap_be_to_le_float(float *a) +{ + float tmp; + char *src, *dst; + + src = (char*)a; + dst = (char*)&tmp; + dst[0] = src[3]; + dst[1] = src[2]; + dst[2] = src[1]; + dst[3] = src[0]; + *a = tmp; +} + int WavFile::Open(string FileName, Mode mode, Channels channels) { if (m_Stream!=NULL) @@ -85,7 +101,7 @@ int WavFile::Open(string FileName, Mode mode, Channels channels) else m_Header.FmtChannels=1; m_Header.FmtSamplerate=WavFile::m_Samplerate; - m_Header.FmtBitsPerSample=16; + m_Header.FmtBitsPerSample=WavFile::m_BitsPerSample; m_Header.FmtBlockAlign=m_Header.FmtChannels*m_Header.FmtBitsPerSample/8; m_Header.FmtBytesPerSec=m_Header.FmtSamplerate*m_Header.FmtBlockAlign; @@ -125,6 +141,9 @@ int WavFile::Open(string FileName, Mode mode, Channels channels) SWAPSHORT(m_Header.FmtBlockAlign); SWAPSHORT(m_Header.FmtBitsPerSample); + WavFile::m_BitsPerSample=m_Header.FmtBitsPerSample; + WavFile::m_Samplerate=m_Header.FmtSamplerate; + #ifdef TRACE_OUT cerr<1) v=1; - temp[n]=(short)(v*SHRT_MAX); - SWAPSHORT(temp[n]); + int Bps = m_Header.FmtBitsPerSample/8; + + // convert to integer for saving + if (Bps == 2) { + short *temp=new short[data.GetLength()]; + for (int n=0; n1) v=1; + temp[n]=(short)(v*SHRT_MAX); + SWAPSHORT(temp[n]); + } + + m_DataHeader.DataLengthBytes+=data.GetLength()*Bps; + fwrite(temp,sizeof(&temp),data.GetLength()/Bps,m_Stream); + + // leak! + delete[] temp; + } else if ((Bps == 3)) { + int *temp=new int[data.GetLength()]; + for (int n=0; n1) v=1; + temp[n]=(int)(v*INT_MAX); + SWAPINT(temp[n]); + } + + m_DataHeader.DataLengthBytes+=data.GetLength()*Bps; + fwrite(temp,sizeof(&temp),data.GetLength()/Bps,m_Stream); + + // leak! + delete[] temp; + } else if ((Bps == 4)) { + float *temp=new float[data.GetLength()]; + for (int n=0; n1.0) v=1.0; + temp[n]=v; + SWAPFLOAT(temp[n]); + } + + m_DataHeader.DataLengthBytes+=data.GetLength()*Bps; + fwrite(temp,sizeof(&temp),data.GetLength()/Bps,m_Stream); + + // leak! + delete[] temp; } - - m_DataHeader.DataLengthBytes+=data.GetLength()*2; - fwrite(temp,sizeof(&temp),data.GetLength()/2,m_Stream); - - // leak! - delete[] temp; - return 1; } @@ -245,24 +299,20 @@ int WavFile::Save(short *data, int Bytes) int WavFile::GetSize() { - if (m_Header.FmtBitsPerSample!=8 && m_Header.FmtBitsPerSample!=16) + int Bps = m_Header.FmtBitsPerSample/8; + if ((Bps<1) || (Bps>3)) { cerr<<"WavFile Warning: FmtBitsPerSample="<