Browse Source

Added initial libsndfile support for loading multiple file formats

master
aj_genius 21 years ago
parent
commit
ea1f92e9f6
1 changed files with 54 additions and 1 deletions
  1. +54
    -1
      SpiralSound/Plugins/SpiralLoopPlugin/SpiralLoopPlugin.C

+ 54
- 1
SpiralSound/Plugins/SpiralLoopPlugin/SpiralLoopPlugin.C View File

@@ -19,9 +19,16 @@
#include "SpiralLoopPluginGUI.h"
#include <FL/Fl_Button.h>
#include "SpiralIcon.xpm"
#include "../../RiffWav.h"
#include "../../NoteTable.h"

#include "../../../config.h"

#ifdef USE_LIBSNDFILE
#include <sndfile.h>
#endif

#include "../../RiffWav.h"

using namespace std;

static const float TRIG_THRESH = 0.1;
@@ -268,6 +275,51 @@ 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))
{
@@ -275,6 +327,7 @@ void SpiralLoopPlugin::LoadWav(const char *Filename)
AllocateMem(wav.GetSize());
wav.Load(m_StoreBuffer);
}
#endif
}

void SpiralLoopPlugin::SaveWav(const char *Filename)


Loading…
Cancel
Save