source: roaraudio/libroar/simple.c @ 451:ef127bf9f801

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

chmod() and chown() roar_simple_new_stream_obj()s temp socket to best fit

File size: 3.9 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
72 sprintf(file, "/tmp/.libroar-simple-stream.%i-%i", getpid(), count++);
73
74 if ( (listen = roar_socket_listen(ROAR_SOCKET_TYPE_UNIX, file, 0)) == -1 ) {
75  return -1;
76 }
77
78 chmod(file, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP);
79
80 grp = getgrnam(ROAR_DEFAULT_SOCKGRP);
81
82 if ( grp )
83  chown(file, -1, grp->gr_gid);
84
85 if ( roar_stream_new(s, rate, channels, bits, codec) == -1 ) {
86  return -1;
87 }
88
89 if ( roar_stream_connect(con, s, dir) == -1 ) {
90  return -1;
91 }
92
93 if ( roar_stream_connect_to_ask(con, s, ROAR_SOCKET_TYPE_UNIX, file, 0) != -1 ) {
94
95  if ( (fh = accept(listen, NULL, NULL)) != -1 ) {
96   if ( dir == ROAR_DIR_PLAY ) {
97    shutdown(fh, SHUT_RD);
98   } else if ( dir == ROAR_DIR_MONITOR || dir == ROAR_DIR_RECORD ) {
99    shutdown(fh, SHUT_WR);
100   }
101  }
102   if ( roar_recv_message(con, &mes, NULL) == -1 ) {
103    close(fh);
104    fh = -1;
105   } else if ( mes.cmd != ROAR_CMD_OK ) {
106    close(fh);
107    fh = -1;
108   }
109 }
110
111 close(listen);
112 unlink(file);
113
114 return fh;
115}
116
117
118int roar_simple_play_file(char * file, char * server, char * name) {
119 struct roar_connection con;
120
121 if ( roar_simple_connect(&con, server, name) == -1 ) {
122  return -1;
123 }
124
125 return roar_file_play(&con, file, 1); // con is closed by this as this stream will be an execed one.
126}
127
128int roar_simple_play(int rate, int channels, int bits, int codec, char * server, char * name) {
129 return roar_simple_stream(rate, channels, bits, codec, server, ROAR_DIR_PLAY, name);
130}
131
132int roar_simple_monitor(int rate, int channels, int bits, int codec, char * server, char * name) {
133 return roar_simple_stream(rate, channels, bits, codec, server, ROAR_DIR_MONITOR, name);
134}
135
136int roar_simple_record(int rate, int channels, int bits, int codec, char * server, char * name) {
137 return roar_simple_stream(rate, channels, bits, codec, server, ROAR_DIR_RECORD, name);
138}
139
140int roar_simple_filter(int rate, int channels, int bits, int codec, char * server, char * name) {
141 return roar_simple_stream(rate, channels, bits, codec, server, ROAR_DIR_FILTER, name);
142}
143
144
145int roar_simple_close(int fh) {
146 return close(fh);
147}
148
149int roar_simple_get_standby (int fh) {
150 struct roar_connection con;
151
152 con.fh = fh;
153
154 return roar_get_standby(&con);
155}
156
157//ll
Note: See TracBrowser for help on using the repository browser.