and removed references to RiffWav in plugins that don't use it.master
| @@ -110,9 +110,8 @@ SpiralGUIType *DiskWriterPlugin::CreateGUI() | |||
| void DiskWriterPlugin::Execute() | |||
| { | |||
| int Bps = m_GUIArgs.BitsPerSample/8; | |||
| if(m_Recording && m_Wav.IsOpen()) | |||
| { | |||
| { | |||
| int on=0; | |||
| float LeftBuffer[host->BUFSIZE], RightBuffer[host->BUFSIZE]; | |||
| @@ -123,9 +122,8 @@ void DiskWriterPlugin::Execute() | |||
| 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() | |||
| @@ -11,7 +11,7 @@ CXXFLAGS= @CXXFLAGS@ | |||
| INCPATH = -I/usr/X11R6/include | |||
| LINK = g++ -shared | |||
| LFLAGS = | |||
| LIBS = @FLTK_LIBS@ | |||
| LIBS = @FLTK_LIBS@ @SFLIBS@ | |||
| MOC = moc | |||
| UIC = | |||
| @@ -17,7 +17,6 @@ | |||
| */ | |||
| #include "../SpiralPlugin.h" | |||
| #include "../../RiffWav.h" | |||
| #include <FL/Fl_Pixmap.H> | |||
| #include <jack/jack.h> | |||
| @@ -4,7 +4,6 @@ HEADERS = ../SpiralPlugin.h \ | |||
| ../Widgets/Fl_DragBar.H \ | |||
| ../Widgets/Fl_LED_Button.H \ | |||
| ../../Sample.h \ | |||
| ../../RiffWav.h \ | |||
| JackPlugin.h \ | |||
| JackPluginGUI.h | |||
| @@ -14,7 +13,6 @@ SOURCES = ../SpiralPlugin.C \ | |||
| ../Widgets/Fl_DragBar.cxx \ | |||
| ../Widgets/Fl_LED_Button.cxx \ | |||
| ../../Sample.C \ | |||
| ../../RiffWav.C \ | |||
| JackPlugin.C \ | |||
| JackPluginGUI.C | |||
| @@ -46,7 +46,6 @@ HEADERS = JackPlugin.h \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../../ChannelHandler.h \ | |||
| ../../Sample.h \ | |||
| ../../RiffWav.h \ | |||
| ../Widgets/Fl_Knob.H \ | |||
| ../Widgets/Fl_LED_Button.H \ | |||
| ../../../GUI/Widgets/SpiralGUI.H | |||
| @@ -56,7 +55,6 @@ SOURCES = JackPlugin.C \ | |||
| ../SpiralPluginGUI.C \ | |||
| ../../ChannelHandler.C \ | |||
| ../../Sample.C \ | |||
| ../../RiffWav.C \ | |||
| ../Widgets/Fl_Knob.cxx \ | |||
| ../Widgets/Fl_LED_Button.cxx \ | |||
| ../../../GUI/Widgets/SpiralGUI.C | |||
| @@ -66,7 +64,6 @@ OBJECTS = JackPlugin.o \ | |||
| ../SpiralPluginGUI.o \ | |||
| ../../ChannelHandler.o \ | |||
| ../../Sample.o \ | |||
| ../../RiffWav.o \ | |||
| ../Widgets/Fl_Knob.o \ | |||
| ../Widgets/Fl_LED_Button.o \ | |||
| ../../../GUI/Widgets/SpiralGUI.o | |||
| @@ -152,17 +149,12 @@ install: | |||
| ../../Sample.o: ../../Sample.C \ | |||
| ../../Sample.h | |||
| ../../RiffWav.o: ../../RiffWav.C \ | |||
| ../../RiffWav.h \ | |||
| ../../Sample.h | |||
| JackPlugin.o: JackPlugin.C \ | |||
| JackPlugin.h \ | |||
| JackPluginGUI.h \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../SpiralPlugin.h \ | |||
| ../../Sample.h \ | |||
| ../../RiffWav.h \ | |||
| SpiralIcon.xpm | |||
| JackPluginGUI.o: JackPluginGUI.C \ | |||
| @@ -171,7 +163,6 @@ JackPluginGUI.o: JackPluginGUI.C \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../SpiralPlugin.h \ | |||
| ../../Sample.h \ | |||
| ../../RiffWav.h \ | |||
| ../Widgets/Fl_Knob.H \ | |||
| ../Widgets/Fl_LED_Button.H \ | |||
| ../../../GUI/Widgets/SpiralGUI.H | |||
| @@ -3,7 +3,6 @@ HEADERS = ../SpiralPlugin.h \ | |||
| ../Widgets/Fl_Knob.H \ | |||
| ../Widgets/Fl_DragBar.H \ | |||
| ../../Sample.h \ | |||
| ../../RiffWav.h \ | |||
| JoystickPlugin.h \ | |||
| JoystickPluginGUI.h | |||
| @@ -12,7 +11,6 @@ SOURCES = ../SpiralPlugin.C \ | |||
| ../Widgets/Fl_Knob.cxx \ | |||
| ../Widgets/Fl_DragBar.cxx \ | |||
| ../../Sample.C \ | |||
| ../../RiffWav.C \ | |||
| JoystickPlugin.C \ | |||
| JoystickPluginGUI.C | |||
| @@ -154,7 +154,6 @@ MatrixPlugin.o: MatrixPlugin.C \ | |||
| ../SpiralPlugin.h \ | |||
| ../../Sample.h \ | |||
| SpiralIcon.xpm \ | |||
| ../../RiffWav.h \ | |||
| ../../NoteTable.h | |||
| MatrixPluginGUI.o: MatrixPluginGUI.C \ | |||
| @@ -19,7 +19,6 @@ | |||
| #include "MatrixPluginGUI.h" | |||
| #include <FL/Fl_Button.h> | |||
| #include "SpiralIcon.xpm" | |||
| #include "../../RiffWav.h" | |||
| #include "../../NoteTable.h" | |||
| using namespace std; | |||
| @@ -399,56 +399,6 @@ void PoshSamplerPlugin::StreamIn(istream &s) | |||
| 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; | |||
| 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]->LoopEnd=m_SampleVec[n]->GetLength()-1; | |||
| } | |||
| #endif | |||
| } | |||
| void PoshSamplerPlugin::SaveSample(int n, const string &Name) | |||
| @@ -44,7 +44,6 @@ HEADERS = SeqPlugin.h \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../../ChannelHandler.h \ | |||
| ../../Sample.h \ | |||
| ../../RiffWav.h \ | |||
| ../Widgets/Fl_Knob.H \ | |||
| ../Widgets/Fl_EventMap.h \ | |||
| ../Widgets/Fl_SEvent.h \ | |||
| @@ -55,7 +54,6 @@ SOURCES = SeqPlugin.C \ | |||
| ../SpiralPluginGUI.C \ | |||
| ../../ChannelHandler.C \ | |||
| ../../Sample.C \ | |||
| ../../RiffWav.C \ | |||
| ../Widgets/Fl_Knob.cxx \ | |||
| ../Widgets/Fl_EventMap.C \ | |||
| ../Widgets/Fl_SEvent.C \ | |||
| @@ -66,7 +64,6 @@ OBJECTS = SeqPlugin.o \ | |||
| ../SpiralPluginGUI.o \ | |||
| ../../ChannelHandler.o \ | |||
| ../../Sample.o \ | |||
| ../../RiffWav.o \ | |||
| ../Widgets/Fl_Knob.o \ | |||
| ../Widgets/Fl_EventMap.o \ | |||
| ../Widgets/Fl_SEvent.o \ | |||
| @@ -158,10 +155,6 @@ install: | |||
| ../../Sample.o: ../../Sample.C \ | |||
| ../../Sample.h | |||
| ../../RiffWav.o: ../../RiffWav.C \ | |||
| ../../RiffWav.h \ | |||
| ../../Sample.h | |||
| SeqPlugin.o: SeqPlugin.C \ | |||
| SeqPlugin.h \ | |||
| SeqPluginGUI.h \ | |||
| @@ -169,7 +162,6 @@ SeqPlugin.o: SeqPlugin.C \ | |||
| ../SpiralPlugin.h \ | |||
| ../../Sample.h \ | |||
| SpiralIcon.xpm \ | |||
| ../../RiffWav.h \ | |||
| ../../NoteTable.h | |||
| SeqPluginGUI.o: SeqPluginGUI.C \ | |||
| @@ -19,7 +19,6 @@ | |||
| #include "SeqPluginGUI.h" | |||
| #include <FL/Fl_Button.h> | |||
| #include "SpiralIcon.xpm" | |||
| #include "../../RiffWav.h" | |||
| #include "../../NoteTable.h" | |||
| using namespace std; | |||
| @@ -5,7 +5,6 @@ HEADERS = ../SpiralPlugin.h \ | |||
| ../Widgets/Fl_EventMap.h \ | |||
| ../Widgets/Fl_SEvent.h \ | |||
| ../../Sample.h \ | |||
| ../../RiffWav.h \ | |||
| SeqPlugin.h \ | |||
| SeqPluginGUI.h | |||
| @@ -16,7 +15,6 @@ SOURCES = ../SpiralPlugin.C \ | |||
| ../Widgets/Fl_EventMap.C \ | |||
| ../Widgets/Fl_SEvent.C \ | |||
| ../../Sample.C \ | |||
| ../../RiffWav.C \ | |||
| SeqPlugin.C \ | |||
| SeqPluginGUI.C | |||
| @@ -44,7 +44,6 @@ HEADERS = SequencerPlugin.h \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../../ChannelHandler.h \ | |||
| ../../Sample.h \ | |||
| ../../RiffWav.h \ | |||
| ../Widgets/Fl_Knob.H \ | |||
| ../Widgets/Fl_EventMap.h \ | |||
| ../Widgets/Fl_SEvent.h \ | |||
| @@ -55,7 +54,6 @@ SOURCES = SequencerPlugin.C \ | |||
| ../SpiralPluginGUI.C \ | |||
| ../../ChannelHandler.C \ | |||
| ../../Sample.C \ | |||
| ../../RiffWav.C \ | |||
| ../Widgets/Fl_Knob.cxx \ | |||
| ../Widgets/Fl_EventMap.C \ | |||
| ../Widgets/Fl_SEvent.C \ | |||
| @@ -66,7 +64,6 @@ OBJECTS = SequencerPlugin.o \ | |||
| ../SpiralPluginGUI.o \ | |||
| ../../ChannelHandler.o \ | |||
| ../../Sample.o \ | |||
| ../../RiffWav.o \ | |||
| ../Widgets/Fl_Knob.o \ | |||
| ../Widgets/Fl_EventMap.o \ | |||
| ../Widgets/Fl_SEvent.o \ | |||
| @@ -158,17 +155,12 @@ install: | |||
| ../../Sample.o: ../../Sample.C \ | |||
| ../../Sample.h | |||
| ../../RiffWav.o: ../../RiffWav.C \ | |||
| ../../RiffWav.h \ | |||
| ../../Sample.h | |||
| SequencerPlugin.o: SequencerPlugin.C \ | |||
| SequencerPlugin.h \ | |||
| SequencerPluginGUI.h \ | |||
| ../SpiralPluginGUI.h \ | |||
| ../SpiralPlugin.h \ | |||
| ../../Sample.h \ | |||
| ../../RiffWav.h \ | |||
| ../../NoteTable.h \ | |||
| SpiralIcon.xpm | |||
| @@ -19,7 +19,6 @@ | |||
| #include "SequencerPluginGUI.h" | |||
| #include <FL/Fl_Button.h> | |||
| #include "SpiralIcon.xpm" | |||
| #include "../../RiffWav.h" | |||
| #include "../../NoteTable.h" | |||
| using namespace std; | |||
| @@ -21,12 +21,6 @@ | |||
| #include "SpiralIcon.xpm" | |||
| #include "../../NoteTable.h" | |||
| #include "../../../config.h" | |||
| #ifdef USE_LIBSNDFILE | |||
| #include <sndfile.h> | |||
| #endif | |||
| #include "../../RiffWav.h" | |||
| using namespace std; | |||
| @@ -275,51 +269,6 @@ void SpiralLoopPlugin::LoadExternalFiles(const string &Dir) | |||
| 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; | |||
| if (wav.Open(Filename, WavFile::READ)) | |||
| { | |||
| @@ -327,7 +276,6 @@ void SpiralLoopPlugin::LoadWav(const char *Filename) | |||
| AllocateMem(wav.GetSize()); | |||
| wav.Load(m_StoreBuffer); | |||
| } | |||
| #endif | |||
| } | |||
| void SpiralLoopPlugin::SaveWav(const char *Filename) | |||
| @@ -22,12 +22,6 @@ | |||
| #include "../../NoteTable.h" | |||
| #include <stdio.h> | |||
| #include "../../../config.h" | |||
| #ifdef USE_LIBSNDFILE | |||
| #include <sndfile.h> | |||
| #endif | |||
| #include "../../RiffWav.h" | |||
| using namespace std; | |||
| @@ -60,9 +54,6 @@ string SpiralPlugin_GetGroupName() | |||
| /////////////////////////////////////////////////////// | |||
| StreamPlugin::StreamPlugin() : | |||
| #ifdef USE_LIBSNDFILE | |||
| m_File (NULL), | |||
| #endif | |||
| m_SampleRate (44100), | |||
| m_SampleSize (256), | |||
| m_StreamPos (0), | |||
| @@ -98,11 +89,6 @@ m_Mode(STOPM) | |||
| StreamPlugin::~StreamPlugin() | |||
| { | |||
| #ifdef USE_LIBSNDFILE | |||
| if (m_File) | |||
| sf_close(m_File); | |||
| m_File = NULL; | |||
| #endif | |||
| } | |||
| PluginInfo &StreamPlugin::Initialise(const HostInfo *Host) | |||
| @@ -116,93 +102,6 @@ SpiralGUIType *StreamPlugin::CreateGUI() { | |||
| } | |||
| 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()) { | |||
| for (int n=0; n<m_HostInfo->BUFSIZE; n++) { | |||
| bool FinTrig = false; | |||
| @@ -214,7 +113,8 @@ void StreamPlugin::Execute() { | |||
| m_GlobalPos = 0; | |||
| m_StreamPos = 0; | |||
| } | |||
| if (m_Pos<0) { | |||
| if (m_Pos<0) { | |||
| m_Pos = m_SampleSize - 1; | |||
| m_StreamPos -= m_SampleSize; | |||
| FinTrig = m_StreamPos < 0; | |||
| @@ -223,6 +123,12 @@ void StreamPlugin::Execute() { | |||
| m_GlobalPos = 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); | |||
| } | |||
| else if (m_Pos >= m_SampleSize) { | |||
| @@ -234,8 +140,15 @@ void StreamPlugin::Execute() { | |||
| m_GlobalPos = 0; | |||
| } | |||
| 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); | |||
| } | |||
| if (FinTrig) SetOutput (2, n, 1); | |||
| else SetOutput (2, n, 0); | |||
| if (m_Mode==PLAYM) { | |||
| @@ -252,7 +165,6 @@ void StreamPlugin::Execute() { | |||
| m_GUIArgs.TimeOut = m_GlobalPos / (float)m_SampleRate; | |||
| m_GUIArgs.PlayOut = m_Mode==PLAYM; | |||
| } | |||
| #endif | |||
| } | |||
| void StreamPlugin::ExecuteCommands() { | |||
| @@ -287,59 +199,28 @@ void StreamPlugin::SetTime (void) { | |||
| void StreamPlugin::OpenStream (void) { | |||
| m_StreamPos = 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 | |||
| m_SampleSize = 256; | |||
| m_SampleL.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; | |||
| if (m_File.IsStereo ()) { | |||
| m_Pitch *= 2; | |||
| m_GUIArgs.MaxTime = GetLength(); | |||
| } | |||
| else m_GUIArgs.MaxTime = GetLength() / 2; | |||
| #endif | |||
| } | |||
| 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 (); | |||
| else return m_File.GetSize() / (float)m_File.GetSamplerate () * 2; | |||
| #endif | |||
| } | |||
| void StreamPlugin::StreamOut (ostream &s) { | |||
| @@ -20,12 +20,6 @@ | |||
| #include "../../RiffWav.h" | |||
| #include <FL/Fl_Pixmap.H> | |||
| #include "../../../config.h" | |||
| #ifdef USE_LIBSNDFILE | |||
| #include <sndfile.h> | |||
| #endif | |||
| #ifndef StreamPLUGIN | |||
| #define StreamPLUGIN | |||
| @@ -45,12 +39,7 @@ class StreamPlugin : public SpiralPlugin { | |||
| float GetVolume (void) { return m_GUIArgs.Volume; } | |||
| float GetPitch (void) { return m_GUIArgs.PitchMod; } | |||
| private: | |||
| #ifdef USE_LIBSNDFILE | |||
| SNDFILE *m_File; | |||
| SF_INFO m_FileInfo; | |||
| #else | |||
| WavFile m_File; | |||
| #endif | |||
| Sample m_SampleL, m_SampleR; | |||
| int m_SampleRate, m_SampleSize, m_StreamPos; | |||
| float m_GlobalPos, m_Pitch, m_SamplePos, m_Pos; | |||
| @@ -31,6 +31,7 @@ | |||
| using namespace std; | |||
| #ifndef USE_LIBSNDFILE | |||
| const int HEADERLEN = (4+24+8); | |||
| #if __BYTE_ORDER == BIG_ENDIAN | |||
| @@ -87,9 +88,59 @@ static void write_float_as_32bit_float(float v, FILE *file) | |||
| SWAPFLOAT(v); | |||
| fwrite(((char*) &v),4,1,file); | |||
| } | |||
| #endif | |||
| 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) | |||
| { | |||
| cerr<<"WavFile: File already open ["<<FileName<<"]"<<endl; | |||
| @@ -245,10 +296,22 @@ int WavFile::Open(string FileName, Mode mode, Channels channels) | |||
| return 0; | |||
| } | |||
| return 0; | |||
| #endif | |||
| } | |||
| 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) | |||
| { | |||
| return 0; | |||
| @@ -261,10 +324,25 @@ int WavFile::Close() | |||
| m_Stream=NULL; | |||
| return 1; | |||
| #endif | |||
| } | |||
| 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) | |||
| { | |||
| return 0; | |||
| @@ -296,10 +374,24 @@ int WavFile::Save(Sample &data) | |||
| m_DataHeader.DataLengthBytes+=data.GetLength()*(WavFile::m_BitsPerSample/8); | |||
| return 1; | |||
| #endif | |||
| } | |||
| 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) | |||
| { | |||
| return 0; | |||
| @@ -308,10 +400,46 @@ int WavFile::Save(short *data, int Bytes) | |||
| m_DataHeader.DataLengthBytes+=Bytes; | |||
| fwrite(data,sizeof(data),Bytes/4,m_Stream); | |||
| return 1; | |||
| #endif | |||
| } | |||
| 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) | |||
| { | |||
| return 0; | |||
| @@ -347,8 +475,10 @@ int WavFile::Save(float *left, float *right, int Length) | |||
| m_DataHeader.DataLengthBytes+=Length*2*(WavFile::m_BitsPerSample/8); | |||
| return 1; | |||
| #endif | |||
| } | |||
| #ifndef USE_LIBSNDFILE | |||
| int WavFile::GetSize() | |||
| { | |||
| int Bps = m_Header.FmtBitsPerSample/8; | |||
| @@ -368,9 +498,55 @@ int WavFile::GetSize() | |||
| return ret; | |||
| } | |||
| #endif | |||
| 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 | |||
| { | |||
| #ifdef TRACE_OUT | |||
| @@ -425,10 +601,50 @@ int WavFile::Load(Sample &data) | |||
| } | |||
| return 1; | |||
| #endif | |||
| } | |||
| 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 | |||
| { | |||
| #ifdef TRACE_OUT | |||
| @@ -480,10 +696,23 @@ int WavFile::Load(short *data) | |||
| } | |||
| return 0; | |||
| #endif | |||
| } | |||
| 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; | |||
| if (m_CurSeekPos==m_DataStart+Pos) return 1; | |||
| @@ -498,10 +727,37 @@ int WavFile::SeekToChunk(int Pos) | |||
| } | |||
| return 1; | |||
| #endif | |||
| } | |||
| 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 SizeBytes = NumSamples * 2 * c; // 2 bytes per sample per channel | |||
| short *TempBuf = new short[NumSamples * c]; | |||
| @@ -533,4 +789,5 @@ int WavFile::LoadChunk(int NumSamples, Sample &ldata, Sample &rdata) | |||
| delete[] TempBuf; | |||
| return 1; | |||
| #endif | |||
| } | |||
| @@ -16,14 +16,21 @@ | |||
| * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
| */ | |||
| #include <string> | |||
| #ifndef WAVFILE | |||
| #define WAVFILE | |||
| #include <string> | |||
| #include <stdio.h> | |||
| #include "Sample.h" | |||
| #include "../config.h" | |||
| #ifdef USE_LIBSNDFILE | |||
| #include <sndfile.h> | |||
| #endif | |||
| #ifndef USE_LIBSNDFILE | |||
| #if __APPLE__ | |||
| // this is the traditional way of setting 2 bytes alignment | |||
| // else the apple compiler might use 4, or even 8 | |||
| @@ -55,38 +62,68 @@ struct DataHeader | |||
| #if __APPLE__ | |||
| #pragma options align=reset | |||
| #endif | |||
| #endif | |||
| class WavFile | |||
| { | |||
| 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) {} | |||
| #endif | |||
| ~WavFile() {Close();} | |||
| enum Mode{READ,WRITE}; | |||
| 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 Save(Sample &data); | |||
| int Load(Sample &data); | |||
| int Save(short *data, int Bytes); | |||
| int Load(short *data); | |||
| int Save(float *left, float *right, int Length); | |||
| int Load(Sample &data); | |||
| int Load(short *data); | |||
| int SeekToChunk(int Pos); | |||
| 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 | |||
| bool Recording() {return (m_Stream!=NULL);} | |||
| void SetSamplerate(int s) { m_Samplerate=s; } | |||
| int GetSamplerate() { return m_Header.FmtSamplerate; } | |||
| void SetBitsPerSample(int s) { m_BitsPerSample=s; } | |||
| int GetBitsPerSample() { return m_Header.FmtBitsPerSample; } | |||
| bool IsStereo() { return (m_Header.FmtChannels==2); } | |||
| bool IsOpen() { return m_Stream!=NULL; } | |||
| bool Recording() {return (m_Stream!=NULL);} | |||
| #endif | |||
| private: | |||
| #ifdef USE_LIBSNDFILE | |||
| SNDFILE *m_FileHandle; | |||
| SF_INFO m_FileInfo; | |||
| int m_BitsPerSample; | |||
| sf_count_t m_CurSeekPos; | |||
| #else | |||
| FILE *m_Stream; | |||
| int m_Samplerate; | |||
| int m_BitsPerSample; | |||
| @@ -96,6 +133,7 @@ private: | |||
| CanonicalWavHeader m_Header; | |||
| DataHeader m_DataHeader; | |||
| #endif | |||
| }; | |||
| #endif | |||