Browse Source

finished libsndfile support

and removed references to RiffWav in plugins that don't use it.
master
aj_genius 21 years ago
parent
commit
7bf9f6f89c
19 changed files with 326 additions and 302 deletions
  1. +3
    -5
      SpiralSound/Plugins/DiskWriterPlugin/DiskWriterPlugin.C
  2. +1
    -1
      SpiralSound/Plugins/DiskWriterPlugin/Makefile.in
  3. +0
    -1
      SpiralSound/Plugins/JackPlugin/JackPlugin.h
  4. +0
    -2
      SpiralSound/Plugins/JackPlugin/JackPlugin.pro
  5. +0
    -9
      SpiralSound/Plugins/JackPlugin/Makefile.in
  6. +0
    -2
      SpiralSound/Plugins/JoystickPlugin/JoystickPlugin.pro
  7. +0
    -1
      SpiralSound/Plugins/MatrixPlugin/Makefile.in
  8. +0
    -1
      SpiralSound/Plugins/MatrixPlugin/MatrixPlugin.C
  9. +0
    -51
      SpiralSound/Plugins/PoshSamplerPlugin/PoshSamplerPlugin.C
  10. +0
    -8
      SpiralSound/Plugins/SeqPlugin/Makefile.in
  11. +0
    -1
      SpiralSound/Plugins/SeqPlugin/SeqPlugin.C
  12. +0
    -2
      SpiralSound/Plugins/SeqPlugin/SeqPlugin.pro
  13. +0
    -8
      SpiralSound/Plugins/SequencerPlugin/Makefile.in
  14. +0
    -1
      SpiralSound/Plugins/SequencerPlugin/SequencerPlugin.C
  15. +0
    -52
      SpiralSound/Plugins/SpiralLoopPlugin/SpiralLoopPlugin.C
  16. +19
    -138
      SpiralSound/Plugins/StreamPlugin/StreamPlugin.C
  17. +0
    -11
      SpiralSound/Plugins/StreamPlugin/StreamPlugin.h
  18. +257
    -0
      SpiralSound/RiffWav.C
  19. +46
    -8
      SpiralSound/RiffWav.h

+ 3
- 5
SpiralSound/Plugins/DiskWriterPlugin/DiskWriterPlugin.C View File

@@ -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()


+ 1
- 1
SpiralSound/Plugins/DiskWriterPlugin/Makefile.in View File

@@ -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 =




+ 0
- 1
SpiralSound/Plugins/JackPlugin/JackPlugin.h View File

@@ -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>




+ 0
- 2
SpiralSound/Plugins/JackPlugin/JackPlugin.pro View File

@@ -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




+ 0
- 9
SpiralSound/Plugins/JackPlugin/Makefile.in View File

@@ -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


+ 0
- 2
SpiralSound/Plugins/JoystickPlugin/JoystickPlugin.pro View File

@@ -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




+ 0
- 1
SpiralSound/Plugins/MatrixPlugin/Makefile.in View File

@@ -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 \


+ 0
- 1
SpiralSound/Plugins/MatrixPlugin/MatrixPlugin.C View File

@@ -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;


+ 0
- 51
SpiralSound/Plugins/PoshSamplerPlugin/PoshSamplerPlugin.C View File

@@ -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)


+ 0
- 8
SpiralSound/Plugins/SeqPlugin/Makefile.in View File

@@ -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 \


+ 0
- 1
SpiralSound/Plugins/SeqPlugin/SeqPlugin.C View File

@@ -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;


+ 0
- 2
SpiralSound/Plugins/SeqPlugin/SeqPlugin.pro View File

@@ -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




+ 0
- 8
SpiralSound/Plugins/SequencerPlugin/Makefile.in View File

@@ -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




+ 0
- 1
SpiralSound/Plugins/SequencerPlugin/SequencerPlugin.C View File

@@ -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;


+ 0
- 52
SpiralSound/Plugins/SpiralLoopPlugin/SpiralLoopPlugin.C View File

@@ -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)


+ 19
- 138
SpiralSound/Plugins/StreamPlugin/StreamPlugin.C View File

@@ -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) {


+ 0
- 11
SpiralSound/Plugins/StreamPlugin/StreamPlugin.h View File

@@ -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;


+ 257
- 0
SpiralSound/RiffWav.C View File

@@ -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
} }

+ 46
- 8
SpiralSound/RiffWav.h View File

@@ -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

Loading…
Cancel
Save