2 #include "fixeddec/fixeddec.h"
5 # define MMQ_MQUEUE "/mmq"
9 # define MMQ_MSGSIZE 256
13 # define MMQ_MAXMSG 10 /* Linux 2.6 default */
16 enum player_state g_state
;
18 static struct mq_attr attr
;
22 * we only have two opcodes for messages in the queue, signals handle
26 OP_PLAY_PATH
= '=', /* path to an audio file */
27 OP_SEEK_PRE
= ':' /* seek point for next song before playback */
30 static void next_handler(UNUSED
int signum
)
36 static void sig_init(void)
40 memset(&sa
, 0, sizeof(struct sigaction
));
41 sigemptyset(&sa
.sa_mask
);
42 sa
.sa_flags
= SA_RESTART
;
43 sa
.sa_handler
= next_handler
;
44 sigaction(SIGUSR1
, &sa
, NULL
);
47 static void set_mq_nonblock(int nb
)
49 attr
.mq_flags
= nb
? O_NONBLOCK
: 0;
51 if (mq_setattr(mq
, &attr
, NULL
) < 0)
52 die("mq_setattr: %s\n", strerror(errno
));
55 static void read_seek_point(char *buf
, ssize_t len
)
58 g_seek_msec
= strtol(buf
, NULL
, 10);
60 emit(":%ld\n", g_seek_msec
);
63 static void play_path(char *buf
, ssize_t len
)
67 write(STDOUT_FILENO
, buf
- 1, len
+ 2);
69 fixeddec_play(buf
, len
);
71 if (g_state
== STATE_NEXT
)
75 static void unknown(const char *buf
, ssize_t len
)
77 warn("unknown message received:\n");
79 warn("\n-------------------------\n");
82 /* lets try to get away without accepting command-line arguments... */
85 char tmp
[MMQ_MSGSIZE
+ 1];
88 attr
.mq_msgsize
= MMQ_MSGSIZE
;
89 attr
.mq_maxmsg
= MMQ_MAXMSG
;
91 mq
= mq_open(MMQ_MQUEUE
, O_CREAT
|O_RDONLY
, 0666, &attr
);
93 die("mq_open(%s): %s\n", MMQ_MQUEUE
, strerror(errno
));
97 r
= mq_receive(mq
, tmp
, attr
.mq_msgsize
, NULL
);
98 if (r
== 0 || (r
< 0 && errno
== EINTR
)) {
107 die("mq_receive: %s\n", strerror(err
));
110 assert(r
> 0 && "r is not positive");
113 read_seek_point(tmp
+ 1, r
- 1);
116 play_path(tmp
+ 1, r
- 1);
119 default: unknown(tmp
, r
);