]>
code.delx.au - pulseaudio/blob - src/module-pipe-sink.c
c0a903e9493a3794fac69423ac337203c9121e5a
11 #include "iochannel.h"
21 struct mainloop_source
*mainloop_source
;
23 struct memchunk memchunk
;
26 static void do_write(struct userdata
*u
) {
30 mainloop_source_enable(u
->mainloop_source
, 0);
32 if (!iochannel_is_writable(u
->io
))
35 if (!u
->memchunk
.length
)
36 if (sink_render(u
->sink
, PIPE_BUF
, &u
->memchunk
) < 0)
39 assert(u
->memchunk
.memblock
&& u
->memchunk
.length
);
41 if ((r
= iochannel_write(u
->io
, u
->memchunk
.memblock
->data
+ u
->memchunk
.index
, u
->memchunk
.length
)) < 0) {
42 fprintf(stderr
, "write() failed: %s\n", strerror(errno
));
46 u
->memchunk
.index
+= r
;
47 u
->memchunk
.length
-= r
;
49 if (u
->memchunk
.length
<= 0) {
50 memblock_unref(u
->memchunk
.memblock
);
51 u
->memchunk
.memblock
= NULL
;
55 static void notify_cb(struct sink
*s
) {
56 struct userdata
*u
= s
->userdata
;
59 if (iochannel_is_writable(u
->io
))
60 mainloop_source_enable(u
->mainloop_source
, 1);
63 static void prepare_callback(struct mainloop_source
*src
, void *userdata
) {
64 struct userdata
*u
= userdata
;
69 static void io_callback(struct iochannel
*io
, void*userdata
) {
70 struct userdata
*u
= userdata
;
75 int module_init(struct core
*c
, struct module
*m
) {
76 struct userdata
*u
= NULL
;
80 static const struct sample_spec ss
= {
81 .format
= SAMPLE_S16NE
,
87 mkfifo((p
= m
->argument
? m
->argument
: "/tmp/musicfifo"), 0777);
89 if ((fd
= open(p
, O_RDWR
)) < 0) {
90 fprintf(stderr
, "open('%s'): %s\n", p
, strerror(errno
));
94 if (fstat(fd
, &st
) < 0) {
95 fprintf(stderr
, "fstat('%s'): %s\n", p
, strerror(errno
));
99 if (!S_ISFIFO(st
.st_mode
)) {
100 fprintf(stderr
, "'%s' is not a FIFO\n", p
);
105 u
= malloc(sizeof(struct userdata
));
108 u
->filename
= strdup(p
);
111 u
->sink
= sink_new(c
, "fifo", &ss
);
113 u
->sink
->notify
= notify_cb
;
114 u
->sink
->userdata
= u
;
116 u
->io
= iochannel_new(c
->mainloop
, -1, fd
);
118 iochannel_set_callback(u
->io
, io_callback
, u
);
120 u
->memchunk
.memblock
= NULL
;
121 u
->memchunk
.length
= 0;
123 u
->mainloop_source
= mainloop_source_new_fixed(c
->mainloop
, prepare_callback
, u
);
124 assert(u
->mainloop_source
);
125 mainloop_source_enable(u
->mainloop_source
, 0);
138 void module_done(struct core
*c
, struct module
*m
) {
145 if (u
->memchunk
.memblock
)
146 memblock_unref(u
->memchunk
.memblock
);
149 iochannel_free(u
->io
);
150 mainloop_source_free(u
->mainloop_source
);