1 /* XMMS2 - X Music Multiplexer System
2 * Copyright (C) 2003-2007 XMMS2 Team
4 * PLUGINS ARE NOT CONSIDERED TO BE DERIVED WORK !!!
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
18 #include "xmms/xmms_outputplugin.h"
19 #include "xmms/xmms_log.h"
23 #define BUILD_TARGET_ARM 1
25 #include "generic-nms.h"
26 #include "nmsplugin.h"
27 #include "plugin-internals.h"
32 #define SAMPLERATE 44100
36 typedef struct xmms_nms_data_t {
44 static gboolean xmms_nms_plugin_setup (xmms_output_plugin_t *output_plugin);
45 static gboolean xmms_nms_new (xmms_output_t *output);
46 static void xmms_nms_destroy (xmms_output_t *output);
47 static void xmms_nms_flush (xmms_output_t *output);
48 static gboolean xmms_nms_open (xmms_output_t *output);
49 static void xmms_nms_close (xmms_output_t *output);
50 static void xmms_nms_write (xmms_output_t *output, gpointer buffer, gint len, xmms_error_t *err);
51 static gboolean xmms_nms_format_set (xmms_output_t *output, const xmms_stream_type_t *format);
56 XMMS_OUTPUT_PLUGIN ("nms",
59 "Neuros output plugin",
60 xmms_nms_plugin_setup);
63 xmms_nms_plugin_setup (xmms_output_plugin_t *plugin)
65 xmms_output_methods_t methods;
67 XMMS_OUTPUT_METHODS_INIT (methods);
68 methods.new = xmms_nms_new;
69 methods.destroy = xmms_nms_destroy;
70 methods.flush = xmms_nms_flush;
72 methods.open = xmms_nms_open;
73 methods.close = xmms_nms_close;
74 methods.format_set = xmms_nms_format_set;
75 methods.write = xmms_nms_write;
77 xmms_output_plugin_methods_set (plugin, &methods);
83 xmms_nms_new (xmms_output_t *output)
85 xmms_nms_data_t *data;
87 g_return_val_if_fail (output, FALSE);
88 data = g_new0 (xmms_nms_data_t, 1);
89 g_return_val_if_fail (data, FALSE);
91 xmms_output_format_add (output, XMMS_SAMPLE_FORMAT_S16, CHANNELS, SAMPLERATE);
92 xmms_output_private_data_set (output, data);
98 xmms_nms_destroy (xmms_output_t *output)
100 xmms_nms_data_t *data;
102 g_return_if_fail (output);
103 data = xmms_output_private_data_get (output);
104 g_return_if_fail (data);
109 xmms_nms_flush (xmms_output_t *output)
111 /* not implemented */
115 xmms_nms_open (xmms_output_t *output)
117 static media_desc_t desc = {
119 .audio_type = NMS_AC_PCM,
120 .num_channels = CHANNELS,
121 .sample_rate = SAMPLERATE,
122 .bitrate = CHANNELS * SAMPLERATE * 16,
125 .video_type = NMS_VC_NO_VIDEO,
131 .subtitle_type = NMS_SC_NO_SUBTITLE,
135 XMMS_DBG ("Opening audio device");
139 if (OutputSelect (NMS_PLUGIN_MULTIMEDIA)) {
140 xmms_log_error ("Error selecting multimedia plugin");
145 if (OutputInit (&desc, 0)) {
146 xmms_log_error ("Error opening output");
156 xmms_nms_close (xmms_output_t *output)
162 xmms_nms_write (xmms_output_t *output, gpointer buffer, gint len, xmms_error_t *err)
164 xmms_nms_data_t *data;
166 g_return_if_fail (output);
167 data = xmms_output_private_data_get (output);
168 g_return_if_fail (data);
170 /* What is the size of buffer? */
172 while (OutputGetBuffer (&data->buf, 1000, 0))
175 memcpy (data->buf.abuf.data, buffer, len);
176 data->buf.abuf.size = len;
177 data->buf.curbuf = &data->buf.abuf;
179 OutputWrite (&data->buf);
183 xmms_nms_format_set (xmms_output_t *output, const xmms_stream_type_t *format)
185 gint sformat, channels, srate;
187 sformat = xmms_stream_type_get_int (format, XMMS_STREAM_TYPE_FMT_FORMAT);
188 channels = xmms_stream_type_get_int (format, XMMS_STREAM_TYPE_FMT_CHANNELS);
189 srate = xmms_stream_type_get_int (format, XMMS_STREAM_TYPE_FMT_SAMPLERATE);
191 if (sformat != XMMS_SAMPLE_FORMAT_S16) {
192 xmms_log_error ("Bad sample format!");
195 if (channels != CHANNELS) {
196 xmms_log_error ("Bad number of channels!");
199 if (srate != SAMPLERATE) {
200 xmms_log_error ("Bad samplerate!");