mirror of
https://github.com/dborth/snes9xgx.git
synced 2024-11-30 22:44:22 +01:00
rewrite ogg code. better?
This commit is contained in:
parent
383acdaf01
commit
2bf1663248
@ -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
|
||||||
return 1; // running
|
else
|
||||||
|
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)
|
||||||
|
Loading…
Reference in New Issue
Block a user