Remove some unused things.
Work on shutdown.
This commit is contained in:
Wim Taymans 2016-09-01 10:04:25 +02:00
parent 9485bd77e7
commit 463954a299
17 changed files with 166 additions and 99 deletions

View file

@ -35,21 +35,6 @@
#define PINOS_SPA_ALSA_SINK_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), PINOS_TYPE_SPA_ALSA_SINK, PinosSpaAlsaSinkPrivate))
typedef struct {
PinosSpaAlsaSink *sink;
PinosPort *port;
} SinkPortData;
typedef struct {
guint32 id;
guint32 type;
int fd;
guint64 offset;
guint64 size;
void *data;
} MemBlock;
struct _PinosSpaAlsaSinkPrivate
{
PinosProperties *props;
@ -61,10 +46,6 @@ struct _PinosSpaAlsaSinkPrivate
gboolean running;
pthread_t thread;
GHashTable *mem_ids;
GList *ports;
};
enum {
@ -216,6 +197,14 @@ on_sink_event (SpaNode *node, SpaEvent *event, void *user_data)
}
break;
}
case SPA_EVENT_TYPE_REMOVE_POLL:
{
if (priv->running) {
priv->running = false;
pthread_join (priv->thread, NULL);
}
break;
}
case SPA_EVENT_TYPE_STATE_CHANGE:
{
SpaEventStateChange *sc = event->data;
@ -252,25 +241,32 @@ setup_node (PinosSpaAlsaSink *this)
}
static void
stop_pipeline (PinosSpaAlsaSink *sink)
pause_pipeline (PinosSpaAlsaSink *sink)
{
PinosNode *node = PINOS_NODE (sink);
PinosSpaAlsaSinkPrivate *priv = sink->priv;
SpaResult res;
SpaCommand cmd;
g_debug ("spa-alsa-sink %p: stopping pipeline", sink);
if (priv->running) {
priv->running = false;
pthread_join (priv->thread, NULL);
}
g_debug ("spa-alsa-sink %p: pausing pipeline", sink);
cmd.type = SPA_COMMAND_PAUSE;
if ((res = spa_node_send_command (node->node, &cmd)) < 0)
g_debug ("got error %d", res);
}
static void
suspend_pipeline (PinosSpaAlsaSink *this)
{
PinosNode *node = PINOS_NODE (this);
SpaResult res;
g_debug ("spa-alsa-sink %p: suspend pipeline", this);
if ((res = spa_node_port_set_format (node->node, 0, 0, NULL)) < 0) {
g_warning ("error unset format output: %d", res);
}
}
static void
destroy_pipeline (PinosSpaAlsaSink *sink)
{
@ -287,13 +283,14 @@ set_state (PinosNode *node,
switch (state) {
case PINOS_NODE_STATE_SUSPENDED:
suspend_pipeline (this);
break;
case PINOS_NODE_STATE_INITIALIZING:
break;
case PINOS_NODE_STATE_IDLE:
stop_pipeline (this);
pause_pipeline (this);
break;
case PINOS_NODE_STATE_RUNNING:
@ -335,8 +332,7 @@ set_property (GObject *object,
static void
on_activate (PinosPort *port, gpointer user_data)
{
SinkPortData *data = user_data;
PinosNode *node = PINOS_NODE (data->sink);
PinosNode *node = user_data;
g_debug ("port %p: activate", port);
@ -346,26 +342,12 @@ on_activate (PinosPort *port, gpointer user_data)
static void
on_deactivate (PinosPort *port, gpointer user_data)
{
SinkPortData *data = user_data;
PinosNode *node = PINOS_NODE (data->sink);
PinosNode *node = user_data;
g_debug ("port %p: deactivate", port);
pinos_node_report_idle (node);
}
static void
free_sink_port_data (SinkPortData *data)
{
g_slice_free (SinkPortData, data);
}
static void
free_mem_block (MemBlock *b)
{
munmap (b->data, b->size);
g_slice_free (MemBlock, b);
}
static gboolean
on_received_buffer (PinosPort *port,
uint32_t buffer_id,
@ -421,46 +403,26 @@ add_port (PinosNode *node,
GError **error)
{
PinosSpaAlsaSink *sink = PINOS_SPA_ALSA_SINK (node);
PinosSpaAlsaSinkPrivate *priv = sink->priv;
SinkPortData *data;
PinosPort *port;
data = g_slice_new0 (SinkPortData);
data->sink = sink;
data->port = PINOS_NODE_CLASS (pinos_spa_alsa_sink_parent_class)
port = PINOS_NODE_CLASS (pinos_spa_alsa_sink_parent_class)
->add_port (node, id, error);
pinos_port_set_received_cb (data->port, on_received_buffer, on_received_event, sink, NULL);
pinos_port_set_received_cb (port, on_received_buffer, on_received_event, sink, NULL);
g_debug ("connecting signals");
g_signal_connect (data->port, "activate", (GCallback) on_activate, data);
g_signal_connect (data->port, "deactivate", (GCallback) on_deactivate, data);
g_signal_connect (port, "activate", (GCallback) on_activate, sink);
g_signal_connect (port, "deactivate", (GCallback) on_deactivate, sink);
priv->ports = g_list_append (priv->ports, data);
return data->port;
return port;
}
static gboolean
remove_port (PinosNode *node,
PinosPort *port)
{
PinosSpaAlsaSink *sink = PINOS_SPA_ALSA_SINK (node);
PinosSpaAlsaSinkPrivate *priv = sink->priv;
GList *walk;
for (walk = priv->ports; walk; walk = g_list_next (walk)) {
SinkPortData *data = walk->data;
if (data->port == port) {
free_sink_port_data (data);
priv->ports = g_list_delete_link (priv->ports, walk);
break;
}
}
if (priv->ports == NULL)
pinos_node_report_idle (node);
return TRUE;
return PINOS_NODE_CLASS (pinos_spa_alsa_sink_parent_class)
->remove_port (node, port);
}
static void
@ -481,7 +443,6 @@ sink_finalize (GObject * object)
destroy_pipeline (sink);
pinos_properties_free (priv->props);
g_hash_table_unref (priv->mem_ids);
G_OBJECT_CLASS (pinos_spa_alsa_sink_parent_class)->finalize (object);
}
@ -507,11 +468,8 @@ pinos_spa_alsa_sink_class_init (PinosSpaAlsaSinkClass * klass)
static void
pinos_spa_alsa_sink_init (PinosSpaAlsaSink * sink)
{
PinosSpaAlsaSinkPrivate *priv;
priv = sink->priv = PINOS_SPA_ALSA_SINK_GET_PRIVATE (sink);
PinosSpaAlsaSinkPrivate *priv = sink->priv = PINOS_SPA_ALSA_SINK_GET_PRIVATE (sink);
priv->props = pinos_properties_new (NULL, NULL);
priv->mem_ids = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, (GDestroyNotify) free_mem_block);
}
PinosNode *

View file

@ -46,8 +46,6 @@ struct _PinosSpaV4l2SourcePrivate
gboolean running;
pthread_t thread;
GBytes *format;
};
enum {
@ -143,13 +141,13 @@ on_source_event (SpaNode *node, SpaEvent *event, void *user_data)
{
SpaOutputInfo info[1] = { 0, };
SpaResult res;
GList *walk;
GList *ports, *walk;
if ((res = spa_node_port_pull_output (node, 1, info)) < 0)
g_debug ("spa-v4l2-source %p: got pull error %d, %d", this, res, info[0].status);
walk = pinos_node_get_ports (PINOS_NODE (this));
for (; walk; walk = g_list_next (walk)) {
ports = pinos_node_get_ports (PINOS_NODE (this));
for (walk = ports; walk; walk = g_list_next (walk)) {
PinosPort *port = walk->data;
GError *error = NULL;
@ -158,6 +156,7 @@ on_source_event (SpaNode *node, SpaEvent *event, void *user_data)
g_clear_error (&error);
}
}
g_list_free (ports);
break;
}
@ -351,11 +350,15 @@ source_constructed (GObject * object)
static void
source_finalize (GObject * object)
{
PinosNode *node = PINOS_NODE (object);
PinosSpaV4l2Source *source = PINOS_SPA_V4L2_SOURCE (object);
g_debug ("spa-source %p: dispose", source);
destroy_pipeline (source);
spa_handle_clear (node->node->handle);
g_free (node->node->handle);
G_OBJECT_CLASS (pinos_spa_v4l2_source_parent_class)->finalize (object);
}