source: roaraudio/plugins/xmms/roar.c @ 455:2aca84291306

Last change on this file since 455:2aca84291306 was 455:2aca84291306, checked in by phi, 16 years ago

added roar_get_output_time() and roar_get_written_time()

File size: 3.5 KB
Line 
1//roar.c:
2
3#include <roaraudio.h>
4
5//#include "xmms/i18n.h"
6#include <gtk/gtk.h>
7#include <stdio.h>
8#include <string.h>
9
10#include "xmms/plugin.h"
11#include "xmms/xmmsctrl.h"
12#include "xmms/dirbrowser.h"
13#include "xmms/configfile.h"
14#include "xmms/util.h"
15
16void roar_init(void);
17void roar_about(void);
18void roar_configure(void);
19
20void roar_get_volume(int *l, int *r);
21void roar_fetch_volume(int *l, int *r);
22void roar_set_volume(int l, int r);
23void roar_mixer_init(void);
24void roar_mixer_init_vol(int l, int r);
25
26int roar_playing(void);
27int roar_free(void);
28void roar_write(void *ptr, int length);
29void roar_close(void);
30void roar_flush(int time);
31void roar_pause(short p);
32int roar_open(AFormat fmt, int rate, int nch);
33int roar_get_output_time(void);
34int roar_get_written_time(void);
35void roar_set_audio_params(void);
36
37
38OutputPlugin roar_op = {
39        NULL,
40        NULL,
41        "RoarAudio XMMS Plugin", /* Description */
42        roar_init,
43        NULL, //roar_about,
44        NULL, //roar_configure,
45        NULL, //roar_get_volume,
46        NULL, //roar_set_volume,
47        roar_open,
48        roar_write,
49        roar_close,
50        NULL, //roar_flush,
51        NULL, //roar_pause,
52        roar_free,
53        roar_playing,
54        roar_get_output_time,
55        roar_get_written_time,
56};
57
58#define STATE_CONNECTED 1
59#define STATE_PLAYING   2
60
61struct xmms_roar_out {
62 int state;
63 char * server;
64 struct roar_connection con;
65 struct roar_stream     stream;
66 int data_fh;
67 long int written;
68 int bps;
69} g_inst;
70
71OutputPlugin *get_oplugin_info(void) {
72 return &roar_op;
73}
74
75void roar_init(void) {
76 g_inst.state = 0;
77 g_inst.server = NULL;
78 ROAR_WARN("roar_init(*) = (void)");
79}
80
81int roar_playing(void) {
82 return g_inst.state & STATE_PLAYING ? TRUE : FALSE;
83}
84
85void roar_write(void *ptr, int length) {
86 int r;
87 if ( (r = write(g_inst.data_fh, ptr, length)) != -1 )
88  g_inst.written += r;
89}
90
91int roar_open(AFormat fmt, int rate, int nch) {
92 int codec = ROAR_CODEC_DEFAULT;
93 int bits;
94
95 if ( !(g_inst.state & STATE_CONNECTED) ) {
96  if ( roar_simple_connect(&(g_inst.con), g_inst.server, "XMMS") == -1 ) {
97   return FALSE;
98  }
99  g_inst.state |= STATE_CONNECTED;
100 }
101
102  bits = 16;
103  switch (fmt) {
104   case FMT_S8:
105     bits = 8;
106     codec = ROAR_CODEC_DEFAULT;
107    break;
108   case FMT_U8:
109     bits = 8;
110     codec = ROAR_CODEC_PCM_S_LE; // _LE, _BE, _PDP,... all the same for 8 bit output
111    break;
112   case FMT_U16_LE:
113     codec = ROAR_CODEC_PCM_U_LE;
114    break;
115   case FMT_U16_BE:
116     codec = ROAR_CODEC_PCM_U_BE;
117    break;
118   case FMT_U16_NE:
119#if BYTE_ORDER == BIG_ENDIAN
120     codec = ROAR_CODEC_PCM_U_BE;
121#elif BYTE_ORDER == LITTLE_ENDIAN
122     codec = ROAR_CODEC_PCM_U_LE;
123#else
124     codec = ROAR_CODEC_PCM_U_PDP;
125#endif
126    break;
127   case FMT_S16_LE:
128     codec = ROAR_CODEC_PCM_S_LE;
129    break;
130   case FMT_S16_BE:
131     codec = ROAR_CODEC_PCM_S_BE;
132    break;
133   case FMT_S16_NE:
134     codec = ROAR_CODEC_DEFAULT;
135    break;
136 }
137
138 g_inst.bps = nch * rate * bits / 8;
139
140 if ( (g_inst.data_fh = roar_simple_new_stream_obj(&(g_inst.con), &(g_inst.stream),
141                              rate, nch, bits, codec, ROAR_DIR_PLAY)) == -1) {
142  return FALSE;
143 }
144 g_inst.state |= STATE_PLAYING;
145
146 g_inst.written = 0;
147
148 return TRUE;
149}
150
151void roar_close(void) {
152 close(g_inst.data_fh);
153 g_inst.state |= STATE_PLAYING;
154 g_inst.state -= STATE_PLAYING;
155 g_inst.written = 0;
156}
157
158void roar_pause(short p);
159
160int roar_free(void) {
161 return 1000000; // ???
162}
163
164int roar_get_output_time(void) {
165 return roar_get_written_time();
166}
167int roar_get_written_time(void) {
168 return (g_inst.written * 1000) / g_inst.bps;
169}
170
171//ll
Note: See TracBrowser for help on using the repository browser.