fixed AV::Sound::decode() to add sounds and loop over decoded length properly
git-svn-id: svn://anubis/anaglym/trunk@280 99a6e188-d820-4881-8870-2d33a10e2619
This commit is contained in:
parent
1c2221e2f6
commit
d376d7a5b0
50
AV.cc
50
AV.cc
@ -1,13 +1,22 @@
|
|||||||
|
|
||||||
#include "AV.h"
|
|
||||||
#include <GL/gl.h>
|
#include <GL/gl.h>
|
||||||
#include <GL/glu.h>
|
#include <GL/glu.h>
|
||||||
#include <SDL.h>
|
#include <SDL.h>
|
||||||
#include <iostream>
|
|
||||||
#include <SDL_sound.h>
|
#include <SDL_sound.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include "AV.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
#define SOUND_RATE 44100
|
||||||
|
#define CALLBACK_SAMPLES 4096
|
||||||
|
#define CHANNELS 2
|
||||||
|
#define BYTES_PER_SAMPLE 2
|
||||||
|
|
||||||
void AV_sound_callback(void * userdata, Uint8 * stream, int len)
|
void AV_sound_callback(void * userdata, Uint8 * stream, int len)
|
||||||
{
|
{
|
||||||
((AV *)userdata)->playCallback(stream, len);
|
((AV *)userdata)->playCallback(stream, len);
|
||||||
@ -40,10 +49,10 @@ AV::AV()
|
|||||||
|
|
||||||
Sound_Init();
|
Sound_Init();
|
||||||
SDL_AudioSpec desired;
|
SDL_AudioSpec desired;
|
||||||
desired.freq = AV_SOUND_RATE;
|
desired.freq = SOUND_RATE;
|
||||||
desired.format = AUDIO_S16SYS;
|
desired.format = AUDIO_S16SYS;
|
||||||
desired.channels = 2;
|
desired.channels = CHANNELS;
|
||||||
desired.samples = 4096;
|
desired.samples = CALLBACK_SAMPLES;
|
||||||
desired.callback = AV_sound_callback;
|
desired.callback = AV_sound_callback;
|
||||||
desired.userdata = this;
|
desired.userdata = this;
|
||||||
if (SDL_OpenAudio(&desired, NULL) < 0)
|
if (SDL_OpenAudio(&desired, NULL) < 0)
|
||||||
@ -130,6 +139,7 @@ void AV::playSound(AV::Sound * s)
|
|||||||
|
|
||||||
void AV::playCallback(Uint8 * stream, int len)
|
void AV::playCallback(Uint8 * stream, int len)
|
||||||
{
|
{
|
||||||
|
memset(stream, 0, len);
|
||||||
for (std::set<Sound *>::const_iterator it = m_active_sounds.begin();
|
for (std::set<Sound *>::const_iterator it = m_active_sounds.begin();
|
||||||
it != m_active_sounds.end();
|
it != m_active_sounds.end();
|
||||||
it++)
|
it++)
|
||||||
@ -165,8 +175,9 @@ bool AV::Sound::load(FileLoader & fileLoader, const FileLoader::Path & path)
|
|||||||
Sound_AudioInfo desired;
|
Sound_AudioInfo desired;
|
||||||
desired.channels = 2;
|
desired.channels = 2;
|
||||||
desired.format = AUDIO_S16SYS;
|
desired.format = AUDIO_S16SYS;
|
||||||
desired.rate = AV_SOUND_RATE;
|
desired.rate = SOUND_RATE;
|
||||||
m_ss = Sound_NewSample(m_rwops, NULL, &desired, 4192);
|
m_ss = Sound_NewSample(m_rwops, NULL, &desired,
|
||||||
|
CALLBACK_SAMPLES * BYTES_PER_SAMPLE * CHANNELS);
|
||||||
if (m_ss != NULL)
|
if (m_ss != NULL)
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
@ -205,10 +216,25 @@ void AV::Sound::loop(int times)
|
|||||||
|
|
||||||
int AV::Sound::decode(Uint8 * stream, int len)
|
int AV::Sound::decode(Uint8 * stream, int len)
|
||||||
{
|
{
|
||||||
/* TODO: fix for len != m_ss->buffer_size */
|
int len_decoded = 0, len_decoded_now;
|
||||||
cerr << "AV::Sound::decode()" << endl;
|
int samples_decoded = 0, samples_decoded_now;
|
||||||
Uint32 len_decoded = Sound_Decode(m_ss);
|
int spos = 0;
|
||||||
cerr << "AV::Sound::decode() len: " << len << ", len_decoded: " << len_decoded << endl;
|
int16_t * s16stream = (int16_t *) stream;
|
||||||
memcpy(stream, m_ss->buffer, len_decoded);
|
int16_t * decoded_stream = (int16_t *) m_ss->buffer;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
len_decoded_now = Sound_Decode(m_ss);
|
||||||
|
samples_decoded_now = len_decoded_now / BYTES_PER_SAMPLE;
|
||||||
|
len_decoded += len_decoded_now;
|
||||||
|
samples_decoded += len_decoded / BYTES_PER_SAMPLE;
|
||||||
|
for (int i = 0; i < samples_decoded_now; i++)
|
||||||
|
{
|
||||||
|
int val = s16stream[spos] + decoded_stream[i];
|
||||||
|
s16stream[spos] = (val > SHRT_MAX) ? SHRT_MAX : val;
|
||||||
|
spos++;
|
||||||
|
}
|
||||||
|
} while ( (len_decoded_now == (int) m_ss->buffer_size)
|
||||||
|
&& (len_decoded < len) );
|
||||||
|
|
||||||
return len_decoded;
|
return len_decoded;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user