comparison src/alsa/audio.c @ 3147:a6a57fe6a75c

Fix last second(s) of playback getting lost, by Hans de Goede.
author Tony Vroon <chainsaw@gentoo.org>
date Sun, 10 May 2009 21:15:29 +0100
parents 919ec26c66c3
children 4b50e2a0ae1f
comparison
equal deleted inserted replaced
3146:87b0c47089e5 3147:a6a57fe6a75c
139 return 1; 139 return 1;
140 } 140 }
141 141
142 int alsa_playing(void) 142 int alsa_playing(void)
143 { 143 {
144 if (!going || paused || alsa_pcm == NULL) 144 if (!going || paused || prebuffer || alsa_pcm == NULL)
145 return FALSE; 145 return FALSE;
146 146
147 return snd_pcm_state(alsa_pcm) == SND_PCM_STATE_RUNNING && 147 return snd_pcm_state(alsa_pcm) == SND_PCM_STATE_RUNNING ||
148 !paused && 148 get_thread_buffer_filled();
149 !prebuffer &&
150 get_thread_buffer_filled() > hw_period_size_in;
151 } 149 }
152 150
153 static gint 151 static gint
154 alsa_recovery(gint err) 152 alsa_recovery(gint err)
155 { 153 {
645 /* transfer audio data from thread buffer to h/w */ 643 /* transfer audio data from thread buffer to h/w */
646 static void alsa_write_out_thread_data(void) 644 static void alsa_write_out_thread_data(void)
647 { 645 {
648 gint length, cnt, avail; 646 gint length, cnt, avail;
649 647
650 length = MIN(hw_period_size_in, get_thread_buffer_filled()); 648 length = get_thread_buffer_filled();
651 avail = snd_pcm_frames_to_bytes(alsa_pcm, alsa_get_avail()); 649 avail = snd_pcm_frames_to_bytes(alsa_pcm, alsa_get_avail());
652 length = MIN(length, avail); 650 length = MIN(length, avail);
653 while (length > 0) 651 while (length > 0)
654 { 652 {
655 int rd; 653 int rd;
675 673
676 while (going && alsa_pcm) 674 while (going && alsa_pcm)
677 { 675 {
678 if (get_thread_buffer_filled() > prebuffer_size) 676 if (get_thread_buffer_filled() > prebuffer_size)
679 prebuffer = FALSE; 677 prebuffer = FALSE;
680 if (!paused && !prebuffer && 678 if (!paused && !prebuffer && get_thread_buffer_filled())
681 get_thread_buffer_filled() > hw_period_size_in)
682 { 679 {
683 wr = snd_pcm_wait(alsa_pcm, 10); 680 wr = snd_pcm_wait(alsa_pcm, 10);
684 if (wr > 0) 681 if (wr > 0)
685 { 682 {
686 alsa_write_out_thread_data(); 683 alsa_write_out_thread_data();