rewrite ogg code. better?

This commit is contained in:
dborth 2009-06-13 03:59:42 +00:00
parent 383acdaf01
commit 2bf1663248

View File

@ -67,9 +67,9 @@ static int ogg_thread_running = 0;
static void ogg_add_callback(int voice) static void ogg_add_callback(int voice)
{ {
if (ogg_thread_running <= 0) if (!ogg_thread_running)
{ {
SND_StopVoice(0); ASND_StopVoice(0);
return; return;
} }
@ -78,7 +78,7 @@ static void ogg_add_callback(int voice)
if (private_ogg.pcm_indx >= READ_SAMPLES) if (private_ogg.pcm_indx >= READ_SAMPLES)
{ {
if (SND_AddVoice(0, if (ASND_AddVoice(0,
(void *) private_ogg.pcmout[private_ogg.pcmout_pos], (void *) private_ogg.pcmout[private_ogg.pcmout_pos],
private_ogg.pcm_indx << 1) == 0) private_ogg.pcm_indx << 1) == 0)
{ {
@ -101,14 +101,14 @@ static void ogg_add_callback(int voice)
static void * ogg_player_thread(private_data_ogg * priv) static void * ogg_player_thread(private_data_ogg * priv)
{ {
int first_time = 1; int first_time = 1;
long ret;
ogg_thread_running = 0;
//init //init
LWP_InitQueue(&oggplayer_queue); LWP_InitQueue(&oggplayer_queue);
priv[0].vi = ov_info(&priv[0].vf, -1); priv[0].vi = ov_info(&priv[0].vf, -1);
SND_Pause(0); ASND_Pause(0);
priv[0].pcm_indx = 0; priv[0].pcm_indx = 0;
priv[0].pcmout_pos = 0; priv[0].pcmout_pos = 0;
@ -120,20 +120,16 @@ static void * ogg_player_thread(private_data_ogg * priv)
while (!priv[0].eof) while (!priv[0].eof)
{ {
long ret; if (!ogg_thread_running)
if (ogg_thread_running <= 0)
break; break;
if (priv[0].flag) if (priv[0].flag)
LWP_ThreadSleep(oggplayer_queue); // wait only when i have samples to send LWP_ThreadSleep(oggplayer_queue); // wait only when i have samples to send
if (ogg_thread_running <= 0)
break;
if (priv[0].flag == 0) // wait to all samples are sended if (priv[0].flag == 0) // wait to all samples are sended
{ {
if (SND_TestPointer(0, priv[0].pcmout[priv[0].pcmout_pos]) if (ASND_TestPointer(0, priv[0].pcmout[priv[0].pcmout_pos])
&& SND_StatusVoice(0) != SND_UNUSED) && ASND_StatusVoice(0) != SND_UNUSED)
{ {
priv[0].flag |= 64; priv[0].flag |= 64;
continue; continue;
@ -188,12 +184,12 @@ static void * ogg_player_thread(private_data_ogg * priv)
if (priv[0].flag == 1) if (priv[0].flag == 1)
{ {
if (SND_StatusVoice(0) == SND_UNUSED || first_time) if (ASND_StatusVoice(0) == SND_UNUSED || first_time)
{ {
first_time = 0; first_time = 0;
if (priv[0].vi->channels == 2) if (priv[0].vi->channels == 2)
{ {
SND_SetVoice(0, VOICE_STEREO_16BIT, priv[0].vi->rate, 0, ASND_SetVoice(0, VOICE_STEREO_16BIT, priv[0].vi->rate, 0,
(void *) priv[0].pcmout[priv[0].pcmout_pos], (void *) priv[0].pcmout[priv[0].pcmout_pos],
priv[0].pcm_indx << 1, priv[0].volume, priv[0].pcm_indx << 1, priv[0].volume,
priv[0].volume, ogg_add_callback); priv[0].volume, ogg_add_callback);
@ -203,7 +199,7 @@ static void * ogg_player_thread(private_data_ogg * priv)
} }
else else
{ {
SND_SetVoice(0, VOICE_MONO_16BIT, priv[0].vi->rate, 0, ASND_SetVoice(0, VOICE_MONO_16BIT, priv[0].vi->rate, 0,
(void *) priv[0].pcmout[priv[0].pcmout_pos], (void *) priv[0].pcmout[priv[0].pcmout_pos],
priv[0].pcm_indx << 1, priv[0].volume, priv[0].pcm_indx << 1, priv[0].volume,
priv[0].volume, ogg_add_callback); priv[0].volume, ogg_add_callback);
@ -223,33 +219,25 @@ static void * ogg_player_thread(private_data_ogg * priv)
ov_clear(&priv[0].vf); ov_clear(&priv[0].vf);
priv[0].fd = -1; priv[0].fd = -1;
priv[0].pcm_indx = 0; priv[0].pcm_indx = 0;
ogg_thread_running = 0;
return 0; return 0;
} }
void StopOgg() void StopOgg()
{ {
SND_StopVoice(0);
if (ogg_thread_running > 0) if (ogg_thread_running > 0)
{ {
ogg_thread_running = -2; ogg_thread_running = 0;
LWP_ThreadSignal(oggplayer_queue); LWP_ThreadSignal(oggplayer_queue);
LWP_JoinThread(h_oggplayer, NULL); LWP_JoinThread(h_oggplayer, NULL);
while (((volatile int) ogg_thread_running) != 0)
{
;;;
}
} }
ASND_StopVoice(0);
} }
int PlayOgg(int fd, int time_pos, int mode) int PlayOgg(int fd, int time_pos, int mode)
{ {
StopOgg(); StopOgg();
ogg_thread_running = 0;
private_ogg.fd = fd; private_ogg.fd = fd;
private_ogg.mode = mode; private_ogg.mode = mode;
private_ogg.eof = 0; private_ogg.eof = 0;
@ -269,23 +257,18 @@ int PlayOgg(int fd, int time_pos, int mode)
{ {
mem_close(private_ogg.fd); // mem_close() can too close files from devices mem_close(private_ogg.fd); // mem_close() can too close files from devices
private_ogg.fd = -1; private_ogg.fd = -1;
ogg_thread_running = -1; ogg_thread_running = 0;
return -1; return -1;
} }
if (LWP_CreateThread(&h_oggplayer, (void *) ogg_player_thread, if (LWP_CreateThread(&h_oggplayer, (void *) ogg_player_thread,
&private_ogg, oggplayer_stack, STACKSIZE, 80) == -1) &private_ogg, oggplayer_stack, STACKSIZE, 80) == -1)
{ {
ogg_thread_running = -1; ogg_thread_running = 0;
ov_clear(&private_ogg.vf); ov_clear(&private_ogg.vf);
private_ogg.fd = -1; private_ogg.fd = -1;
return -1; return -1;
} }
LWP_ThreadSignal(oggplayer_queue);
while (((volatile int) ogg_thread_running) == 0)
{
;;;
}
return 0; return 0;
} }
@ -304,7 +287,6 @@ void PauseOgg(int pause)
if (ogg_thread_running > 0) if (ogg_thread_running > 0)
{ {
LWP_ThreadSignal(oggplayer_queue); LWP_ThreadSignal(oggplayer_queue);
// while(((volatile int )private_ogg.flag)!=1 && ((volatile int )ogg_thread_running)>0) {;;;}
} }
} }
@ -313,30 +295,26 @@ void PauseOgg(int pause)
int StatusOgg() int StatusOgg()
{ {
if (ogg_thread_running <= 0) if (ogg_thread_running == 0)
return -1; // Error return -1; // Error
else if (private_ogg.eof)
if (private_ogg.eof)
return 255; // EOF return 255; // EOF
else if (private_ogg.flag & 128)
if (private_ogg.flag & 128)
return 2; // paused return 2; // paused
else
return 1; // running return 1; // running
} }
void SetVolumeOgg(int volume) void SetVolumeOgg(int volume)
{ {
private_ogg.volume = volume; private_ogg.volume = volume;
ASND_ChangeVolumeVoice(0, volume, volume);
SND_ChangeVolumeVoice(0, volume, volume);
} }
s32 GetTimeOgg() s32 GetTimeOgg()
{ {
int ret; int ret;
if (ogg_thread_running <= 0) if (ogg_thread_running == 0 || private_ogg.fd < 0)
return 0;
if (private_ogg.fd < 0)
return 0; return 0;
ret = ((s32) ov_time_tell(&private_ogg.vf)); ret = ((s32) ov_time_tell(&private_ogg.vf));
if (ret < 0) if (ret < 0)