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 |