28 #include <SFML/Audio/SoundFileDefault.hpp>
40 SoundFileDefault::SoundFileDefault() :
50 SoundFileDefault::~SoundFileDefault()
60 bool SoundFileDefault::IsFileSupported(
const std::string& Filename,
bool Read)
66 SNDFILE* File = sf_open(Filename.c_str(), SFM_READ, &FileInfos);
81 return GetFormatFromFilename(Filename) != -1;
89 bool SoundFileDefault::IsFileSupported(
const char* Data, std::size_t SizeInBytes)
92 SF_VIRTUAL_IO VirtualIO;
93 VirtualIO.get_filelen = &SoundFileDefault::MemoryGetLength;
94 VirtualIO.read = &SoundFileDefault::MemoryRead;
95 VirtualIO.seek = &SoundFileDefault::MemorySeek;
96 VirtualIO.tell = &SoundFileDefault::MemoryTell;
97 VirtualIO.write = &SoundFileDefault::MemoryWrite;
101 Memory.DataStart = Data;
102 Memory.DataPtr = Data;
103 Memory.TotalSize = SizeInBytes;
107 SNDFILE* File = sf_open_virtual(&VirtualIO, SFM_READ, &FileInfos, &Memory);
124 bool SoundFileDefault::OpenRead(
const std::string& Filename, std::size_t& NbSamples,
unsigned int& ChannelsCount,
unsigned int& SampleRate)
132 myFile = sf_open(Filename.c_str(), SFM_READ, &FileInfos);
135 std::cerr <<
"Failed to read sound file \"" << Filename <<
"\"" << std::endl;
140 ChannelsCount = FileInfos.channels;
141 SampleRate = FileInfos.samplerate;
142 NbSamples =
static_cast<std::size_t
>(FileInfos.frames) * ChannelsCount;
151 bool SoundFileDefault::OpenRead(
const char* Data, std::size_t SizeInBytes, std::size_t& NbSamples,
unsigned int& ChannelsCount,
unsigned int& SampleRate)
158 SF_VIRTUAL_IO VirtualIO;
159 VirtualIO.get_filelen = &SoundFileDefault::MemoryGetLength;
160 VirtualIO.read = &SoundFileDefault::MemoryRead;
161 VirtualIO.seek = &SoundFileDefault::MemorySeek;
162 VirtualIO.tell = &SoundFileDefault::MemoryTell;
163 VirtualIO.write = &SoundFileDefault::MemoryWrite;
166 myMemory.DataStart = Data;
167 myMemory.DataPtr = Data;
168 myMemory.TotalSize = SizeInBytes;
172 myFile = sf_open_virtual(&VirtualIO, SFM_READ, &FileInfos, &myMemory);
175 std::cerr <<
"Failed to read sound file from memory" << std::endl;
180 ChannelsCount = FileInfos.channels;
181 SampleRate = FileInfos.samplerate;
182 NbSamples =
static_cast<std::size_t
>(FileInfos.frames) * ChannelsCount;
191 bool SoundFileDefault::OpenWrite(
const std::string& Filename,
unsigned int ChannelsCount,
unsigned int SampleRate)
198 int Format = GetFormatFromFilename(Filename);
202 std::cerr <<
"Failed to create sound file \"" << Filename <<
"\" : unknown format" << std::endl;
208 FileInfos.channels = ChannelsCount;
209 FileInfos.samplerate = SampleRate;
210 FileInfos.format = Format | SF_FORMAT_PCM_16;
213 myFile = sf_open(Filename.c_str(), SFM_WRITE, &FileInfos);
216 std::cerr <<
"Failed to create sound file \"" << Filename <<
"\"" << std::endl;
227 std::size_t SoundFileDefault::Read(Int16* Data, std::size_t NbSamples)
229 if (myFile && Data && NbSamples)
230 return static_cast<std::size_t
>(sf_read_short(myFile, Data, NbSamples));
239 void SoundFileDefault::Write(
const Int16* Data, std::size_t NbSamples)
241 if (myFile && Data && NbSamples)
242 sf_write_short(myFile, Data, NbSamples);
250 int SoundFileDefault::GetFormatFromFilename(
const std::string& Filename)
253 std::string Ext =
"wav";
254 std::string::size_type Pos = Filename.find_last_of(
".");
255 if (Pos != std::string::npos)
256 Ext = Filename.substr(Pos + 1);
259 if (Ext ==
"wav" || Ext ==
"WAV" )
return SF_FORMAT_WAV;
260 if (Ext ==
"aif" || Ext ==
"AIF" )
return SF_FORMAT_AIFF;
261 if (Ext ==
"aiff" || Ext ==
"AIFF")
return SF_FORMAT_AIFF;
262 if (Ext ==
"au" || Ext ==
"AU" )
return SF_FORMAT_AU;
263 if (Ext ==
"raw" || Ext ==
"RAW" )
return SF_FORMAT_RAW;
264 if (Ext ==
"paf" || Ext ==
"PAF" )
return SF_FORMAT_PAF;
265 if (Ext ==
"svx" || Ext ==
"SVX" )
return SF_FORMAT_SVX;
266 if (Ext ==
"voc" || Ext ==
"VOC" )
return SF_FORMAT_VOC;
267 if (Ext ==
"sf" || Ext ==
"SF" )
return SF_FORMAT_IRCAM;
268 if (Ext ==
"w64" || Ext ==
"W64" )
return SF_FORMAT_W64;
269 if (Ext ==
"mat4" || Ext ==
"MAT4")
return SF_FORMAT_MAT4;
270 if (Ext ==
"mat5" || Ext ==
"MAT5")
return SF_FORMAT_MAT5;
271 if (Ext ==
"pvf" || Ext ==
"PVF" )
return SF_FORMAT_PVF;
272 if (Ext ==
"htk" || Ext ==
"HTK" )
return SF_FORMAT_HTK;
273 if (Ext ==
"caf" || Ext ==
"CAF" )
return SF_FORMAT_CAF;
274 if (Ext ==
"nist" || Ext ==
"NIST")
return SF_FORMAT_NIST;
275 if (Ext ==
"sds" || Ext ==
"SDS" )
return SF_FORMAT_SDS;
276 if (Ext ==
"avr" || Ext ==
"AVR" )
return SF_FORMAT_AVR;
277 if (Ext ==
"sd2" || Ext ==
"SD2" )
return SF_FORMAT_SD2;
278 if (Ext ==
"flac" || Ext ==
"FLAC")
return SF_FORMAT_FLAC;
288 sf_count_t SoundFileDefault::MemoryGetLength(
void* UserData)
290 MemoryInfos* Memory =
static_cast<MemoryInfos*
>(UserData);
292 return Memory->TotalSize;
294 sf_count_t SoundFileDefault::MemoryRead(
void* Ptr, sf_count_t Count,
void* UserData)
296 MemoryInfos* Memory =
static_cast<MemoryInfos*
>(UserData);
298 sf_count_t Position = Memory->DataPtr - Memory->DataStart;
299 if (Position + Count >= Memory->TotalSize)
300 Count = Memory->TotalSize - Position;
302 memcpy(Ptr, Memory->DataPtr, static_cast<std::size_t>(Count));
304 Memory->DataPtr += Count;
308 sf_count_t SoundFileDefault::MemorySeek(sf_count_t Offset,
int Whence,
void* UserData)
310 MemoryInfos* Memory =
static_cast<MemoryInfos*
>(UserData);
312 sf_count_t Position = 0;
319 Position = Memory->DataPtr - Memory->DataStart + Offset;
322 Position = Memory->TotalSize - Offset;
329 if (Position >= Memory->TotalSize)
330 Position = Memory->TotalSize - 1;
331 else if (Position < 0)
334 Memory->DataPtr = Memory->DataStart + Position;
338 sf_count_t SoundFileDefault::MemoryTell(
void* UserData)
340 MemoryInfos* Memory =
static_cast<MemoryInfos*
>(UserData);
342 return Memory->DataPtr - Memory->DataStart;
344 sf_count_t SoundFileDefault::MemoryWrite(
const void*, sf_count_t,
void*)