Files
itgmania212121/stepmania/src/RageSoundReader_SDL_Sound.cpp
T
Glenn Maynard 62cd0a7ac5 link to ogg
2003-04-07 19:37:37 +00:00

172 lines
3.6 KiB
C++

#include "global.h"
/*
* Known problems:
* I hear a click in one speaker at the beginning of some MP3s. This is probably
* something wrong with my SDL_sound MAD wrapper ...
*/
#ifdef DEBUG
#pragma comment(lib, "SDL_sound-1.0.0/lib/sdl_sound_static_d.lib")
#else
#pragma comment(lib, "SDL_sound-1.0.0/lib/sdl_sound_static.lib")
#endif
#pragma comment(lib, "SDL_sound-1.0.0/lib/ogg_static.lib")
#pragma comment(lib, "SDL_sound-1.0.0/lib/vorbis_static.lib")
#pragma comment(lib, "SDL_sound-1.0.0/lib/vorbisfile_static.lib")
#include "RageSoundReader_SDL_Sound.h"
const int channels = 2;
const int samplesize = 2 * channels; /* 16-bit */
const int samplerate = 44100;
/* The amount of data to read from SDL_sound at once. */
const int read_block_size = 1024;
bool SoundReader_SDL_Sound::Open(CString filename_)
{
filename=filename_;
static bool initialized = false;
if(!initialized)
{
if(!Sound_Init())
RageException::Throw( "RageSoundManager::RageSoundManager: error initializing sound loader: %s", Sound_GetError());
initialized = true;
}
inbuf = NULL;
avail = 0;
Sound_AudioInfo sound_desired;
sound_desired.channels = channels;
sound_desired.format = AUDIO_S16SYS;
sound_desired.rate = samplerate;
Sample = Sound_NewSampleFromFile(filename.GetString(),
&sound_desired, read_block_size);
if(Sample)
return true;
SetError(Sound_GetError());
return false;
}
int SoundReader_SDL_Sound::GetLength() const
{
int len = Sound_Length(Sample);
if(len == -1 && Sample->flags & SOUND_SAMPLEFLAG_EAGAIN) {
/* This indicates the length check will take a little while; call
* it again to confirm. */
len = Sound_Length(Sample);
}
if(len < 0)
{
SetError(Sound_GetError());
return -1;
}
return len;
}
int SoundReader_SDL_Sound::GetLength_Fast() const
{
int ret = Sound_Length(Sample);
Sound_Rewind(Sample);
return ret;
}
int SoundReader_SDL_Sound::SetPosition(int ms, bool accurate)
{
if(ms == 0)
{
Sound_Rewind(Sample);
return 0;
}
int ret;
if(accurate)
ret = Sound_AccurateSeek(Sample, ms);
else
ret = Sound_FastSeek(Sample, ms);
if(Sample->flags & SOUND_SAMPLEFLAG_ERROR)
{
SetError(Sound_GetError());
return -1;
}
/* If the seek function returned false but didn't set error, it's a
* recoverable error. We probably seeked past end of file. */
if(!ret)
{
/* Past EOF. Rewind. */
Sound_Rewind(Sample);
return 0;
}
return ms;
}
int SoundReader_SDL_Sound::Read(char *buf, unsigned len)
{
int bytes_read = 0;
while(len)
{
if(!avail)
{
/* Don't read at all if we've already hit EOF (it'll whine). */
if(Sample->flags & SOUND_SAMPLEFLAG_EOF)
return bytes_read; /* EOF */
int cnt = Sound_Decode(Sample);
if(Sample->flags & SOUND_SAMPLEFLAG_EOF)
return bytes_read; /* EOF */
if(Sample->flags & SOUND_SAMPLEFLAG_ERROR)
{
SetError(Sound_GetError());
return -1;
}
avail = cnt;
inbuf = (const char *) Sample->buffer;
}
unsigned size = min(avail, len);
memcpy(buf, inbuf, size);
buf += size;
len -= size;
inbuf += size;
avail -= size;
bytes_read += size;
}
return bytes_read;
}
SoundReader_SDL_Sound::~SoundReader_SDL_Sound()
{
Sound_FreeSample(Sample);
}
SoundReader *SoundReader_SDL_Sound::Copy() const
{
SoundReader_SDL_Sound *ret = new SoundReader_SDL_Sound;
ret->Open(filename);
return ret;
}
/*
-----------------------------------------------------------------------------
Copyright (c) 2002-2003 by the person(s) listed below. All rights reserved.
Glenn Maynard
-----------------------------------------------------------------------------
*/