and removed references to RiffWav in plugins that don't use it.master
| @@ -110,9 +110,8 @@ SpiralGUIType *DiskWriterPlugin::CreateGUI() | |||||
| void DiskWriterPlugin::Execute() | void DiskWriterPlugin::Execute() | ||||
| { | { | ||||
| int Bps = m_GUIArgs.BitsPerSample/8; | |||||
| if(m_Recording && m_Wav.IsOpen()) | if(m_Recording && m_Wav.IsOpen()) | ||||
| { | |||||
| { | |||||
| int on=0; | int on=0; | ||||
| float LeftBuffer[host->BUFSIZE], RightBuffer[host->BUFSIZE]; | float LeftBuffer[host->BUFSIZE], RightBuffer[host->BUFSIZE]; | ||||
| @@ -123,9 +122,8 @@ void DiskWriterPlugin::Execute() | |||||
| RightBuffer[n]=GetInput(1,n); | RightBuffer[n]=GetInput(1,n); | ||||
| } | } | ||||
| // stereo Bps * bufsize | |||||
| m_Wav.Save(LeftBuffer, RightBuffer, host->BUFSIZE); | |||||
| } | |||||
| m_Wav.Save(LeftBuffer, RightBuffer, host->BUFSIZE); | |||||
| } | |||||
| } | } | ||||
| void DiskWriterPlugin::ExecuteCommands() | void DiskWriterPlugin::ExecuteCommands() | ||||
| @@ -11,7 +11,7 @@ CXXFLAGS= @CXXFLAGS@ | |||||
| INCPATH = -I/usr/X11R6/include | INCPATH = -I/usr/X11R6/include | ||||
| LINK = g++ -shared | LINK = g++ -shared | ||||
| LFLAGS = | LFLAGS = | ||||
| LIBS = @FLTK_LIBS@ | |||||
| LIBS = @FLTK_LIBS@ @SFLIBS@ | |||||
| MOC = moc | MOC = moc | ||||
| UIC = | UIC = | ||||
| @@ -17,7 +17,6 @@ | |||||
| */ | */ | ||||
| #include "../SpiralPlugin.h" | #include "../SpiralPlugin.h" | ||||
| #include "../../RiffWav.h" | |||||
| #include <FL/Fl_Pixmap.H> | #include <FL/Fl_Pixmap.H> | ||||
| #include <jack/jack.h> | #include <jack/jack.h> | ||||
| @@ -4,7 +4,6 @@ HEADERS = ../SpiralPlugin.h \ | |||||
| ../Widgets/Fl_DragBar.H \ | ../Widgets/Fl_DragBar.H \ | ||||
| ../Widgets/Fl_LED_Button.H \ | ../Widgets/Fl_LED_Button.H \ | ||||
| ../../Sample.h \ | ../../Sample.h \ | ||||
| ../../RiffWav.h \ | |||||
| JackPlugin.h \ | JackPlugin.h \ | ||||
| JackPluginGUI.h | JackPluginGUI.h | ||||
| @@ -14,7 +13,6 @@ SOURCES = ../SpiralPlugin.C \ | |||||
| ../Widgets/Fl_DragBar.cxx \ | ../Widgets/Fl_DragBar.cxx \ | ||||
| ../Widgets/Fl_LED_Button.cxx \ | ../Widgets/Fl_LED_Button.cxx \ | ||||
| ../../Sample.C \ | ../../Sample.C \ | ||||
| ../../RiffWav.C \ | |||||
| JackPlugin.C \ | JackPlugin.C \ | ||||
| JackPluginGUI.C | JackPluginGUI.C | ||||
| @@ -46,7 +46,6 @@ HEADERS = JackPlugin.h \ | |||||
| ../SpiralPluginGUI.h \ | ../SpiralPluginGUI.h \ | ||||
| ../../ChannelHandler.h \ | ../../ChannelHandler.h \ | ||||
| ../../Sample.h \ | ../../Sample.h \ | ||||
| ../../RiffWav.h \ | |||||
| ../Widgets/Fl_Knob.H \ | ../Widgets/Fl_Knob.H \ | ||||
| ../Widgets/Fl_LED_Button.H \ | ../Widgets/Fl_LED_Button.H \ | ||||
| ../../../GUI/Widgets/SpiralGUI.H | ../../../GUI/Widgets/SpiralGUI.H | ||||
| @@ -56,7 +55,6 @@ SOURCES = JackPlugin.C \ | |||||
| ../SpiralPluginGUI.C \ | ../SpiralPluginGUI.C \ | ||||
| ../../ChannelHandler.C \ | ../../ChannelHandler.C \ | ||||
| ../../Sample.C \ | ../../Sample.C \ | ||||
| ../../RiffWav.C \ | |||||
| ../Widgets/Fl_Knob.cxx \ | ../Widgets/Fl_Knob.cxx \ | ||||
| ../Widgets/Fl_LED_Button.cxx \ | ../Widgets/Fl_LED_Button.cxx \ | ||||
| ../../../GUI/Widgets/SpiralGUI.C | ../../../GUI/Widgets/SpiralGUI.C | ||||
| @@ -66,7 +64,6 @@ OBJECTS = JackPlugin.o \ | |||||
| ../SpiralPluginGUI.o \ | ../SpiralPluginGUI.o \ | ||||
| ../../ChannelHandler.o \ | ../../ChannelHandler.o \ | ||||
| ../../Sample.o \ | ../../Sample.o \ | ||||
| ../../RiffWav.o \ | |||||
| ../Widgets/Fl_Knob.o \ | ../Widgets/Fl_Knob.o \ | ||||
| ../Widgets/Fl_LED_Button.o \ | ../Widgets/Fl_LED_Button.o \ | ||||
| ../../../GUI/Widgets/SpiralGUI.o | ../../../GUI/Widgets/SpiralGUI.o | ||||
| @@ -152,17 +149,12 @@ install: | |||||
| ../../Sample.o: ../../Sample.C \ | ../../Sample.o: ../../Sample.C \ | ||||
| ../../Sample.h | ../../Sample.h | ||||
| ../../RiffWav.o: ../../RiffWav.C \ | |||||
| ../../RiffWav.h \ | |||||
| ../../Sample.h | |||||
| JackPlugin.o: JackPlugin.C \ | JackPlugin.o: JackPlugin.C \ | ||||
| JackPlugin.h \ | JackPlugin.h \ | ||||
| JackPluginGUI.h \ | JackPluginGUI.h \ | ||||
| ../SpiralPluginGUI.h \ | ../SpiralPluginGUI.h \ | ||||
| ../SpiralPlugin.h \ | ../SpiralPlugin.h \ | ||||
| ../../Sample.h \ | ../../Sample.h \ | ||||
| ../../RiffWav.h \ | |||||
| SpiralIcon.xpm | SpiralIcon.xpm | ||||
| JackPluginGUI.o: JackPluginGUI.C \ | JackPluginGUI.o: JackPluginGUI.C \ | ||||
| @@ -171,7 +163,6 @@ JackPluginGUI.o: JackPluginGUI.C \ | |||||
| ../SpiralPluginGUI.h \ | ../SpiralPluginGUI.h \ | ||||
| ../SpiralPlugin.h \ | ../SpiralPlugin.h \ | ||||
| ../../Sample.h \ | ../../Sample.h \ | ||||
| ../../RiffWav.h \ | |||||
| ../Widgets/Fl_Knob.H \ | ../Widgets/Fl_Knob.H \ | ||||
| ../Widgets/Fl_LED_Button.H \ | ../Widgets/Fl_LED_Button.H \ | ||||
| ../../../GUI/Widgets/SpiralGUI.H | ../../../GUI/Widgets/SpiralGUI.H | ||||
| @@ -3,7 +3,6 @@ HEADERS = ../SpiralPlugin.h \ | |||||
| ../Widgets/Fl_Knob.H \ | ../Widgets/Fl_Knob.H \ | ||||
| ../Widgets/Fl_DragBar.H \ | ../Widgets/Fl_DragBar.H \ | ||||
| ../../Sample.h \ | ../../Sample.h \ | ||||
| ../../RiffWav.h \ | |||||
| JoystickPlugin.h \ | JoystickPlugin.h \ | ||||
| JoystickPluginGUI.h | JoystickPluginGUI.h | ||||
| @@ -12,7 +11,6 @@ SOURCES = ../SpiralPlugin.C \ | |||||
| ../Widgets/Fl_Knob.cxx \ | ../Widgets/Fl_Knob.cxx \ | ||||
| ../Widgets/Fl_DragBar.cxx \ | ../Widgets/Fl_DragBar.cxx \ | ||||
| ../../Sample.C \ | ../../Sample.C \ | ||||
| ../../RiffWav.C \ | |||||
| JoystickPlugin.C \ | JoystickPlugin.C \ | ||||
| JoystickPluginGUI.C | JoystickPluginGUI.C | ||||
| @@ -154,7 +154,6 @@ MatrixPlugin.o: MatrixPlugin.C \ | |||||
| ../SpiralPlugin.h \ | ../SpiralPlugin.h \ | ||||
| ../../Sample.h \ | ../../Sample.h \ | ||||
| SpiralIcon.xpm \ | SpiralIcon.xpm \ | ||||
| ../../RiffWav.h \ | |||||
| ../../NoteTable.h | ../../NoteTable.h | ||||
| MatrixPluginGUI.o: MatrixPluginGUI.C \ | MatrixPluginGUI.o: MatrixPluginGUI.C \ | ||||
| @@ -19,7 +19,6 @@ | |||||
| #include "MatrixPluginGUI.h" | #include "MatrixPluginGUI.h" | ||||
| #include <FL/Fl_Button.h> | #include <FL/Fl_Button.h> | ||||
| #include "SpiralIcon.xpm" | #include "SpiralIcon.xpm" | ||||
| #include "../../RiffWav.h" | |||||
| #include "../../NoteTable.h" | #include "../../NoteTable.h" | ||||
| using namespace std; | using namespace std; | ||||
| @@ -399,56 +399,6 @@ void PoshSamplerPlugin::StreamIn(istream &s) | |||||
| void PoshSamplerPlugin::LoadSample(int n, const string &Name) | void PoshSamplerPlugin::LoadSample(int n, const string &Name) | ||||
| { | { | ||||
| #ifdef USE_LIBSNDFILE | |||||
| SNDFILE *m_FileHandle = NULL; | |||||
| SF_INFO m_FileInfo; | |||||
| m_FileInfo.format = 0; | |||||
| m_FileHandle = sf_open (Name.c_str(), SFM_READ, &m_FileInfo); | |||||
| if (m_FileHandle == NULL) | |||||
| { | |||||
| cerr<<"PoshSamplerPlugin: File ["<<Name<<"] does not exist"<<endl; | |||||
| return; | |||||
| } | |||||
| m_SampleVec[n]->Allocate(m_FileInfo.frames); | |||||
| float *TempBuf = new float[m_FileInfo.frames*m_FileInfo.channels]; | |||||
| if (m_FileInfo.frames*m_FileInfo.channels!= sf_read_float(m_FileHandle, TempBuf, m_FileInfo.frames*m_FileInfo.channels)) | |||||
| { | |||||
| cerr<<"PoshSamplerPlugin: File ["<<Name<<"] Read error"<<endl; | |||||
| return; | |||||
| } | |||||
| for (int i=0; i<m_FileInfo.frames; i++) | |||||
| { | |||||
| float value=0; | |||||
| if (m_FileInfo.channels>1) // mix the channels into a mono buffer | |||||
| { | |||||
| for (int j=0; j<m_FileInfo.channels; j++) | |||||
| value += TempBuf[(i*m_FileInfo.channels)+j]; | |||||
| value/=m_FileInfo.channels; | |||||
| m_SampleVec[i]->Set(i,value); | |||||
| } else | |||||
| m_SampleVec[i]->Set(i,TempBuf[i]); | |||||
| } | |||||
| delete[] TempBuf; | |||||
| sf_close(m_FileHandle); | |||||
| m_FileHandle = NULL; | |||||
| m_SampleDescVec[n]->SampleRate=m_FileInfo.samplerate; | |||||
| m_SampleDescVec[n]->Stereo=(m_FileInfo.channels > 1); | |||||
| m_SampleDescVec[n]->Pitch *= m_SampleDescVec[n]->SampleRate/(float)m_HostInfo->SAMPLERATE; | |||||
| m_SampleDescVec[n]->LoopEnd=m_SampleVec[n]->GetLength()-1; | |||||
| #else | |||||
| WavFile Wav; | WavFile Wav; | ||||
| if (Wav.Open(Name,WavFile::READ)) | if (Wav.Open(Name,WavFile::READ)) | ||||
| { | { | ||||
| @@ -460,7 +410,6 @@ void PoshSamplerPlugin::LoadSample(int n, const string &Name) | |||||
| m_SampleDescVec[n]->Pitch *= m_SampleDescVec[n]->SampleRate/(float)m_HostInfo->SAMPLERATE; | m_SampleDescVec[n]->Pitch *= m_SampleDescVec[n]->SampleRate/(float)m_HostInfo->SAMPLERATE; | ||||
| m_SampleDescVec[n]->LoopEnd=m_SampleVec[n]->GetLength()-1; | m_SampleDescVec[n]->LoopEnd=m_SampleVec[n]->GetLength()-1; | ||||
| } | } | ||||
| #endif | |||||
| } | } | ||||
| void PoshSamplerPlugin::SaveSample(int n, const string &Name) | void PoshSamplerPlugin::SaveSample(int n, const string &Name) | ||||
| @@ -44,7 +44,6 @@ HEADERS = SeqPlugin.h \ | |||||
| ../SpiralPluginGUI.h \ | ../SpiralPluginGUI.h \ | ||||
| ../../ChannelHandler.h \ | ../../ChannelHandler.h \ | ||||
| ../../Sample.h \ | ../../Sample.h \ | ||||
| ../../RiffWav.h \ | |||||
| ../Widgets/Fl_Knob.H \ | ../Widgets/Fl_Knob.H \ | ||||
| ../Widgets/Fl_EventMap.h \ | ../Widgets/Fl_EventMap.h \ | ||||
| ../Widgets/Fl_SEvent.h \ | ../Widgets/Fl_SEvent.h \ | ||||
| @@ -55,7 +54,6 @@ SOURCES = SeqPlugin.C \ | |||||
| ../SpiralPluginGUI.C \ | ../SpiralPluginGUI.C \ | ||||
| ../../ChannelHandler.C \ | ../../ChannelHandler.C \ | ||||
| ../../Sample.C \ | ../../Sample.C \ | ||||
| ../../RiffWav.C \ | |||||
| ../Widgets/Fl_Knob.cxx \ | ../Widgets/Fl_Knob.cxx \ | ||||
| ../Widgets/Fl_EventMap.C \ | ../Widgets/Fl_EventMap.C \ | ||||
| ../Widgets/Fl_SEvent.C \ | ../Widgets/Fl_SEvent.C \ | ||||
| @@ -66,7 +64,6 @@ OBJECTS = SeqPlugin.o \ | |||||
| ../SpiralPluginGUI.o \ | ../SpiralPluginGUI.o \ | ||||
| ../../ChannelHandler.o \ | ../../ChannelHandler.o \ | ||||
| ../../Sample.o \ | ../../Sample.o \ | ||||
| ../../RiffWav.o \ | |||||
| ../Widgets/Fl_Knob.o \ | ../Widgets/Fl_Knob.o \ | ||||
| ../Widgets/Fl_EventMap.o \ | ../Widgets/Fl_EventMap.o \ | ||||
| ../Widgets/Fl_SEvent.o \ | ../Widgets/Fl_SEvent.o \ | ||||
| @@ -158,10 +155,6 @@ install: | |||||
| ../../Sample.o: ../../Sample.C \ | ../../Sample.o: ../../Sample.C \ | ||||
| ../../Sample.h | ../../Sample.h | ||||
| ../../RiffWav.o: ../../RiffWav.C \ | |||||
| ../../RiffWav.h \ | |||||
| ../../Sample.h | |||||
| SeqPlugin.o: SeqPlugin.C \ | SeqPlugin.o: SeqPlugin.C \ | ||||
| SeqPlugin.h \ | SeqPlugin.h \ | ||||
| SeqPluginGUI.h \ | SeqPluginGUI.h \ | ||||
| @@ -169,7 +162,6 @@ SeqPlugin.o: SeqPlugin.C \ | |||||
| ../SpiralPlugin.h \ | ../SpiralPlugin.h \ | ||||
| ../../Sample.h \ | ../../Sample.h \ | ||||
| SpiralIcon.xpm \ | SpiralIcon.xpm \ | ||||
| ../../RiffWav.h \ | |||||
| ../../NoteTable.h | ../../NoteTable.h | ||||
| SeqPluginGUI.o: SeqPluginGUI.C \ | SeqPluginGUI.o: SeqPluginGUI.C \ | ||||
| @@ -19,7 +19,6 @@ | |||||
| #include "SeqPluginGUI.h" | #include "SeqPluginGUI.h" | ||||
| #include <FL/Fl_Button.h> | #include <FL/Fl_Button.h> | ||||
| #include "SpiralIcon.xpm" | #include "SpiralIcon.xpm" | ||||
| #include "../../RiffWav.h" | |||||
| #include "../../NoteTable.h" | #include "../../NoteTable.h" | ||||
| using namespace std; | using namespace std; | ||||
| @@ -5,7 +5,6 @@ HEADERS = ../SpiralPlugin.h \ | |||||
| ../Widgets/Fl_EventMap.h \ | ../Widgets/Fl_EventMap.h \ | ||||
| ../Widgets/Fl_SEvent.h \ | ../Widgets/Fl_SEvent.h \ | ||||
| ../../Sample.h \ | ../../Sample.h \ | ||||
| ../../RiffWav.h \ | |||||
| SeqPlugin.h \ | SeqPlugin.h \ | ||||
| SeqPluginGUI.h | SeqPluginGUI.h | ||||
| @@ -16,7 +15,6 @@ SOURCES = ../SpiralPlugin.C \ | |||||
| ../Widgets/Fl_EventMap.C \ | ../Widgets/Fl_EventMap.C \ | ||||
| ../Widgets/Fl_SEvent.C \ | ../Widgets/Fl_SEvent.C \ | ||||
| ../../Sample.C \ | ../../Sample.C \ | ||||
| ../../RiffWav.C \ | |||||
| SeqPlugin.C \ | SeqPlugin.C \ | ||||
| SeqPluginGUI.C | SeqPluginGUI.C | ||||
| @@ -44,7 +44,6 @@ HEADERS = SequencerPlugin.h \ | |||||
| ../SpiralPluginGUI.h \ | ../SpiralPluginGUI.h \ | ||||
| ../../ChannelHandler.h \ | ../../ChannelHandler.h \ | ||||
| ../../Sample.h \ | ../../Sample.h \ | ||||
| ../../RiffWav.h \ | |||||
| ../Widgets/Fl_Knob.H \ | ../Widgets/Fl_Knob.H \ | ||||
| ../Widgets/Fl_EventMap.h \ | ../Widgets/Fl_EventMap.h \ | ||||
| ../Widgets/Fl_SEvent.h \ | ../Widgets/Fl_SEvent.h \ | ||||
| @@ -55,7 +54,6 @@ SOURCES = SequencerPlugin.C \ | |||||
| ../SpiralPluginGUI.C \ | ../SpiralPluginGUI.C \ | ||||
| ../../ChannelHandler.C \ | ../../ChannelHandler.C \ | ||||
| ../../Sample.C \ | ../../Sample.C \ | ||||
| ../../RiffWav.C \ | |||||
| ../Widgets/Fl_Knob.cxx \ | ../Widgets/Fl_Knob.cxx \ | ||||
| ../Widgets/Fl_EventMap.C \ | ../Widgets/Fl_EventMap.C \ | ||||
| ../Widgets/Fl_SEvent.C \ | ../Widgets/Fl_SEvent.C \ | ||||
| @@ -66,7 +64,6 @@ OBJECTS = SequencerPlugin.o \ | |||||
| ../SpiralPluginGUI.o \ | ../SpiralPluginGUI.o \ | ||||
| ../../ChannelHandler.o \ | ../../ChannelHandler.o \ | ||||
| ../../Sample.o \ | ../../Sample.o \ | ||||
| ../../RiffWav.o \ | |||||
| ../Widgets/Fl_Knob.o \ | ../Widgets/Fl_Knob.o \ | ||||
| ../Widgets/Fl_EventMap.o \ | ../Widgets/Fl_EventMap.o \ | ||||
| ../Widgets/Fl_SEvent.o \ | ../Widgets/Fl_SEvent.o \ | ||||
| @@ -158,17 +155,12 @@ install: | |||||
| ../../Sample.o: ../../Sample.C \ | ../../Sample.o: ../../Sample.C \ | ||||
| ../../Sample.h | ../../Sample.h | ||||
| ../../RiffWav.o: ../../RiffWav.C \ | |||||
| ../../RiffWav.h \ | |||||
| ../../Sample.h | |||||
| SequencerPlugin.o: SequencerPlugin.C \ | SequencerPlugin.o: SequencerPlugin.C \ | ||||
| SequencerPlugin.h \ | SequencerPlugin.h \ | ||||
| SequencerPluginGUI.h \ | SequencerPluginGUI.h \ | ||||
| ../SpiralPluginGUI.h \ | ../SpiralPluginGUI.h \ | ||||
| ../SpiralPlugin.h \ | ../SpiralPlugin.h \ | ||||
| ../../Sample.h \ | ../../Sample.h \ | ||||
| ../../RiffWav.h \ | |||||
| ../../NoteTable.h \ | ../../NoteTable.h \ | ||||
| SpiralIcon.xpm | SpiralIcon.xpm | ||||
| @@ -19,7 +19,6 @@ | |||||
| #include "SequencerPluginGUI.h" | #include "SequencerPluginGUI.h" | ||||
| #include <FL/Fl_Button.h> | #include <FL/Fl_Button.h> | ||||
| #include "SpiralIcon.xpm" | #include "SpiralIcon.xpm" | ||||
| #include "../../RiffWav.h" | |||||
| #include "../../NoteTable.h" | #include "../../NoteTable.h" | ||||
| using namespace std; | using namespace std; | ||||
| @@ -21,12 +21,6 @@ | |||||
| #include "SpiralIcon.xpm" | #include "SpiralIcon.xpm" | ||||
| #include "../../NoteTable.h" | #include "../../NoteTable.h" | ||||
| #include "../../../config.h" | |||||
| #ifdef USE_LIBSNDFILE | |||||
| #include <sndfile.h> | |||||
| #endif | |||||
| #include "../../RiffWav.h" | #include "../../RiffWav.h" | ||||
| using namespace std; | using namespace std; | ||||
| @@ -275,51 +269,6 @@ void SpiralLoopPlugin::LoadExternalFiles(const string &Dir) | |||||
| void SpiralLoopPlugin::LoadWav(const char *Filename) | void SpiralLoopPlugin::LoadWav(const char *Filename) | ||||
| { | { | ||||
| #ifdef USE_LIBSNDFILE | |||||
| SNDFILE *m_FileHandle = NULL; | |||||
| SF_INFO m_FileInfo; | |||||
| m_FileInfo.format = 0; | |||||
| m_FileHandle = sf_open (Filename, SFM_READ, &m_FileInfo); | |||||
| if (m_FileHandle == NULL) | |||||
| { | |||||
| cerr<<"SpiralLoopPlugin: File ["<<Filename<<"] does not exist"<<endl; | |||||
| return; | |||||
| } | |||||
| AllocateMem(m_FileInfo.frames); | |||||
| float *TempBuf = new float[m_FileInfo.frames*m_FileInfo.channels]; | |||||
| if (m_FileInfo.frames*m_FileInfo.channels!= sf_read_float(m_FileHandle, TempBuf, m_FileInfo.frames*m_FileInfo.channels)) | |||||
| { | |||||
| cerr<<"SpiralLoopPlugin: File ["<<Filename<<"] Read error"<<endl; | |||||
| return; | |||||
| } | |||||
| for (int i=0; i<m_FileInfo.frames; i++) | |||||
| { | |||||
| float value=0; | |||||
| if (m_FileInfo.channels>1) // mix the channels into a mono buffer | |||||
| { | |||||
| for (int j=0; j<m_FileInfo.channels; j++) | |||||
| value += TempBuf[(i*m_FileInfo.channels)+j]; | |||||
| value/=m_FileInfo.channels; | |||||
| m_StoreBuffer.Set(i,value); | |||||
| } else | |||||
| m_StoreBuffer.Set(i,TempBuf[i]); | |||||
| } | |||||
| delete[] TempBuf; | |||||
| sf_close(m_FileHandle); | |||||
| m_FileHandle = NULL; | |||||
| #else | |||||
| WavFile wav; | WavFile wav; | ||||
| if (wav.Open(Filename, WavFile::READ)) | if (wav.Open(Filename, WavFile::READ)) | ||||
| { | { | ||||
| @@ -327,7 +276,6 @@ void SpiralLoopPlugin::LoadWav(const char *Filename) | |||||
| AllocateMem(wav.GetSize()); | AllocateMem(wav.GetSize()); | ||||
| wav.Load(m_StoreBuffer); | wav.Load(m_StoreBuffer); | ||||
| } | } | ||||
| #endif | |||||
| } | } | ||||
| void SpiralLoopPlugin::SaveWav(const char *Filename) | void SpiralLoopPlugin::SaveWav(const char *Filename) | ||||
| @@ -22,12 +22,6 @@ | |||||
| #include "../../NoteTable.h" | #include "../../NoteTable.h" | ||||
| #include <stdio.h> | #include <stdio.h> | ||||
| #include "../../../config.h" | |||||
| #ifdef USE_LIBSNDFILE | |||||
| #include <sndfile.h> | |||||
| #endif | |||||
| #include "../../RiffWav.h" | #include "../../RiffWav.h" | ||||
| using namespace std; | using namespace std; | ||||
| @@ -60,9 +54,6 @@ string SpiralPlugin_GetGroupName() | |||||
| /////////////////////////////////////////////////////// | /////////////////////////////////////////////////////// | ||||
| StreamPlugin::StreamPlugin() : | StreamPlugin::StreamPlugin() : | ||||
| #ifdef USE_LIBSNDFILE | |||||
| m_File (NULL), | |||||
| #endif | |||||
| m_SampleRate (44100), | m_SampleRate (44100), | ||||
| m_SampleSize (256), | m_SampleSize (256), | ||||
| m_StreamPos (0), | m_StreamPos (0), | ||||
| @@ -98,11 +89,6 @@ m_Mode(STOPM) | |||||
| StreamPlugin::~StreamPlugin() | StreamPlugin::~StreamPlugin() | ||||
| { | { | ||||
| #ifdef USE_LIBSNDFILE | |||||
| if (m_File) | |||||
| sf_close(m_File); | |||||
| m_File = NULL; | |||||
| #endif | |||||
| } | } | ||||
| PluginInfo &StreamPlugin::Initialise(const HostInfo *Host) | PluginInfo &StreamPlugin::Initialise(const HostInfo *Host) | ||||
| @@ -116,93 +102,6 @@ SpiralGUIType *StreamPlugin::CreateGUI() { | |||||
| } | } | ||||
| void StreamPlugin::Execute() { | void StreamPlugin::Execute() { | ||||
| #ifdef USE_LIBSNDFILE | |||||
| if (m_File) { | |||||
| for (int n=0; n<m_HostInfo->BUFSIZE; n++) { | |||||
| bool FinTrig = false; | |||||
| float CVPitch = GetInput(0, n)*10.0f; | |||||
| if (GetInput (1, n) > 0) m_Mode = PLAYM; | |||||
| if (GetInput (2, n) > 0) { | |||||
| m_Mode = STOPM; | |||||
| m_Pos = 0; | |||||
| m_GlobalPos = 0; | |||||
| m_StreamPos = 0; | |||||
| } | |||||
| bool DoLoadChunk = false; | |||||
| if (m_Pos<0) { | |||||
| m_Pos = m_SampleSize - 1; | |||||
| m_StreamPos -= m_SampleSize; | |||||
| FinTrig = m_StreamPos < 0; | |||||
| if (FinTrig) { | |||||
| m_StreamPos = m_FileInfo.frames - m_SampleSize; | |||||
| m_GlobalPos = m_StreamPos; | |||||
| } | |||||
| DoLoadChunk = true; | |||||
| } | |||||
| else if (m_Pos >= m_SampleSize) { | |||||
| m_Pos = 0; | |||||
| m_StreamPos += m_SampleSize; | |||||
| FinTrig = m_StreamPos >= m_FileInfo.frames; | |||||
| if (FinTrig) { | |||||
| m_StreamPos = 0; | |||||
| m_GlobalPos = 0; | |||||
| } | |||||
| DoLoadChunk = true; | |||||
| } | |||||
| if (DoLoadChunk) { | |||||
| if ((m_FileInfo.frames - m_StreamPos) < 256) | |||||
| m_SampleSize = m_FileInfo.frames - m_StreamPos; | |||||
| else | |||||
| m_SampleSize = 256; | |||||
| if (sf_seek(m_File, m_StreamPos, SEEK_SET)==-1) | |||||
| { | |||||
| cerr<<"StreamPlugin: File ["<<m_GUIArgs.FileName<<"] Seek error"<<endl; | |||||
| } | |||||
| float *TempBuf = new float[m_SampleSize * m_FileInfo.channels]; | |||||
| int ChunkSize = 0; | |||||
| ChunkSize = (int)sf_read_float(m_File, TempBuf, m_SampleSize*m_FileInfo.channels); | |||||
| if ((m_SampleSize*m_FileInfo.channels)!=ChunkSize) | |||||
| { | |||||
| cerr<<"StreamPlugin: Only recieved "<<ChunkSize<<" of "<<m_SampleSize<<": Read chunk error"<<endl; | |||||
| } else { | |||||
| // Extract and scale samples to float range +/-1.0 | |||||
| for (int n=0; n<m_SampleSize; n++) | |||||
| { | |||||
| m_SampleL.Set(n,TempBuf[n*m_FileInfo.channels]); | |||||
| if (m_FileInfo.channels>1) | |||||
| m_SampleR.Set(n,TempBuf[n*m_FileInfo.channels+1]); | |||||
| } | |||||
| } | |||||
| delete[] TempBuf; | |||||
| } | |||||
| if (FinTrig) SetOutput (2, n, 1); | |||||
| else SetOutput (2, n, 0); | |||||
| if (m_Mode==PLAYM) { | |||||
| SetOutput (0, n, m_SampleL[m_Pos] * m_GUIArgs.Volume); | |||||
| SetOutput (1, n, m_SampleR[m_Pos] * m_GUIArgs.Volume); | |||||
| m_Pos += m_GUIArgs.PitchMod + CVPitch; | |||||
| m_GlobalPos += m_GUIArgs.PitchMod + CVPitch; | |||||
| } | |||||
| else { | |||||
| SetOutput (0, n, 0); | |||||
| SetOutput (1, n, 0); | |||||
| } | |||||
| } | |||||
| m_GUIArgs.TimeOut = m_GlobalPos / (float)m_SampleRate; | |||||
| m_GUIArgs.PlayOut = m_Mode==PLAYM; | |||||
| } | |||||
| #else | |||||
| if (m_File.IsOpen()) { | if (m_File.IsOpen()) { | ||||
| for (int n=0; n<m_HostInfo->BUFSIZE; n++) { | for (int n=0; n<m_HostInfo->BUFSIZE; n++) { | ||||
| bool FinTrig = false; | bool FinTrig = false; | ||||
| @@ -214,7 +113,8 @@ void StreamPlugin::Execute() { | |||||
| m_GlobalPos = 0; | m_GlobalPos = 0; | ||||
| m_StreamPos = 0; | m_StreamPos = 0; | ||||
| } | } | ||||
| if (m_Pos<0) { | |||||
| if (m_Pos<0) { | |||||
| m_Pos = m_SampleSize - 1; | m_Pos = m_SampleSize - 1; | ||||
| m_StreamPos -= m_SampleSize; | m_StreamPos -= m_SampleSize; | ||||
| FinTrig = m_StreamPos < 0; | FinTrig = m_StreamPos < 0; | ||||
| @@ -223,6 +123,12 @@ void StreamPlugin::Execute() { | |||||
| m_GlobalPos = m_StreamPos; | m_GlobalPos = m_StreamPos; | ||||
| } | } | ||||
| m_File.SeekToChunk (m_StreamPos); | m_File.SeekToChunk (m_StreamPos); | ||||
| if ((m_File.GetSize() - m_StreamPos) < 256) | |||||
| m_SampleSize = m_File.GetSize() - m_StreamPos; | |||||
| else | |||||
| m_SampleSize = 256; | |||||
| m_File.LoadChunk (m_SampleSize, m_SampleL, m_SampleR); | m_File.LoadChunk (m_SampleSize, m_SampleL, m_SampleR); | ||||
| } | } | ||||
| else if (m_Pos >= m_SampleSize) { | else if (m_Pos >= m_SampleSize) { | ||||
| @@ -234,8 +140,15 @@ void StreamPlugin::Execute() { | |||||
| m_GlobalPos = 0; | m_GlobalPos = 0; | ||||
| } | } | ||||
| m_File.SeekToChunk (m_StreamPos); | m_File.SeekToChunk (m_StreamPos); | ||||
| if ((m_File.GetSize() - m_StreamPos) < 256) | |||||
| m_SampleSize = m_File.GetSize() - m_StreamPos; | |||||
| else | |||||
| m_SampleSize = 256; | |||||
| m_File.LoadChunk (m_SampleSize, m_SampleL, m_SampleR); | m_File.LoadChunk (m_SampleSize, m_SampleL, m_SampleR); | ||||
| } | } | ||||
| if (FinTrig) SetOutput (2, n, 1); | if (FinTrig) SetOutput (2, n, 1); | ||||
| else SetOutput (2, n, 0); | else SetOutput (2, n, 0); | ||||
| if (m_Mode==PLAYM) { | if (m_Mode==PLAYM) { | ||||
| @@ -252,7 +165,6 @@ void StreamPlugin::Execute() { | |||||
| m_GUIArgs.TimeOut = m_GlobalPos / (float)m_SampleRate; | m_GUIArgs.TimeOut = m_GlobalPos / (float)m_SampleRate; | ||||
| m_GUIArgs.PlayOut = m_Mode==PLAYM; | m_GUIArgs.PlayOut = m_Mode==PLAYM; | ||||
| } | } | ||||
| #endif | |||||
| } | } | ||||
| void StreamPlugin::ExecuteCommands() { | void StreamPlugin::ExecuteCommands() { | ||||
| @@ -287,59 +199,28 @@ void StreamPlugin::SetTime (void) { | |||||
| void StreamPlugin::OpenStream (void) { | void StreamPlugin::OpenStream (void) { | ||||
| m_StreamPos = 0; | m_StreamPos = 0; | ||||
| m_GlobalPos = 0; | m_GlobalPos = 0; | ||||
| #ifdef USE_LIBSNDFILE | |||||
| m_FileInfo.format = 0; | |||||
| if (m_File != NULL) | |||||
| { | |||||
| sf_close(m_File); | |||||
| m_File = NULL; | |||||
| } | |||||
| m_File = sf_open (m_GUIArgs.FileName, SFM_READ, &m_FileInfo); | |||||
| if (m_File == NULL) | |||||
| { | |||||
| cerr<<"StreamPlugin: File ["<<m_GUIArgs.FileName<<"] does not exist"<<endl; | |||||
| return; | |||||
| } | |||||
| if (m_File.IsOpen ()) m_File.Close (); | |||||
| m_File.Open (m_GUIArgs.FileName, WavFile::READ); | |||||
| if (m_FileInfo.frames < 256) | |||||
| m_SampleSize = m_FileInfo.frames; | |||||
| if (m_File.GetSize() < 256) | |||||
| m_SampleSize = m_File.GetSize(); | |||||
| else | else | ||||
| m_SampleSize = 256; | m_SampleSize = 256; | ||||
| m_SampleL.Allocate (m_SampleSize); | m_SampleL.Allocate (m_SampleSize); | ||||
| m_SampleR.Allocate (m_SampleSize); | m_SampleR.Allocate (m_SampleSize); | ||||
| m_Pitch = m_FileInfo.samplerate / (float)m_HostInfo->SAMPLERATE; | |||||
| if (m_FileInfo.channels>1) { | |||||
| m_Pitch *= 2; | |||||
| m_GUIArgs.MaxTime = GetLength(); | |||||
| } | |||||
| else m_GUIArgs.MaxTime = GetLength() / 2; | |||||
| #else | |||||
| if (m_File.IsOpen ()) m_File.Close (); | |||||
| m_File.Open (m_GUIArgs.FileName, WavFile::READ); | |||||
| m_SampleL.Allocate (m_SampleSize); | |||||
| m_SampleR.Allocate (m_SampleSize); | |||||
| m_Pitch = m_SampleRate / (float)m_HostInfo->SAMPLERATE; | m_Pitch = m_SampleRate / (float)m_HostInfo->SAMPLERATE; | ||||
| if (m_File.IsStereo ()) { | if (m_File.IsStereo ()) { | ||||
| m_Pitch *= 2; | m_Pitch *= 2; | ||||
| m_GUIArgs.MaxTime = GetLength(); | m_GUIArgs.MaxTime = GetLength(); | ||||
| } | } | ||||
| else m_GUIArgs.MaxTime = GetLength() / 2; | else m_GUIArgs.MaxTime = GetLength() / 2; | ||||
| #endif | |||||
| } | } | ||||
| float StreamPlugin::GetLength (void) { | float StreamPlugin::GetLength (void) { | ||||
| #ifdef USE_LIBSNDFILE | |||||
| if (m_FileInfo.channels>1) return m_FileInfo.frames / (float)m_FileInfo.samplerate; | |||||
| else return m_FileInfo.frames / (float)m_FileInfo.samplerate * 2; | |||||
| #else | |||||
| if (m_File.IsStereo()) return m_File.GetSize() / (float)m_File.GetSamplerate (); | if (m_File.IsStereo()) return m_File.GetSize() / (float)m_File.GetSamplerate (); | ||||
| else return m_File.GetSize() / (float)m_File.GetSamplerate () * 2; | else return m_File.GetSize() / (float)m_File.GetSamplerate () * 2; | ||||
| #endif | |||||
| } | } | ||||
| void StreamPlugin::StreamOut (ostream &s) { | void StreamPlugin::StreamOut (ostream &s) { | ||||
| @@ -20,12 +20,6 @@ | |||||
| #include "../../RiffWav.h" | #include "../../RiffWav.h" | ||||
| #include <FL/Fl_Pixmap.H> | #include <FL/Fl_Pixmap.H> | ||||
| #include "../../../config.h" | |||||
| #ifdef USE_LIBSNDFILE | |||||
| #include <sndfile.h> | |||||
| #endif | |||||
| #ifndef StreamPLUGIN | #ifndef StreamPLUGIN | ||||
| #define StreamPLUGIN | #define StreamPLUGIN | ||||
| @@ -45,12 +39,7 @@ class StreamPlugin : public SpiralPlugin { | |||||
| float GetVolume (void) { return m_GUIArgs.Volume; } | float GetVolume (void) { return m_GUIArgs.Volume; } | ||||
| float GetPitch (void) { return m_GUIArgs.PitchMod; } | float GetPitch (void) { return m_GUIArgs.PitchMod; } | ||||
| private: | private: | ||||
| #ifdef USE_LIBSNDFILE | |||||
| SNDFILE *m_File; | |||||
| SF_INFO m_FileInfo; | |||||
| #else | |||||
| WavFile m_File; | WavFile m_File; | ||||
| #endif | |||||
| Sample m_SampleL, m_SampleR; | Sample m_SampleL, m_SampleR; | ||||
| int m_SampleRate, m_SampleSize, m_StreamPos; | int m_SampleRate, m_SampleSize, m_StreamPos; | ||||
| float m_GlobalPos, m_Pitch, m_SamplePos, m_Pos; | float m_GlobalPos, m_Pitch, m_SamplePos, m_Pos; | ||||
| @@ -31,6 +31,7 @@ | |||||
| using namespace std; | using namespace std; | ||||
| #ifndef USE_LIBSNDFILE | |||||
| const int HEADERLEN = (4+24+8); | const int HEADERLEN = (4+24+8); | ||||
| #if __BYTE_ORDER == BIG_ENDIAN | #if __BYTE_ORDER == BIG_ENDIAN | ||||
| @@ -87,9 +88,59 @@ static void write_float_as_32bit_float(float v, FILE *file) | |||||
| SWAPFLOAT(v); | SWAPFLOAT(v); | ||||
| fwrite(((char*) &v),4,1,file); | fwrite(((char*) &v),4,1,file); | ||||
| } | } | ||||
| #endif | |||||
| int WavFile::Open(string FileName, Mode mode, Channels channels) | int WavFile::Open(string FileName, Mode mode, Channels channels) | ||||
| { | { | ||||
| #ifdef USE_LIBSNDFILE | |||||
| if (m_FileHandle!=NULL) | |||||
| { | |||||
| cerr<<"WavFile: File already open ["<<FileName<<"]"<<endl; | |||||
| return 0; | |||||
| } | |||||
| if (mode==WRITE) { | |||||
| if (channels==STEREO) | |||||
| m_FileInfo.channels = 2; | |||||
| else | |||||
| m_FileInfo.channels = 1; | |||||
| switch (m_BitsPerSample) { | |||||
| case 8 : | |||||
| m_FileInfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_S8; | |||||
| break; | |||||
| case 16 : | |||||
| m_FileInfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16; | |||||
| break; | |||||
| case 24 : | |||||
| m_FileInfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_24; | |||||
| break; | |||||
| case 32 : | |||||
| m_FileInfo.format = SF_FORMAT_WAV | SF_FORMAT_FLOAT; | |||||
| break; | |||||
| default : | |||||
| m_FileInfo.format = SF_FORMAT_WAV | SF_FORMAT_PCM_16; | |||||
| } | |||||
| } else | |||||
| m_FileInfo.format = 0; | |||||
| m_FileHandle = sf_open (FileName.c_str(), (mode==WRITE)?SFM_WRITE:SFM_READ, &m_FileInfo); | |||||
| if (mode==WRITE)//auto-update header on write so everything written before is valid even in case of unexpected crash/close | |||||
| sf_command (m_FileHandle, SFC_SET_UPDATE_HEADER_AUTO, NULL, SF_TRUE) ; | |||||
| if (m_FileHandle == NULL) | |||||
| { | |||||
| cerr<<"WavFile: File ["<<FileName<<"] does not exist"<<endl; | |||||
| return 0; | |||||
| } | |||||
| return 1; | |||||
| #else | |||||
| if (m_Stream!=NULL) | if (m_Stream!=NULL) | ||||
| { | { | ||||
| cerr<<"WavFile: File already open ["<<FileName<<"]"<<endl; | cerr<<"WavFile: File already open ["<<FileName<<"]"<<endl; | ||||
| @@ -245,10 +296,22 @@ int WavFile::Open(string FileName, Mode mode, Channels channels) | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| return 0; | return 0; | ||||
| #endif | |||||
| } | } | ||||
| int WavFile::Close() | int WavFile::Close() | ||||
| { | { | ||||
| #ifdef USE_LIBSNDFILE | |||||
| if (m_FileHandle==NULL) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| sf_close(m_FileHandle); | |||||
| m_FileHandle=NULL; | |||||
| return 1; | |||||
| #else | |||||
| if (m_Stream==NULL) | if (m_Stream==NULL) | ||||
| { | { | ||||
| return 0; | return 0; | ||||
| @@ -261,10 +324,25 @@ int WavFile::Close() | |||||
| m_Stream=NULL; | m_Stream=NULL; | ||||
| return 1; | return 1; | ||||
| #endif | |||||
| } | } | ||||
| int WavFile::Save(Sample &data) | int WavFile::Save(Sample &data) | ||||
| { | { | ||||
| #ifdef USE_LIBSNDFILE | |||||
| if (m_FileHandle==NULL || data.GetLength()==0) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| if (sf_writef_float(m_FileHandle, data.GetNonConstBuffer(), data.GetLength()) != data.GetLength()) | |||||
| { | |||||
| cerr<<"WavFile: an error occured writing to the file"<<endl; | |||||
| return 0; | |||||
| } | |||||
| return 1; | |||||
| #else | |||||
| if (m_Stream==NULL || data.GetLength()==0) | if (m_Stream==NULL || data.GetLength()==0) | ||||
| { | { | ||||
| return 0; | return 0; | ||||
| @@ -296,10 +374,24 @@ int WavFile::Save(Sample &data) | |||||
| m_DataHeader.DataLengthBytes+=data.GetLength()*(WavFile::m_BitsPerSample/8); | m_DataHeader.DataLengthBytes+=data.GetLength()*(WavFile::m_BitsPerSample/8); | ||||
| return 1; | return 1; | ||||
| #endif | |||||
| } | } | ||||
| int WavFile::Save(short *data, int Bytes) | int WavFile::Save(short *data, int Bytes) | ||||
| { | { | ||||
| #ifdef USE_LIBSNDFILE | |||||
| if (m_FileHandle==NULL || data==NULL) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| sf_write_short(m_FileHandle, data, Bytes*m_FileInfo.channels/2); | |||||
| sf_close(m_FileHandle); | |||||
| m_FileHandle = NULL; | |||||
| return 1; | |||||
| #else | |||||
| if (m_Stream==NULL || data==NULL) | if (m_Stream==NULL || data==NULL) | ||||
| { | { | ||||
| return 0; | return 0; | ||||
| @@ -308,10 +400,46 @@ int WavFile::Save(short *data, int Bytes) | |||||
| m_DataHeader.DataLengthBytes+=Bytes; | m_DataHeader.DataLengthBytes+=Bytes; | ||||
| fwrite(data,sizeof(data),Bytes/4,m_Stream); | fwrite(data,sizeof(data),Bytes/4,m_Stream); | ||||
| return 1; | return 1; | ||||
| #endif | |||||
| } | } | ||||
| int WavFile::Save(float *left, float *right, int Length) | int WavFile::Save(float *left, float *right, int Length) | ||||
| { | { | ||||
| #ifdef USE_LIBSNDFILE | |||||
| if (m_FileHandle==NULL || left==NULL || right==NULL) | |||||
| { | |||||
| return 0; | |||||
| } | |||||
| if (IsStereo())// Interleave the channels into buffer and write | |||||
| { | |||||
| float *TempBuf = new float[Length*2]; | |||||
| for (int n=0; n<Length; n++) | |||||
| { | |||||
| TempBuf[(n*2)] = left[n]; | |||||
| TempBuf[(n*2)+1] = right[n]; | |||||
| } | |||||
| sf_write_float(m_FileHandle, TempBuf, Length*2); | |||||
| delete[] TempBuf; | |||||
| } | |||||
| else // mix the channels into a mono buffer and then write | |||||
| { | |||||
| float *TempBuf = new float[Length]; | |||||
| for (int n=0; n<Length; n++) | |||||
| { | |||||
| TempBuf[n] = left[n]; | |||||
| TempBuf[n] += right[n]; | |||||
| TempBuf[n]/=2; | |||||
| } | |||||
| sf_write_float(m_FileHandle, TempBuf, Length); | |||||
| delete[] TempBuf; | |||||
| } | |||||
| return 1; | |||||
| #else | |||||
| if (m_Stream==NULL || left==NULL || right==NULL) | if (m_Stream==NULL || left==NULL || right==NULL) | ||||
| { | { | ||||
| return 0; | return 0; | ||||
| @@ -347,8 +475,10 @@ int WavFile::Save(float *left, float *right, int Length) | |||||
| m_DataHeader.DataLengthBytes+=Length*2*(WavFile::m_BitsPerSample/8); | m_DataHeader.DataLengthBytes+=Length*2*(WavFile::m_BitsPerSample/8); | ||||
| return 1; | return 1; | ||||
| #endif | |||||
| } | } | ||||
| #ifndef USE_LIBSNDFILE | |||||
| int WavFile::GetSize() | int WavFile::GetSize() | ||||
| { | { | ||||
| int Bps = m_Header.FmtBitsPerSample/8; | int Bps = m_Header.FmtBitsPerSample/8; | ||||
| @@ -368,9 +498,55 @@ int WavFile::GetSize() | |||||
| return ret; | return ret; | ||||
| } | } | ||||
| #endif | |||||
| int WavFile::Load(Sample &data) | int WavFile::Load(Sample &data) | ||||
| { | { | ||||
| #ifdef USE_LIBSNDFILE | |||||
| if (m_FileInfo.channels>1) // mix the channels into a mono buffer | |||||
| { | |||||
| #ifdef TRACE_OUT | |||||
| cerr<<"WavFile::Load - Channels = "<<m_FileInfo.channels<< | |||||
| " Mixing down to mono..."<<endl; | |||||
| #endif | |||||
| float *TempBuf = new float[GetSize()*m_FileInfo.channels]; | |||||
| if (GetSize()*m_FileInfo.channels!= sf_read_float(m_FileHandle, TempBuf, GetSize()*m_FileInfo.channels)) | |||||
| { | |||||
| cerr<<"WavFile: Read error"<<endl; | |||||
| return 0; | |||||
| } | |||||
| for (int n=0; n<GetSize(); n++) | |||||
| { | |||||
| float value=0; | |||||
| for (int i=0; i<m_FileInfo.channels; i++) | |||||
| value += TempBuf[(n*m_FileInfo.channels)+i]; | |||||
| value/=m_FileInfo.channels; | |||||
| data.Set(n,value); | |||||
| } | |||||
| delete[] TempBuf; | |||||
| } | |||||
| else // it's mono. | |||||
| { | |||||
| float *TempBuf = new float[GetSize()]; | |||||
| if (GetSize()!= sf_read_float(m_FileHandle, TempBuf, GetSize())) | |||||
| { | |||||
| cerr<<"WavFile: Read error"<<endl; | |||||
| return 0; | |||||
| } | |||||
| for (int n=0; n<GetSize(); n++) | |||||
| data.Set(n,TempBuf[n]); | |||||
| delete[] TempBuf; | |||||
| } | |||||
| return 1; | |||||
| #else | |||||
| if (m_Header.FmtChannels>1) // mix the channels into a mono buffer | if (m_Header.FmtChannels>1) // mix the channels into a mono buffer | ||||
| { | { | ||||
| #ifdef TRACE_OUT | #ifdef TRACE_OUT | ||||
| @@ -425,10 +601,50 @@ int WavFile::Load(Sample &data) | |||||
| } | } | ||||
| return 1; | return 1; | ||||
| #endif | |||||
| } | } | ||||
| int WavFile::Load(short *data) | int WavFile::Load(short *data) | ||||
| { | { | ||||
| #ifdef USE_LIBSNDFILE | |||||
| if (m_FileInfo.channels>1) // mix the channels into a mono buffer | |||||
| { | |||||
| #ifdef TRACE_OUT | |||||
| cerr<<"WavFile::Load - Channels = "<<m_FileInfo.channels<< | |||||
| " Mixing down to mono..."<<endl; | |||||
| #endif | |||||
| short *TempBuf = new short[GetSize()*m_FileInfo.channels]; | |||||
| if (GetSize()*m_FileInfo.channels!= sf_read_short(m_FileHandle, TempBuf, GetSize()*m_FileInfo.channels)) | |||||
| { | |||||
| cerr<<"WavFile: Read error"<<endl; | |||||
| return 0; | |||||
| } | |||||
| for (int n=0; n<GetSize(); n++) | |||||
| { | |||||
| float value=0; | |||||
| for (int i=0; i<m_FileInfo.channels; i++) | |||||
| value += TempBuf[(n*m_FileInfo.channels)+i]; | |||||
| value/=m_FileInfo.channels; | |||||
| data[n] = (short)value/SHRT_MAX; | |||||
| } | |||||
| delete[] TempBuf; | |||||
| } | |||||
| else // we can read the data directly in, it's mono. | |||||
| { | |||||
| if (GetSize()!= sf_read_short(m_FileHandle, data, GetSize())) | |||||
| { | |||||
| cerr<<"WavFile: Read error"<<endl; | |||||
| return 0; | |||||
| } | |||||
| } | |||||
| return 0; | |||||
| #else | |||||
| if (m_Header.FmtChannels>1) // mix the channels into a mono buffer | if (m_Header.FmtChannels>1) // mix the channels into a mono buffer | ||||
| { | { | ||||
| #ifdef TRACE_OUT | #ifdef TRACE_OUT | ||||
| @@ -480,10 +696,23 @@ int WavFile::Load(short *data) | |||||
| } | } | ||||
| return 0; | return 0; | ||||
| #endif | |||||
| } | } | ||||
| int WavFile::SeekToChunk(int Pos) | int WavFile::SeekToChunk(int Pos) | ||||
| { | { | ||||
| #ifdef USE_LIBSNDFILE | |||||
| if (m_CurSeekPos==Pos) return 0; | |||||
| m_CurSeekPos=Pos; | |||||
| if (sf_seek(m_FileHandle, m_CurSeekPos, SEEK_SET)==-1) | |||||
| { | |||||
| cerr<<"WavFile::SeekToChunk: Seek error"<<endl; | |||||
| return 0; | |||||
| } | |||||
| return 1; | |||||
| #else | |||||
| Pos *= 2 * m_Header.FmtChannels; | Pos *= 2 * m_Header.FmtChannels; | ||||
| if (m_CurSeekPos==m_DataStart+Pos) return 1; | if (m_CurSeekPos==m_DataStart+Pos) return 1; | ||||
| @@ -498,10 +727,37 @@ int WavFile::SeekToChunk(int Pos) | |||||
| } | } | ||||
| return 1; | return 1; | ||||
| #endif | |||||
| } | } | ||||
| int WavFile::LoadChunk(int NumSamples, Sample &ldata, Sample &rdata) | int WavFile::LoadChunk(int NumSamples, Sample &ldata, Sample &rdata) | ||||
| { | { | ||||
| #ifdef USE_LIBSNDFILE | |||||
| float *TempBuf = new float[NumSamples * m_FileInfo.channels]; | |||||
| int ChunkSize = 0; | |||||
| ChunkSize = (int)sf_read_float(m_FileHandle, TempBuf, NumSamples*m_FileInfo.channels); | |||||
| if ((NumSamples*m_FileInfo.channels)!=ChunkSize) | |||||
| { | |||||
| cerr<<"WavFile: Only recieved "<<ChunkSize<<" of "<<NumSamples<<": Read chunk error"<<endl; | |||||
| delete[] TempBuf; | |||||
| return 0; | |||||
| } else { | |||||
| // Extract and scale samples to float range +/-1.0 | |||||
| for (int n=0; n<NumSamples; n++) | |||||
| { | |||||
| ldata.Set(n,TempBuf[n*m_FileInfo.channels]); | |||||
| if (m_FileInfo.channels>1) | |||||
| rdata.Set(n,TempBuf[n*m_FileInfo.channels+1]); | |||||
| } | |||||
| } | |||||
| delete[] TempBuf; | |||||
| return 1; | |||||
| #else | |||||
| int c = m_Header.FmtChannels; | int c = m_Header.FmtChannels; | ||||
| int SizeBytes = NumSamples * 2 * c; // 2 bytes per sample per channel | int SizeBytes = NumSamples * 2 * c; // 2 bytes per sample per channel | ||||
| short *TempBuf = new short[NumSamples * c]; | short *TempBuf = new short[NumSamples * c]; | ||||
| @@ -533,4 +789,5 @@ int WavFile::LoadChunk(int NumSamples, Sample &ldata, Sample &rdata) | |||||
| delete[] TempBuf; | delete[] TempBuf; | ||||
| return 1; | return 1; | ||||
| #endif | |||||
| } | } | ||||
| @@ -16,14 +16,21 @@ | |||||
| * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||||
| */ | */ | ||||
| #include <string> | |||||
| #ifndef WAVFILE | #ifndef WAVFILE | ||||
| #define WAVFILE | #define WAVFILE | ||||
| #include <string> | |||||
| #include <stdio.h> | #include <stdio.h> | ||||
| #include "Sample.h" | #include "Sample.h" | ||||
| #include "../config.h" | |||||
| #ifdef USE_LIBSNDFILE | |||||
| #include <sndfile.h> | |||||
| #endif | |||||
| #ifndef USE_LIBSNDFILE | |||||
| #if __APPLE__ | #if __APPLE__ | ||||
| // this is the traditional way of setting 2 bytes alignment | // this is the traditional way of setting 2 bytes alignment | ||||
| // else the apple compiler might use 4, or even 8 | // else the apple compiler might use 4, or even 8 | ||||
| @@ -55,38 +62,68 @@ struct DataHeader | |||||
| #if __APPLE__ | #if __APPLE__ | ||||
| #pragma options align=reset | #pragma options align=reset | ||||
| #endif | #endif | ||||
| #endif | |||||
| class WavFile | class WavFile | ||||
| { | { | ||||
| public: | public: | ||||
| #ifdef USE_LIBSNDFILE | |||||
| WavFile() : m_FileHandle(NULL), m_BitsPerSample(16), m_CurSeekPos(0) {m_FileInfo.samplerate = 44100; m_FileInfo.format = 0;} | |||||
| #else | |||||
| WavFile() : m_Stream(NULL), m_Samplerate(44100), m_BitsPerSample(16), m_DataStart(0) {} | WavFile() : m_Stream(NULL), m_Samplerate(44100), m_BitsPerSample(16), m_DataStart(0) {} | ||||
| #endif | |||||
| ~WavFile() {Close();} | ~WavFile() {Close();} | ||||
| enum Mode{READ,WRITE}; | enum Mode{READ,WRITE}; | ||||
| enum Channels{MONO,STEREO}; | enum Channels{MONO,STEREO}; | ||||
| int Open(std::string FileName, Mode mode, Channels channels=MONO); | |||||
| int Open(std::string FileName, Mode mode=READ, Channels channels=MONO); | |||||
| int Close(); | int Close(); | ||||
| int Save(Sample &data); | int Save(Sample &data); | ||||
| int Load(Sample &data); | |||||
| int Save(short *data, int Bytes); | int Save(short *data, int Bytes); | ||||
| int Load(short *data); | |||||
| int Save(float *left, float *right, int Length); | int Save(float *left, float *right, int Length); | ||||
| int Load(Sample &data); | |||||
| int Load(short *data); | |||||
| int SeekToChunk(int Pos); | int SeekToChunk(int Pos); | ||||
| int LoadChunk(int NumSamples, Sample &ldata, Sample &rdata); | int LoadChunk(int NumSamples, Sample &ldata, Sample &rdata); | ||||
| #ifdef USE_LIBSNDFILE | |||||
| int GetSize() {return m_FileInfo.frames;} // in samples | |||||
| void SetSamplerate(int s) { m_FileInfo.samplerate=s; } | |||||
| int GetSamplerate() { return m_FileInfo.samplerate; } | |||||
| void SetBitsPerSample(int s) { m_BitsPerSample=s; } | |||||
| int GetBitsPerSample() { return m_BitsPerSample; } | |||||
| bool IsStereo() { return (m_FileInfo.channels > 1); } | |||||
| bool IsOpen() { return m_FileHandle!=NULL; } | |||||
| bool Recording() {return (m_FileHandle!=NULL);} | |||||
| #else | |||||
| int GetSize(); // in samples | int GetSize(); // in samples | ||||
| bool Recording() {return (m_Stream!=NULL);} | |||||
| void SetSamplerate(int s) { m_Samplerate=s; } | void SetSamplerate(int s) { m_Samplerate=s; } | ||||
| int GetSamplerate() { return m_Header.FmtSamplerate; } | int GetSamplerate() { return m_Header.FmtSamplerate; } | ||||
| void SetBitsPerSample(int s) { m_BitsPerSample=s; } | void SetBitsPerSample(int s) { m_BitsPerSample=s; } | ||||
| int GetBitsPerSample() { return m_Header.FmtBitsPerSample; } | int GetBitsPerSample() { return m_Header.FmtBitsPerSample; } | ||||
| bool IsStereo() { return (m_Header.FmtChannels==2); } | bool IsStereo() { return (m_Header.FmtChannels==2); } | ||||
| bool IsOpen() { return m_Stream!=NULL; } | bool IsOpen() { return m_Stream!=NULL; } | ||||
| bool Recording() {return (m_Stream!=NULL);} | |||||
| #endif | |||||
| private: | private: | ||||
| #ifdef USE_LIBSNDFILE | |||||
| SNDFILE *m_FileHandle; | |||||
| SF_INFO m_FileInfo; | |||||
| int m_BitsPerSample; | |||||
| sf_count_t m_CurSeekPos; | |||||
| #else | |||||
| FILE *m_Stream; | FILE *m_Stream; | ||||
| int m_Samplerate; | int m_Samplerate; | ||||
| int m_BitsPerSample; | int m_BitsPerSample; | ||||
| @@ -96,6 +133,7 @@ private: | |||||
| CanonicalWavHeader m_Header; | CanonicalWavHeader m_Header; | ||||
| DataHeader m_DataHeader; | DataHeader m_DataHeader; | ||||
| #endif | |||||
| }; | }; | ||||
| #endif | #endif | ||||