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 |