Mercurial > audlegacy-plugins
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(); |
