socket->signal_end_of_file.connect(sigc::mem_fun(this, &Client::end_of_stream));
xinema.signal_stream_created.connect(sigc::mem_fun(this, &Client::stream_created));
+ xinema.signal_stream_destroyed.connect(sigc::mem_fun(this, &Client::stream_destroyed));
XineStream *stream = xinema.get_stream();
if(stream)
stream_created(*stream);
void Client::data_available()
{
char rbuf[1024];
- unsigned len = socket->read(rbuf, sizeof(rbuf));
+ unsigned len;
+ try
+ {
+ len = socket->read(rbuf, sizeof(rbuf));
+ }
+ catch(const std::exception &)
+ {
+ stale = true;
+ return;
+ }
+
buffer.append(rbuf, len);
string::size_type start = 0;
void Client::send_reply(const string &reply)
{
- socket->write(reply);
- socket->put('\n');
+ Msp::MutexLock lock(mutex);
+ try
+ {
+ socket->write(reply);
+ socket->put('\n');
+ }
+ catch(const std::exception &)
+ {
+ stale = true;
+ }
}
void Client::list_directory(const FS::Path &dn)
stream.signal_duration_changed.connect(sigc::mem_fun(this, &Client::stream_duration_changed));
stream.signal_position_changed.connect(sigc::mem_fun(this, &Client::stream_position_changed));
+ MutexLock lock(stream.get_mutex());
stream_state_changed(stream.get_state());
string title = stream.get_title();
stream_duration_changed(dur);
}
+void Client::stream_destroyed()
+{
+ send_reply("ejected");
+}
+
void Client::stream_state_changed(XineStream::State state)
{
send_reply(format("state %s", state));