OTHER: Make the sidplay rpath checks use realpath.
[xmms2-devel.git] / src / plugins / nms / nms.c
1 /*  XMMS2 - X Music Multiplexer System
2  *  Copyright (C) 2003-2007 XMMS2 Team
3  *
4  *  PLUGINS ARE NOT CONSIDERED TO BE DERIVED WORK !!!
5  *
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.
10  *
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.
15  */
16
17
18 #include "xmms/xmms_outputplugin.h"
19 #include "xmms/xmms_log.h"
20
21 #include <string.h>
22
23 #define BUILD_TARGET_ARM 1
24
25 #include "generic-nms.h"
26 #include "nmsplugin.h"
27 #include "plugin-internals.h"
28 /*
29  * Type definitions
30  */
31
32 #define SAMPLERATE 44100
33 #define CHANNELS 2
34
35
36 typedef struct xmms_nms_data_t {
37         media_buf_t buf;
38 } xmms_nms_data_t;
39
40 /*
41  * Function prototypes
42  */
43
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);
52
53 /*
54  * Plugin header
55  */
56 XMMS_OUTPUT_PLUGIN ("nms",
57                     "NMS output",
58                     XMMS_VERSION,
59                     "Neuros output plugin",
60                     xmms_nms_plugin_setup);
61
62 static gboolean
63 xmms_nms_plugin_setup (xmms_output_plugin_t *plugin)
64 {
65         xmms_output_methods_t methods;
66
67         XMMS_OUTPUT_METHODS_INIT (methods);
68         methods.new = xmms_nms_new;
69         methods.destroy = xmms_nms_destroy;
70         methods.flush = xmms_nms_flush;
71
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;
76
77         xmms_output_plugin_methods_set (plugin, &methods);
78
79         return TRUE;
80 }
81
82 static gboolean
83 xmms_nms_new (xmms_output_t *output)
84 {
85         xmms_nms_data_t *data;
86
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);
90
91         xmms_output_format_add (output, XMMS_SAMPLE_FORMAT_S16, CHANNELS, SAMPLERATE);
92         xmms_output_private_data_set (output, data);
93
94         return TRUE;
95 }
96
97 static void
98 xmms_nms_destroy (xmms_output_t *output)
99 {
100         xmms_nms_data_t *data;
101
102         g_return_if_fail (output);
103         data = xmms_output_private_data_get (output);
104         g_return_if_fail (data);
105         g_free (data);
106 }
107
108 static void
109 xmms_nms_flush (xmms_output_t *output)
110 {
111         /* not implemented */
112 }
113
114 static gboolean
115 xmms_nms_open (xmms_output_t *output)
116 {
117         static media_desc_t desc = {
118                 .adesc = {
119                         .audio_type = NMS_AC_PCM,
120                         .num_channels = CHANNELS,
121                         .sample_rate = SAMPLERATE,
122                         .bitrate = CHANNELS * SAMPLERATE * 16,
123                 },
124                 .vdesc = {
125                         .video_type = NMS_VC_NO_VIDEO,
126                         .width = 0,
127                         .height = 0,
128                         .frame_rate = 0,
129                 },
130                 .sdesc = {
131                         .subtitle_type = NMS_SC_NO_SUBTITLE,
132                 },
133         };
134
135         XMMS_DBG ("Opening audio device");
136
137         PluginLoad ();
138
139         if (OutputSelect (NMS_PLUGIN_MULTIMEDIA)) {
140                 xmms_log_error ("Error selecting multimedia plugin");
141                 return FALSE;
142         }
143
144
145         if (OutputInit (&desc, 0)) {
146                 xmms_log_error ("Error opening output");
147                 return FALSE;
148         }
149
150         OutputStart ();
151
152         return TRUE;
153 }
154
155 static void
156 xmms_nms_close (xmms_output_t *output)
157 {
158         OutputFinish (1);
159 }
160
161 static void
162 xmms_nms_write (xmms_output_t *output, gpointer buffer, gint len, xmms_error_t *err)
163 {
164         xmms_nms_data_t *data;
165
166         g_return_if_fail (output);
167         data = xmms_output_private_data_get (output);
168         g_return_if_fail (data);
169
170         /* What is the size of buffer? */
171
172         while (OutputGetBuffer (&data->buf, 1000, 0))
173                 ;
174
175         memcpy (data->buf.abuf.data, buffer, len);
176         data->buf.abuf.size = len;
177         data->buf.curbuf = &data->buf.abuf;
178
179         OutputWrite (&data->buf);
180 }
181
182 static gboolean
183 xmms_nms_format_set (xmms_output_t *output, const xmms_stream_type_t *format)
184 {
185         gint sformat, channels, srate;
186
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);
190
191         if (sformat != XMMS_SAMPLE_FORMAT_S16) {
192                 xmms_log_error ("Bad sample format!");
193                 return FALSE;
194         }
195         if (channels != CHANNELS) {
196                 xmms_log_error ("Bad number of channels!");
197                 return FALSE;
198         }
199         if (srate != SAMPLERATE) {
200                 xmms_log_error ("Bad samplerate!");
201                 return FALSE;
202         }
203
204         return TRUE;
205 }
206