]>
code.delx.au - pulseaudio/blob - src/module-pipe-sink.c
11 #include "iochannel.h"
21 void *mainloop_source
;
22 struct pa_mainloop_api
*mainloop
;
24 struct memchunk memchunk
;
27 static void do_write(struct userdata
*u
) {
31 u
->mainloop
->enable_fixed(u
->mainloop
, u
->mainloop_source
, 0);
33 if (!iochannel_is_writable(u
->io
))
36 if (!u
->memchunk
.length
)
37 if (sink_render(u
->sink
, PIPE_BUF
, &u
->memchunk
) < 0)
40 assert(u
->memchunk
.memblock
&& u
->memchunk
.length
);
42 if ((r
= iochannel_write(u
->io
, u
->memchunk
.memblock
->data
+ u
->memchunk
.index
, u
->memchunk
.length
)) < 0) {
43 fprintf(stderr
, "write() failed: %s\n", strerror(errno
));
47 u
->memchunk
.index
+= r
;
48 u
->memchunk
.length
-= r
;
50 if (u
->memchunk
.length
<= 0) {
51 memblock_unref(u
->memchunk
.memblock
);
52 u
->memchunk
.memblock
= NULL
;
56 static void notify_cb(struct sink
*s
) {
57 struct userdata
*u
= s
->userdata
;
60 if (iochannel_is_writable(u
->io
))
61 u
->mainloop
->enable_fixed(u
->mainloop
, u
->mainloop_source
, 1);
64 static void fixed_callback(struct pa_mainloop_api
*m
, void *id
, void *userdata
) {
65 struct userdata
*u
= userdata
;
70 static void io_callback(struct iochannel
*io
, void*userdata
) {
71 struct userdata
*u
= userdata
;
76 int module_init(struct core
*c
, struct module
*m
) {
77 struct userdata
*u
= NULL
;
81 static const struct pa_sample_spec ss
= {
82 .format
= PA_SAMPLE_S16NE
,
88 mkfifo((p
= m
->argument
? m
->argument
: "/tmp/musicfifo"), 0777);
90 if ((fd
= open(p
, O_RDWR
)) < 0) {
91 fprintf(stderr
, "open('%s'): %s\n", p
, strerror(errno
));
95 if (fstat(fd
, &st
) < 0) {
96 fprintf(stderr
, "fstat('%s'): %s\n", p
, strerror(errno
));
100 if (!S_ISFIFO(st
.st_mode
)) {
101 fprintf(stderr
, "'%s' is not a FIFO\n", p
);
106 u
= malloc(sizeof(struct userdata
));
109 u
->filename
= strdup(p
);
112 u
->sink
= sink_new(c
, "fifo", 0, &ss
);
114 u
->sink
->notify
= notify_cb
;
115 u
->sink
->userdata
= u
;
117 u
->io
= iochannel_new(c
->mainloop
, -1, fd
);
119 iochannel_set_callback(u
->io
, io_callback
, u
);
121 u
->memchunk
.memblock
= NULL
;
122 u
->memchunk
.length
= 0;
124 u
->mainloop
= c
->mainloop
;
125 u
->mainloop_source
= u
->mainloop
->source_fixed(u
->mainloop
, fixed_callback
, u
);
126 assert(u
->mainloop_source
);
127 u
->mainloop
->enable_fixed(u
->mainloop
, u
->mainloop_source
, 0);
140 void module_done(struct core
*c
, struct module
*m
) {
147 if (u
->memchunk
.memblock
)
148 memblock_unref(u
->memchunk
.memblock
);
151 iochannel_free(u
->io
);
152 u
->mainloop
->cancel_fixed(u
->mainloop
, u
->mainloop_source
);