source: roaraudio/libroar/simple.c @ 487:a25cdf58b8fe

Last change on this file since 487:a25cdf58b8fe was 487:a25cdf58b8fe, checked in by phi, 16 years ago

added Af_INET support to roar_simple_new_stream_obj()

File size: 4.6 KB
Line 
1//simple.c:
2
3#include "libroar.h"
4
5int roar_simple_connect (struct roar_connection * con, char * server, char * name) {
6
7 ROAR_DBG("roar_simple_connect(*): trying to connect...");
8
9 if ( roar_connect(con, server) == -1 ) {
10  ROAR_DBG("roar_simple_connect(*): roar_connect() faild!");
11  return -1;
12 }
13
14 if ( roar_identify(con, name) == -1 ) {
15  ROAR_DBG("roar_simple_connect(*): roar_identify() faild!");
16  return -1;
17 }
18
19 if ( roar_auth(con) == -1 ) {
20  ROAR_DBG("roar_simple_connect(*): roar_auth() faild!");
21  return -1;
22 }
23
24 return 0;
25}
26
27int roar_simple_stream(int rate, int channels, int bits, int codec, char * server, int dir, char * name) {
28 struct roar_connection con;
29 struct roar_stream     s;
30
31 if ( roar_simple_connect(&con, server, name) == -1 ) {
32  ROAR_DBG("roar_simple_play(*): roar_simple_connect() faild!");
33  return -1;
34 }
35
36 if ( roar_stream_new(&s, rate, channels, bits, codec) == -1 ) {
37  roar_disconnect(&con);
38  return -1;
39 }
40
41 if ( roar_stream_connect(&con, &s, dir) == -1 ) {
42  roar_disconnect(&con);
43  return -1;
44 }
45
46 if ( roar_stream_exec(&con, &s) == -1 ) {
47  roar_disconnect(&con);
48  return -1;
49 }
50
51 if ( dir == ROAR_DIR_PLAY ) {
52  shutdown(con.fh, SHUT_RD);
53 } else if ( dir == ROAR_DIR_MONITOR || dir == ROAR_DIR_RECORD ) {
54  shutdown(con.fh, SHUT_WR);
55 }
56
57 return con.fh;
58}
59
60int roar_simple_new_stream (struct roar_connection * con, int rate, int channels, int bits, int codec, int dir) {
61 struct roar_stream     s;
62 return roar_simple_new_stream_obj(con, &s, rate, channels, bits, codec, dir);
63}
64
65int roar_simple_new_stream_obj (struct roar_connection * con, struct roar_stream * s, int rate, int channels, int bits, int codec, int dir) {
66 struct roar_message    mes;
67 char file[80];
68 int fh = -1, listen;
69 static int count = 0;
70 struct group   * grp  = NULL;
71 int    type = ROAR_SOCKET_TYPE_UNIX;
72 int    port = 0;
73 struct sockaddr_in   socket_addr;
74 socklen_t            len            = sizeof(struct sockaddr_in);
75
76 if ( getsockname(con->fh, (struct sockaddr *)&socket_addr, &len) == -1 ) {
77  return -1;
78 }
79
80 if ( socket_addr.sin_family == AF_INET ) {
81  type = ROAR_SOCKET_TYPE_INET;
82 }
83
84 if ( type == ROAR_SOCKET_TYPE_UNIX ) {
85  sprintf(file, "/tmp/.libroar-simple-stream.%i-%i", getpid(), count++);
86 } else {
87  strcpy(file, inet_ntoa(socket_addr.sin_addr));
88 }
89
90 if ( (listen = roar_socket_listen(type, file, port)) == -1 ) {
91  return -1;
92 }
93
94 if ( type == ROAR_SOCKET_TYPE_INET ) {
95  len = sizeof(struct sockaddr_in);
96  if ( getsockname(listen, (struct sockaddr *)&socket_addr, &len) == -1 ) {
97   return -1;
98  }
99  port = ROAR_NET2HOST16(socket_addr.sin_port);
100  ROAR_DBG("roar_simple_new_stream_obj(*): port=%i", port);
101 }
102
103 if ( type == ROAR_SOCKET_TYPE_UNIX ) {
104  chmod(file, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP);
105
106  grp = getgrnam(ROAR_DEFAULT_SOCKGRP);
107
108  if ( grp )
109   chown(file, -1, grp->gr_gid);
110 }
111
112 if ( roar_stream_new(s, rate, channels, bits, codec) == -1 ) {
113  return -1;
114 }
115
116 if ( roar_stream_connect(con, s, dir) == -1 ) {
117  return -1;
118 }
119
120 if ( roar_stream_connect_to_ask(con, s, type, file, port) != -1 ) {
121
122  if ( (fh = accept(listen, NULL, NULL)) != -1 ) {
123   if ( dir == ROAR_DIR_PLAY ) {
124    shutdown(fh, SHUT_RD);
125   } else if ( dir == ROAR_DIR_MONITOR || dir == ROAR_DIR_RECORD ) {
126    shutdown(fh, SHUT_WR);
127   }
128  }
129   if ( roar_recv_message(con, &mes, NULL) == -1 ) {
130    close(fh);
131    fh = -1;
132   } else if ( mes.cmd != ROAR_CMD_OK ) {
133    close(fh);
134    fh = -1;
135   }
136 }
137
138 close(listen);
139
140 if ( type == ROAR_SOCKET_TYPE_UNIX ) {
141  unlink(file);
142 }
143
144 return fh;
145}
146
147
148int roar_simple_play_file(char * file, char * server, char * name) {
149 struct roar_connection con;
150
151 if ( roar_simple_connect(&con, server, name) == -1 ) {
152  return -1;
153 }
154
155 return roar_file_play(&con, file, 1); // con is closed by this as this stream will be an execed one.
156}
157
158int roar_simple_play(int rate, int channels, int bits, int codec, char * server, char * name) {
159 return roar_simple_stream(rate, channels, bits, codec, server, ROAR_DIR_PLAY, name);
160}
161
162int roar_simple_monitor(int rate, int channels, int bits, int codec, char * server, char * name) {
163 return roar_simple_stream(rate, channels, bits, codec, server, ROAR_DIR_MONITOR, name);
164}
165
166int roar_simple_record(int rate, int channels, int bits, int codec, char * server, char * name) {
167 return roar_simple_stream(rate, channels, bits, codec, server, ROAR_DIR_RECORD, name);
168}
169
170int roar_simple_filter(int rate, int channels, int bits, int codec, char * server, char * name) {
171 return roar_simple_stream(rate, channels, bits, codec, server, ROAR_DIR_FILTER, name);
172}
173
174
175int roar_simple_close(int fh) {
176 return close(fh);
177}
178
179int roar_simple_get_standby (int fh) {
180 struct roar_connection con;
181
182 con.fh = fh;
183
184 return roar_get_standby(&con);
185}
186
187//ll
Note: See TracBrowser for help on using the repository browser.