Fix whitespace inconsistencies.
[herrie-working.git] / herrie / src / audio_output_ao.c
blob282c949134a67449c1a02813a6b8ce7a4ab40ac3
1 /*
2 * Copyright (c) 2006-2011 Ed Schouten <ed@80386.nl>
3 * All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
26 /**
27 * @file audio_output_ao.c
28 * @brief libao audio output driver.
31 #include "stdinc.h"
33 #include <ao/ao.h>
35 #include "audio_file.h"
36 #include "audio_output.h"
37 #include "config.h"
38 #include "gui.h"
40 /**
41 * @brief Handle to an audio device handle if one has already been opened.
43 static ao_device* devptr = NULL;
44 /**
45 * @brief Format of the current open audio device handle.
47 static ao_sample_format devfmt;
48 /**
49 * @brief Default options that should be prepended when opening the
50 * audio device.
52 static ao_option *devopt = NULL;
54 int
55 audio_output_open(void)
57 const char *host;
58 char *henv, *hend;
60 ao_initialize();
62 /* We always expect 16 bits native endian PCM */
63 devfmt.bits = 16;
64 devfmt.byte_format = AO_FMT_NATIVE;
66 host = config_getopt("audio.output.ao.host");
67 if (strcmp(host, "env_ssh") == 0) {
68 /* Fetch "host" option from SSH_CLIENT variable */
69 henv = g_strdup(getenv("SSH_CLIENT"));
70 if (henv != NULL) {
71 /* Remove the trailing port number */
72 if ((hend = strchr(henv, ' ')) != NULL)
73 *hend = '\0';
74 ao_append_option(&devopt, "host", henv);
75 g_free(henv);
77 } else if (host[0] != '\0') {
78 /* Use the value as the hostname */
79 ao_append_option(&devopt, "host", host);
82 return (0);
85 int
86 audio_output_play(struct audio_file *fd)
88 const char *drvname;
89 int16_t buf[2048];
90 int len, drvnum;
92 if ((len = audio_file_read(fd, buf, sizeof buf / sizeof(int16_t))) == 0)
93 return (-1);
95 if ((unsigned int)devfmt.rate != fd->srate ||
96 (unsigned int)devfmt.channels != fd->channels) {
97 /* Sample rate or amount of channels has changed */
98 audio_output_close();
100 devfmt.rate = fd->srate;
101 devfmt.channels = fd->channels;
104 if (devptr == NULL) {
105 drvname = config_getopt("audio.output.ao.driver");
106 if (drvname[0] != '\0') {
107 /* User specified driver */
108 drvnum = ao_driver_id(drvname);
109 } else {
110 /* Default driver */
111 drvnum = ao_default_driver_id();
114 devptr = ao_open_live(drvnum, &devfmt, devopt);
115 if (devptr == NULL) {
116 gui_msgbar_warn(_("Cannot open the audio device."));
117 return (-1);
121 if (ao_play(devptr, (char *)buf, len * sizeof(int16_t)) == 0) {
122 /* No success - device must be closed */
123 audio_output_close();
124 return (-1);
127 return (0);
130 void
131 audio_output_close(void)
133 if (devptr != NULL) {
134 /* Close device */
135 ao_close(devptr);
136 devptr = NULL;