summaryrefslogtreecommitdiff
path: root/src/sound.c
diff options
context:
space:
mode:
authorJan Djärv <jan.h.d@swipnet.se>2007-03-06 12:15:33 +0000
committerJan Djärv <jan.h.d@swipnet.se>2007-03-06 12:15:33 +0000
commita28de2572ea46ee103b73095be06538272903872 (patch)
tree38557b52c6b0f495bb5ce8f2f331bf0f0606ae3d /src/sound.c
parent0868f2129382fd2535c41255c12305a7c0ab5151 (diff)
downloademacs-a28de2572ea46ee103b73095be06538272903872.tar.gz
* sound.c (wav_play): Check header->data_length to see how much we
shall read. (alsa_period_size): Convert ALSA period size in frames to bytes. (alsa_write): Return if frames is zero.
Diffstat (limited to 'src/sound.c')
-rw-r--r--src/sound.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/src/sound.c b/src/sound.c
index 7fb79e64048..5a27e7a6232 100644
--- a/src/sound.c
+++ b/src/sound.c
@@ -621,12 +621,18 @@ wav_play (s, sd)
char *buffer;
int nbytes;
int blksize = sd->period_size ? sd->period_size (sd) : 2048;
+ int data_left = header->data_length;
buffer = (char *) alloca (blksize);
lseek (s->fd, sizeof *header, SEEK_SET);
-
- while ((nbytes = emacs_read (s->fd, buffer, blksize)) > 0)
- sd->write (sd, buffer, nbytes);
+ while (data_left > 0
+ && (nbytes = emacs_read (s->fd, buffer, blksize)) > 0)
+ {
+ /* Don't play possible garbage at the end of file */
+ if (data_left < nbytes) nbytes = data_left;
+ data_left -= nbytes;
+ sd->write (sd, buffer, nbytes);
+ }
if (nbytes < 0)
sound_perror ("Error reading sound file");
@@ -986,7 +992,8 @@ alsa_period_size (sd)
struct sound_device *sd;
{
struct alsa_params *p = (struct alsa_params *) sd->data;
- return p->period_size;
+ int fact = snd_pcm_format_size (sd->format, 1) * sd->channels;
+ return p->period_size * (fact > 0 ? fact : 1);
}
static void
@@ -1209,9 +1216,10 @@ alsa_write (sd, buffer, nbytes)
while (nwritten < nbytes)
{
- err = snd_pcm_writei (p->handle,
- buffer + nwritten,
- (nbytes - nwritten)/fact);
+ snd_pcm_uframes_t frames = (nbytes - nwritten)/fact;
+ if (frames == 0) break;
+
+ err = snd_pcm_writei (p->handle, buffer + nwritten, frames);
if (err < 0)
{
if (err == -EPIPE)