/*
* CMusic.cpp
*
* Created on: 02.05.2009
* Author: gerstrong
*/
#include "CMusic.h"
#include "../hqp/hq_sound.h"
#include "../CLogFile.h"
#include "../include/vorbis/oggsupport.h"
CMusic::CMusic() {
playmode = PLAY_MODE_STOP;
}
CMusic::~CMusic() {
// TODO Auto-generated destructor stub
}
int CMusic::load(SDL_AudioSpec AudioSpec, char *musicfile)
{
FILE *fp;
if(AudioSpec.format != 0)
{
#ifdef BUILD_WITH_OGG
SDL_AudioSpec AudioFileSpec;
SDL_AudioCVT Audio_cvt;
stHQSound pOggAudio;
pOggAudio.sound_buffer=NULL;
pOggAudio.sound_len=0;
pOggAudio.sound_pos=0;
if((fp = fopen(musicfile,"rb")) == NULL)
{
g_pLogFile->textOut(PURPLE,"Music Driver(): \"%s\". File does not exist!
", musicfile);
return -1;
}
if(openOGGSound(fp, &AudioFileSpec, &pOggAudio) != 0)
{
g_pLogFile->textOut(PURPLE,"Music Driver(): OGG file could not be opened: \"%s\". File is damaged or something is wrong with your soundcard!
", musicfile);
return 1;
}
g_pLogFile->ftextOut("Music Driver(): File \"%s\" opened successfully!
", musicfile);
int ret;
ret = SDL_BuildAudioCVT(&Audio_cvt,
AudioFileSpec.format, AudioFileSpec.channels, AudioFileSpec.freq,
AudioSpec.format, AudioSpec.channels, AudioSpec.freq);
music_pos = 0;
if(ret == -1){
g_pLogFile->textOut(PURPLE,"Music Driver(): Couldn't convert the audio for an appropriate format!
");
free(pOggAudio.sound_buffer);
pOggAudio.sound_len = 0;
pOggAudio.sound_pos = 0;
return 1;
}
music_len = pOggAudio.sound_len;
Audio_cvt.buf = (Uint8*) malloc(music_len * Audio_cvt.len_mult * sizeof(Uint8));
Audio_cvt.len = music_len;
memcpy(Audio_cvt.buf, pOggAudio.sound_buffer, music_len*sizeof(Uint8));
free(pOggAudio.sound_buffer);
SDL_ConvertAudio(&Audio_cvt);
music_len = Audio_cvt.len_cvt;
music_buffer = new Uint8 [music_len];
memcpy(music_buffer, Audio_cvt.buf, music_len);
// Structure Audio_cvt must be freed!
free(Audio_cvt.buf);
return 0;
#endif
}
else
g_pLogFile->textOut(PURPLE,"Music Driver(): I would like to open the music for you. But your Soundcard is disabled!!
");
return 0;
}
void CMusic::unload(void)
{
if(music_buffer){ delete[] music_buffer; music_buffer = NULL; }
music_len = 0;
music_pos = 0;
playmode = PLAY_MODE_STOP;
}
void CMusic::play(void)
{
playmode = PLAY_MODE_PLAY;
}
void CMusic::stop(void)
{
playmode = PLAY_MODE_STOP;
}
Uint8 *CMusic::passBuffer(int length) // length only refers to the part(buffer) that has to be played
{
if(length < music_len-music_pos)
{
music_pos += length;
return music_buffer+music_pos-length;
}
else
{
music_pos = 0;
return music_buffer;
}
}