source: roaraudio/libroar/simple.c @ 493:aa0666636931

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

allow reuse of temp address

File size: 4.7 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 int    opt  = 1;
74 struct sockaddr_in   socket_addr;
75 socklen_t            len            = sizeof(struct sockaddr_in);
76
77 if ( getsockname(con->fh, (struct sockaddr *)&socket_addr, &len) == -1 ) {
78  return -1;
79 }
80
81 if ( socket_addr.sin_family == AF_INET ) {
82  type = ROAR_SOCKET_TYPE_INET;
83 }
84
85 if ( type == ROAR_SOCKET_TYPE_UNIX ) {
86  sprintf(file, "/tmp/.libroar-simple-stream.%i-%i", getpid(), count++);
87 } else {
88  strcpy(file, inet_ntoa(socket_addr.sin_addr));
89 }
90
91 if ( (listen = roar_socket_listen(type, file, port)) == -1 ) {
92  return -1;
93 }
94
95 if ( type == ROAR_SOCKET_TYPE_INET ) {
96  len = sizeof(struct sockaddr_in);
97  setsockopt(listen, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int));
98
99  if ( getsockname(listen, (struct sockaddr *)&socket_addr, &len) == -1 ) {
100   return -1;
101  }
102  port = ROAR_NET2HOST16(socket_addr.sin_port);
103  ROAR_DBG("roar_simple_new_stream_obj(*): port=%i", port);
104 }
105
106 if ( type == ROAR_SOCKET_TYPE_UNIX ) {
107  chmod(file, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP);
108
109  grp = getgrnam(ROAR_DEFAULT_SOCKGRP);
110
111  if ( grp )
112   chown(file, -1, grp->gr_gid);
113 }
114
115 if ( roar_stream_new(s, rate, channels, bits, codec) == -1 ) {
116  return -1;
117 }
118
119 if ( roar_stream_connect(con, s, dir) == -1 ) {
120  return -1;
121 }
122
123 if ( roar_stream_connect_to_ask(con, s, type, file, port) != -1 ) {
124
125  if ( (fh = accept(listen, NULL, NULL)) != -1 ) {
126   if ( dir == ROAR_DIR_PLAY ) {
127    shutdown(fh, SHUT_RD);
128   } else if ( dir == ROAR_DIR_MONITOR || dir == ROAR_DIR_RECORD ) {
129    shutdown(fh, SHUT_WR);
130   }
131  }
132   if ( roar_recv_message(con, &mes, NULL) == -1 ) {
133    close(fh);
134    fh = -1;
135   } else if ( mes.cmd != ROAR_CMD_OK ) {
136    close(fh);
137    fh = -1;
138   }
139 }
140
141 close(listen);
142
143 if ( type == ROAR_SOCKET_TYPE_UNIX ) {
144  unlink(file);
145 }
146
147 return fh;
148}
149
150
151int roar_simple_play_file(char * file, char * server, char * name) {
152 struct roar_connection con;
153
154 if ( roar_simple_connect(&con, server, name) == -1 ) {
155  return -1;
156 }
157
158 return roar_file_play(&con, file, 1); // con is closed by this as this stream will be an execed one.
159}
160
161int roar_simple_play(int rate, int channels, int bits, int codec, char * server, char * name) {
162 return roar_simple_stream(rate, channels, bits, codec, server, ROAR_DIR_PLAY, name);
163}
164
165int roar_simple_monitor(int rate, int channels, int bits, int codec, char * server, char * name) {
166 return roar_simple_stream(rate, channels, bits, codec, server, ROAR_DIR_MONITOR, name);
167}
168
169int roar_simple_record(int rate, int channels, int bits, int codec, char * server, char * name) {
170 return roar_simple_stream(rate, channels, bits, codec, server, ROAR_DIR_RECORD, name);
171}
172
173int roar_simple_filter(int rate, int channels, int bits, int codec, char * server, char * name) {
174 return roar_simple_stream(rate, channels, bits, codec, server, ROAR_DIR_FILTER, name);
175}
176
177
178int roar_simple_close(int fh) {
179 return close(fh);
180}
181
182int roar_simple_get_standby (int fh) {
183 struct roar_connection con;
184
185 con.fh = fh;
186
187 return roar_get_standby(&con);
188}
189
190//ll
Note: See TracBrowser for help on using the repository browser.