Ticket #80: roar-mpd.patch
File roar-mpd.patch, 11.0 KB (added by themaister, 13 years ago) |
---|
-
Makefile.am
diff --git a/Makefile.am b/Makefile.am index 0966a2a..0e8f004 100644
a b mpd_headers = \ 138 138 src/output/httpd_client.h \ 139 139 src/output/httpd_internal.h \ 140 140 src/output/pulse_output_plugin.h \ 141 src/output/roar_output_plugin.h \ 141 142 src/output/winmm_output_plugin.h \ 142 143 src/page.h \ 143 144 src/pcm_buffer.h \ … … OUTPUT_LIBS = \ 654 655 $(LIBWRAP_LDFLAGS) \ 655 656 $(AO_LIBS) \ 656 657 $(ALSA_LIBS) \ 658 $(ROAR_LIBS) \ 657 659 $(FFADO_LIBS) \ 658 660 $(JACK_LIBS) \ 659 661 $(OPENAL_LIBS) \ … … OUTPUT_SRC += src/output/alsa_plugin.c 687 689 MIXER_SRC += src/mixer/alsa_mixer_plugin.c 688 690 endif 689 691 692 if HAVE_ROAR 693 OUTPUT_SRC += src/output/roar_plugin.c 694 MIXER_SRC += src/mixer/roar_mixer_plugin.c 695 endif 696 690 697 if ENABLE_FFADO_OUTPUT 691 698 OUTPUT_SRC += src/output/ffado_output_plugin.c 692 699 endif -
configure.ac
diff --git a/configure.ac b/configure.ac index ab1410d..e16670d 100644
a b AC_ARG_ENABLE(alsa, 120 120 AS_HELP_STRING([--enable-alsa], [enable ALSA support]),, 121 121 [enable_alsa=auto]) 122 122 123 AC_ARG_ENABLE(roar, 124 AS_HELP_STRING([--enable-roar], 125 [enable support for RoarAudio]),, 126 [enable_roar=auto]) 127 123 128 AC_ARG_ENABLE(ao, 124 129 AS_HELP_STRING([--enable-ao], 125 130 [enable support for libao]),, … … fi 1209 1214 1210 1215 AM_CONDITIONAL(HAVE_ALSA, test x$enable_alsa = xyes) 1211 1216 1217 dnl ----------------------------------- ROAR ---------------------------------- 1218 MPD_AUTO_PKG(roar, ROAR, [libroar >= 0.4.0], 1219 [ROAR output plugin], [libroar not found]) 1220 1221 if test x$enable_roar = xyes; then 1222 AC_DEFINE(HAVE_ROAR, 1, [Define to enable ROAR support]) 1223 fi 1224 1225 AM_CONDITIONAL(HAVE_ROAR, test x$enable_roar = xyes) 1226 1212 1227 dnl ----------------------------------- FFADO --------------------------------- 1213 1228 1214 1229 MPD_AUTO_PKG(ffado, FFADO, [libffado], … … AM_CONDITIONAL(ENABLE_WINMM_OUTPUT, test x$enable_winmm_output = xyes) 1409 1424 dnl --------------------- Post Audio Output Plugins Tests --------------------- 1410 1425 if 1411 1426 test x$enable_alsa = xno && 1427 test x$enable_roar = xno && 1412 1428 test x$enable_ao = xno && 1413 1429 test x$enable_ffado = xno && 1414 1430 test x$enable_fifo = xno && … … results(id3,[ID3]) 1545 1561 1546 1562 echo -en '\nPlayback support:\n\t' 1547 1563 results(alsa,ALSA) 1564 results(roar,ROAR) 1548 1565 results(ffado,FFADO) 1549 1566 results(fifo,FIFO) 1550 1567 results(recorder_output,[File Recorder]) -
new file src/mixer/roar_mixer_plugin.c
diff --git a/src/mixer/roar_mixer_plugin.c b/src/mixer/roar_mixer_plugin.c new file mode 100644 index 0000000..70015ba
- + 1 /* 2 * Copyright (C) 2003-2010 The Music Player Daemon Project 3 * http://www.musicpd.org 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License along 16 * with this program; if not, write to the Free Software Foundation, Inc., 17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 18 */ 19 20 #include "config.h" 21 #include "mixer_api.h" 22 #include "output_api.h" 23 #include "output/roar_output_plugin.h" 24 25 #include <glib.h> 26 27 #include <assert.h> 28 #include <sys/stat.h> 29 #include <sys/ioctl.h> 30 #include <fcntl.h> 31 #include <errno.h> 32 #include <stdlib.h> 33 #include <unistd.h> 34 35 typedef struct roar_mpd_mixer 36 { 37 /** the base mixer class */ 38 struct mixer base; 39 roar_vs_t *vss; 40 } roar_mixer_t; 41 42 /** 43 * The quark used for GError.domain. 44 */ 45 static inline GQuark 46 roar_mixer_quark(void) 47 { 48 return g_quark_from_static_string("oss_mixer"); 49 } 50 51 static struct mixer * 52 roar_mixer_init(void *ao, G_GNUC_UNUSED const struct config_param *param, 53 G_GNUC_UNUSED GError **error_r) 54 { 55 roar_mixer_t *self = g_new(roar_mixer_t, 1); 56 self->vss = ao; 57 58 mixer_init(&self->base, &roar_mixer_plugin); 59 60 return &self->base; 61 } 62 63 static void 64 roar_mixer_finish(struct mixer *data) 65 { 66 roar_mixer_t *self = (roar_mixer_t *) data; 67 68 g_free(self); 69 } 70 71 static void 72 roar_mixer_close(G_GNUC_UNUSED struct mixer *data) 73 { 74 } 75 76 static bool 77 roar_mixer_open(G_GNUC_UNUSED struct mixer *data, G_GNUC_UNUSED GError **error_r) 78 { 79 return true; 80 } 81 82 static int 83 roar_mixer_get_volume(struct mixer *mixer, G_GNUC_UNUSED GError **error_r) 84 { 85 roar_mixer_t *self = (roar_mixer_t *)mixer; 86 assert(self->vss); 87 88 float l, r; 89 int error; 90 int rc = roar_vs_volume_get(self->vss, &l, &r, &error); 91 fprintf(stderr, "Volume GET: %.2f %.2f\n", l, r); 92 fprintf(stderr, "rc = %d\n", rc); 93 fprintf(stderr, "Error: %d\n", error); 94 return (l + r) * 50; 95 } 96 97 static bool 98 roar_mixer_set_volume(struct mixer *mixer, unsigned volume, G_GNUC_UNUSED GError **error_r) 99 { 100 roar_mixer_t *self = (roar_mixer_t *)mixer; 101 assert(self->vss); 102 assert(volume <= 100); 103 104 int error; 105 float level = volume / 100.0; 106 fprintf(stderr, "Volume SET: %.2f\n", level); 107 108 int rc = roar_vs_volume_mono(self->vss, level, &error); 109 fprintf(stderr, "rc = %d\n", rc); 110 fprintf(stderr, "error = %d\n", error); 111 return true; 112 } 113 114 const struct mixer_plugin roar_mixer_plugin = { 115 .init = roar_mixer_init, 116 .finish = roar_mixer_finish, 117 .open = roar_mixer_open, 118 .close = roar_mixer_close, 119 .get_volume = roar_mixer_get_volume, 120 .set_volume = roar_mixer_set_volume, 121 .global = true, 122 }; -
src/mixer_list.h
diff --git a/src/mixer_list.h b/src/mixer_list.h index a472c88..9bb2d9a 100644
a b 28 28 extern const struct mixer_plugin software_mixer_plugin; 29 29 extern const struct mixer_plugin alsa_mixer_plugin; 30 30 extern const struct mixer_plugin oss_mixer_plugin; 31 extern const struct mixer_plugin roar_mixer_plugin; 31 32 extern const struct mixer_plugin pulse_mixer_plugin; 32 33 extern const struct mixer_plugin winmm_mixer_plugin; 33 34 -
new file src/output/roar_output_plugin.h
diff --git a/src/output/roar_output_plugin.h b/src/output/roar_output_plugin.h new file mode 100644 index 0000000..9f4b480
- + 1 #ifndef __ROAR_OUTPUT_H 2 #define __ROAR_OUTPUT_H 3 4 #include <roaraudio.h> 5 6 typedef struct roar 7 { 8 roar_vs_t * vss; 9 int err; 10 char *host; 11 char *name; 12 } roar_t; 13 14 #endif -
new file src/output/roar_plugin.c
diff --git a/src/output/roar_plugin.c b/src/output/roar_plugin.c new file mode 100644 index 0000000..aeda5e3
- + 1 //roar_plugin.c: 2 /* 3 * Copyright (C) 2003-2010 The Music Player Daemon Project 4 * copyright (c) 2010 Philipp 'ph3-der-loewe' Schafft 5 * copyright (c) 2010 Hans-Kristian 'maister' Arntzen 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation; either version 2 of the License, or 10 * (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License along 18 * with this program; if not, write to the Free Software Foundation, Inc., 19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 20 */ 21 22 #include "config.h" 23 #include "output_api.h" 24 #include "mixer_list.h" 25 #include "roar_output_plugin.h" 26 27 #include <glib.h> 28 #include <sys/types.h> 29 #include <sys/socket.h> 30 #include <arpa/inet.h> 31 #include <netdb.h> 32 #include <stdint.h> 33 #include <fcntl.h> 34 #include <unistd.h> 35 #include <stdlib.h> 36 #include <string.h> 37 #include <stdint.h> 38 39 40 #undef G_LOG_DOMAIN 41 #define G_LOG_DOMAIN "roaraudio" 42 43 static inline GQuark 44 roar_output_quark(void) 45 { 46 return g_quark_from_static_string("roar_output"); 47 } 48 49 static void 50 roar_configure(struct roar * self, const struct config_param *param) 51 { 52 self->host = config_dup_block_string(param, "server", NULL); 53 self->name = config_dup_block_string(param, "name", "MPD"); 54 } 55 56 static void * 57 roar_init(G_GNUC_UNUSED const struct audio_format *audio_format, 58 const struct config_param *param, 59 G_GNUC_UNUSED GError **error) 60 { 61 roar_t * self = roar_mm_calloc(1, sizeof(*self)); 62 63 if (self == NULL) 64 return NULL; 65 66 self->err = ROAR_ERROR_NONE; 67 roar_configure(self, param); 68 return self; 69 } 70 71 static void 72 roar_close(void *data) 73 { 74 roar_t * self = data; 75 76 if (self->vss != NULL) 77 { 78 roar_vs_close(self->vss, ROAR_VS_FALSE, &(self->err)); 79 self->vss = NULL; 80 } 81 } 82 83 static void 84 roar_finish(void *data) 85 { 86 roar_t * self = data; 87 88 roar_close(data); 89 90 if (self->host != NULL) 91 g_free(self->host); 92 if (self->name != NULL) 93 g_free(self->name); 94 95 roar_mm_free(data); 96 } 97 98 static bool 99 roar_open(void *data, struct audio_format *audio_format, GError **error) 100 { 101 roar_t * self = data; 102 103 self->vss = roar_vs_new_simple(self->host, self->name, audio_format->sample_rate, audio_format->channels, ROAR_CODEC_DEFAULT, 16, ROAR_DIR_PLAY, &(self->err)); 104 105 if (self->vss == NULL || self->err != ROAR_ERROR_NONE) 106 { 107 g_set_error(error, roar_output_quark(), 0, "Failed to connect to server"); 108 return false; 109 } 110 111 audio_format->format = SAMPLE_FORMAT_S16; 112 audio_format->reverse_endian = 0; 113 114 return true; 115 } 116 117 // Here we should reopen stream properly. 118 static void 119 roar_cancel(G_GNUC_UNUSED void *data) 120 { 121 } 122 123 static size_t 124 roar_play(void *data, const void *chunk, size_t size, GError **error) 125 { 126 struct roar * self = data; 127 ssize_t rc; 128 129 rc = roar_vs_write(self->vss, chunk, size, &(self->err)); 130 if ( rc <= 0 ) 131 { 132 g_set_error(error, roar_output_quark(), 0, "Failed to play data"); 133 return 0; 134 } 135 136 return rc; 137 } 138 139 const struct audio_output_plugin roar_output_plugin = { 140 .name = "roar", 141 .init = roar_init, 142 .finish = roar_finish, 143 .open = roar_open, 144 .play = roar_play, 145 .cancel = roar_cancel, 146 .close = roar_close, 147 148 .mixer_plugin = &roar_mixer_plugin 149 }; 150 151 -
src/output_list.c
diff --git a/src/output_list.c b/src/output_list.c index 8238f58..ef8847d 100644
a b extern const struct audio_output_plugin null_output_plugin; 26 26 extern const struct audio_output_plugin fifo_output_plugin; 27 27 extern const struct audio_output_plugin pipe_output_plugin; 28 28 extern const struct audio_output_plugin alsaPlugin; 29 extern const struct audio_output_plugin roar_output_plugin; 29 30 extern const struct audio_output_plugin ao_output_plugin; 30 31 extern const struct audio_output_plugin oss_output_plugin; 31 32 extern const struct audio_output_plugin openal_output_plugin; … … const struct audio_output_plugin *audio_output_plugins[] = { 53 54 #ifdef HAVE_ALSA 54 55 &alsaPlugin, 55 56 #endif 57 #ifdef HAVE_ROAR 58 &roar_output_plugin, 59 #endif 56 60 #ifdef HAVE_AO 57 61 &ao_output_plugin, 58 62 #endif