forked from mirrors/nixpkgs
85d0348e2a
fixes #23336
99 lines
2.5 KiB
Diff
99 lines
2.5 KiB
Diff
--- eflite-0.4.1.orig/fs.c
|
|
+++ eflite-0.4.1/fs.c
|
|
@@ -9,7 +9,7 @@
|
|
* GNU General Public License, as published by the Free Software
|
|
* Foundation. Please see the file COPYING for details.
|
|
*
|
|
- * $Id: fs.c,v 1.19 2007/01/18 23:58:42 mgorse Exp $
|
|
+ * $Id: fs.c,v 1.22 2008/03/05 15:21:43 mgorse Exp $
|
|
*
|
|
* Notes:
|
|
*
|
|
@@ -505,19 +505,6 @@
|
|
}
|
|
}
|
|
|
|
-
|
|
-
|
|
-static void play_audio_close(void *cancel)
|
|
-{
|
|
- if (audiodev)
|
|
- {
|
|
- audio_drain(audiodev);
|
|
- close_audiodev();
|
|
- // usleep(5000);
|
|
- }
|
|
-}
|
|
-
|
|
-
|
|
static inline void determine_playlen(int speed, cst_wave *wptr, int type, int *pl, int *s)
|
|
{
|
|
int playlen, skip;
|
|
@@ -573,12 +560,12 @@
|
|
type = ac[ac_head].type;
|
|
WAVE_UNLOCK;
|
|
pthread_testcancel();
|
|
- pthread_cleanup_push(play_audio_close, NULL);
|
|
-
|
|
+
|
|
es_log(2, "Opening audio device.");
|
|
/* We abuse the wave mutex here to avoid being canceled
|
|
* while the audio device is being openned */
|
|
WAVE_LOCK;
|
|
+ assert(audiodev == NULL);
|
|
audiodev = audio_open(wptr->sample_rate, wptr->num_channels, CST_AUDIO_LINEAR16);
|
|
WAVE_UNLOCK;
|
|
if (audiodev == NULL)
|
|
@@ -606,8 +593,8 @@
|
|
#ifdef DEBUG
|
|
start_time = get_ticks_count();
|
|
#endif
|
|
- pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
|
|
audio_write(audiodev, wptr->samples + skip, playlen * 2);
|
|
+ pthread_testcancel();
|
|
es_log(2, "Write took %.2f seconds.", get_ticks_count() - start_time);
|
|
}
|
|
es_log(2, "play: syncing.");
|
|
@@ -617,16 +604,16 @@
|
|
audio_flush(audiodev);
|
|
pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);
|
|
es_log(2, "Flush took %.2f seconds.", get_ticks_count() - start_time);
|
|
- es_log(2, "play: Closing audio device");
|
|
- close_audiodev();
|
|
- pthread_cleanup_pop(0);
|
|
- pthread_testcancel();
|
|
- TEXT_LOCK;
|
|
+ pthread_testcancel();
|
|
+
|
|
+ TEXT_LOCK;
|
|
time_left -= ((float)playlen) / wptr->sample_rate;
|
|
pthread_cond_signal(&text_condition);
|
|
TEXT_UNLOCK;
|
|
|
|
WAVE_LOCK;
|
|
+ es_log(2, "play: Closing audio device");
|
|
+ close_audiodev();
|
|
ac_destroy(&ac[ac_head]);
|
|
ac_head++;
|
|
if (ac_head == ac_tail)
|
|
@@ -894,6 +881,7 @@
|
|
WAVE_LOCK_NI;
|
|
pthread_cond_signal(&wave_condition); // necessary because we inhibit cancellation while waiting
|
|
pthread_cancel(wave_thread);
|
|
+ if (audiodev != NULL) audio_drain(audiodev);
|
|
WAVE_UNLOCK_NI;
|
|
}
|
|
|
|
@@ -917,7 +905,10 @@
|
|
}
|
|
|
|
/* At this point, no thread is running */
|
|
-
|
|
+
|
|
+ // Make sure audio device is closed
|
|
+ close_audiodev();
|
|
+
|
|
/* Free any wave data */
|
|
es_log(2, "s_clear: freeing wave data: %d", ac_tail);
|
|
for (i = 0; i < ac_tail; i++)
|