{
/* ASCII ".snd" */
u_int32_t magic_number;
-
+
/* Offset of data part from start of file. Minimum value is 24. */
u_int32_t data_offset;
-
+
/* Size of data part, 0xffffffff if unknown. */
u_int32_t data_size;
/* 1 = mono, 2 = stereo, 0 = don't set. */
int channels;
-
+
/* Open device SD. */
void (* open) P_ ((struct sound_device *sd));
/* Configure SD accoring to device-dependent parameters. */
void (* configure) P_ ((struct sound_device *device));
-
+
/* Choose a device-dependent format for outputting sound S. */
void (* choose_format) P_ ((struct sound_device *sd,
struct sound *s));
Lisp_Object data;
/* Play sound file S on device SD. */
- void (* play) P_ ((struct sound *s, struct sound_device *sd));
+ void (* play) P_ ((struct sound *s, struct sound_device *sd));
};
/* Indices of attributes in a sound attributes vector. */
else
{
s.data = attrs[SOUND_DATA];
- bcopy (XSTRING (s.data)->data, s.header,
- min (MAX_SOUND_HEADER_BYTES, STRING_BYTES (XSTRING (s.data))));
+ s.header_size = min (MAX_SOUND_HEADER_BYTES, STRING_BYTES (XSTRING (s.data)));
+ bcopy (XSTRING (s.data)->data, s.header, s.header_size);
}
/* Find out the type of sound. Give up if we can't tell. */
sd.file = (char *) alloca (len + 1);
strcpy (sd.file, XSTRING (attrs[SOUND_DEVICE])->data);
}
-
+
if (INTEGERP (attrs[SOUND_VOLUME]))
sd.volume = XFASTINT (attrs[SOUND_VOLUME]);
else if (FLOATP (attrs[SOUND_VOLUME]))
s->play = wav_play;
return 1;
-}
+}
/* Play RIFF-WAVE audio file S on sound device SD. */
/* Let the device choose a suitable device-dependent format
for the file. */
sd->choose_format (sd, s);
-
+
/* Configure the device. */
sd->sample_size = header->sample_size;
sd->sample_rate = header->sample_rate;
char *buffer;
int nbytes;
int blksize = 2048;
-
+
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);
Sun Audio (*.au)
***********************************************************************/
-/* Sun audio file encodings. */
+/* Sun audio file encodings. */
enum au_encoding
{
struct sound *s;
{
struct au_header *header = (struct au_header *) s->header;
-
+
if (s->header_size < sizeof *header
|| bcmp (s->header, ".snd", 4) != 0)
return 0;
-
+
header->magic_number = be2hl (header->magic_number);
header->data_offset = be2hl (header->data_offset);
header->data_size = be2hl (header->data_size);
header->encoding = be2hl (header->encoding);
header->sample_rate = be2hl (header->sample_rate);
header->channels = be2hl (header->channels);
-
+
/* Set up the interface functions for AU. */
s->type = SUN_AUDIO;
s->play = au_play;
int blksize = 2048;
char *buffer;
int nbytes;
-
+
/* Seek */
lseek (s->fd, header->data_offset, SEEK_SET);
-
+
/* Copy sound data to the device. */
buffer = (char *) alloca (blksize);
while ((nbytes = emacs_read (s->fd, buffer, blksize)) > 0)
sd->write (sd, buffer, nbytes);
-
+
if (nbytes < 0)
sound_perror ("Error reading sound file");
}
struct sound_device *sd;
{
char *file;
-
+
/* Open the sound device. Default is /dev/dsp. */
if (sd->file)
file = sd->file;
else
file = DEFAULT_SOUND_DEVICE;
-
+
sd->fd = emacs_open (file, O_WRONLY, 0);
if (sd->fd < 0)
sound_perror (file);
struct sound_device *sd;
{
int val;
-
+
xassert (sd->fd >= 0);
/* On GNU/Linux, it seems that the device driver doesn't like to be
/* This may fail if there is no mixer. Ignore the failure. */
ioctl (sd->fd, SOUND_MIXER_WRITE_PCM, &volume);
}
-
+
turn_on_atimers (1);
#ifdef SIGIO
sigunblock (sigmask (SIGIO));
sigblock (sigmask (SIGIO));
#endif
turn_on_atimers (0);
-
+
/* Flush sound data, and reset the device. */
ioctl (sd->fd, SNDCTL_DSP_SYNC, NULL);
-
+
turn_on_atimers (1);
#ifdef SIGIO
sigunblock (sigmask (SIGIO));
case AU_ENCODING_IEEE64:
sd->format = AFMT_MU_LAW;
break;
-
+
case AU_ENCODING_8:
case AU_ENCODING_16:
case AU_ENCODING_24: