summaryrefslogtreecommitdiffstats
path: root/app/fileplayer.cpp
diff options
context:
space:
mode:
authorScott Murray <scott.murray@konsulko.com>2019-06-25 19:47:08 -0400
committerScott Murray <scott.murray@konsulko.com>2019-06-25 19:50:39 -0400
commit547cf7dbc1e38bda791bdab3a665ccfe6e26915f (patch)
tree534eaf69c93b36bab22e37d8b54acb7b4a6ea020 /app/fileplayer.cpp
parente49a29beae53f89fc23760d7c4ccd3caeb9640af (diff)
Fixes to work with running as non-root and 4A removal
Added the missing new audio permission to the widget manifest, and reworked ringtone audio output to remove 4A support. Bug-AGL: SPEC-2558 Signed-off-by: Scott Murray <scott.murray@konsulko.com> Change-Id: I7ca5a438333bd046a1634a9056291bd7c215d4e6
Diffstat (limited to 'app/fileplayer.cpp')
-rw-r--r--app/fileplayer.cpp127
1 files changed, 2 insertions, 125 deletions
diff --git a/app/fileplayer.cpp b/app/fileplayer.cpp
index e26a3e6..85d2440 100644
--- a/app/fileplayer.cpp
+++ b/app/fileplayer.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 Konsulko Group
+ * Copyright (C) 2018,2019 Konsulko Group
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -19,105 +19,21 @@
#include <cstring>
#include <iostream>
#include <mutex>
-#include <condition_variable>
-#include <json-c/json.h>
#undef DEBUG
-struct set_role_data
-{
- bool state;
- std::string output;
- std::condition_variable cv;
-};
-
-static void on_hangup(void *closure, struct afb_wsj1 *wsj)
-{
-}
-
-static void on_call(void *closure, const char *api, const char *verb, struct afb_wsj1_msg *msg)
-{
-}
-
-static void on_event(void* closure, const char* event, struct afb_wsj1_msg *msg)
-{
-}
-
-static void on_reply(void *closure, struct afb_wsj1_msg *msg)
-{
- struct set_role_data *data = (struct set_role_data*) closure;
- struct json_object* reply;
-
- if(!(data && data->state))
- goto reply_done;
-
- // We opened the role, return the output
- reply = afb_wsj1_msg_object_j(msg);
- if(reply) {
-#ifdef DEBUG
- std::cerr << __FUNCTION__ << ": reply = " << \
- json_object_to_json_string_ext(reply, JSON_C_TO_STRING_SPACED | JSON_C_TO_STRING_PRETTY) << \
- std::endl;
-#endif
- struct json_object* response;
- int rc = json_object_object_get_ex(reply, "response", &response);
- if(rc) {
- struct json_object* val;
- rc = json_object_object_get_ex(response, "device_uri", &val);
- if (rc && json_object_get_string_len(val)) {
- const char* jres_pcm = json_object_get_string(val);
- data->output = jres_pcm;
-#ifdef DEBUG
- std::cerr << __FUNCTION__ << ": output = " << jres_pcm << std::endl;
-#endif
- }
- }
- }
-reply_done:
- // Signal reply is done
- data->cv.notify_one();
-}
-
-static void *afb_loop_thread(struct sd_event* loop)
-{
- for(;;)
- sd_event_run(loop, 30000000);
-}
-
static void *gst_loop_thread(GMainLoop *loop)
{
if(loop)
g_main_loop_run(loop);
}
-FilePlayer::FilePlayer(const int port, const std::string &token, const std::string &path, const std::string &role) :
+FilePlayer::FilePlayer(const std::string &path, const std::string &role) :
m_path(path),
m_role(role)
{
std::string uri;
- if(sd_event_new(&m_afb_loop) < 0) {
- std::cerr << __FUNCTION__ << ": Failed to create event loop" << std::endl;
- return;
- }
-
- // Initialize interface for websocket
- m_itf.on_hangup = on_hangup;
- m_itf.on_call = on_call;
- m_itf.on_event = on_event;
-
- uri = "ws://localhost:" + std::to_string(port) + "/api?token=" + token;
-#ifdef DEBUG
- std::cerr << "Using URI: " << uri << std::endl;
-#endif
- m_ws = afb_ws_client_connect_wsj1(m_afb_loop, uri.c_str(), &m_itf, NULL);
- if(m_ws) {
- m_afb_thread = std::thread(afb_loop_thread, m_afb_loop);
- } else {
- std::cerr << __FUNCTION__ << ": Failed to create websocket connection" << std::endl;
- goto error;
- }
-
// Initialize GStreamer
gst_init(NULL, NULL);
@@ -153,10 +69,6 @@ error:
g_main_loop_quit(m_gst_loop);
m_gst_loop = nullptr;
}
- if(m_afb_loop) {
- sd_event_unref(m_afb_loop);
- m_afb_loop = nullptr;
- }
return;
}
@@ -166,26 +78,16 @@ FilePlayer::~FilePlayer(void)
gst_object_unref(m_playbin);
gst_object_unref(m_alsa_sink);
gst_object_unref(m_bus);
- sd_event_unref(m_afb_loop);
}
void FilePlayer::play(bool loop)
{
- std::string output;
-
if(!m_valid || m_playing)
return;
- if(set_role_state(true, &output) != 0)
- return;
-
- if(output.empty())
- return;
-
m_playing = true;
m_looping = loop;
- g_object_set(m_alsa_sink, "device", output.c_str(), NULL);
g_object_set(m_playbin, "audio-sink", m_alsa_sink, NULL);
std::string uri = "file://" + m_path;
g_object_set(m_playbin, "uri", uri.c_str(), NULL);
@@ -213,29 +115,6 @@ gboolean FilePlayer::gstreamer_bus_callback(GstBus *bus, GstMessage *msg, gpoint
return static_cast<FilePlayer*>(data)->bus_callback(bus, msg);
}
-int FilePlayer::set_role_state(bool state, std::string *output)
-{
- if(!m_valid)
- return -1;
-
- set_role_data data;
- data.state = state;
- json_object *jsonData = json_object_new_object();
- json_object_object_add(jsonData, "action", json_object_new_string(state ? "open" : "close"));
- int rc = afb_wsj1_call_j(m_ws, "ahl-4a", m_role.c_str(), jsonData, on_reply, (void*) &data);
- if(rc >= 0) {
- // Wait for response
- std::mutex m;
- std::unique_lock<std::mutex> lk(m);
- data.cv.wait(lk);
- if(state && output)
- *output = data.output;
- } else {
- std::cerr << __FUNCTION__ << ": Failed to call ahl-4a/" << m_role.c_str() << std::endl;
- }
- return rc;
-}
-
gboolean FilePlayer::bus_callback(GstBus *bus, GstMessage *msg)
{
switch (GST_MESSAGE_TYPE(msg)) {
@@ -266,8 +145,6 @@ gboolean FilePlayer::bus_callback(GstBus *bus, GstMessage *msg)
std::cerr << __FUNCTION__ << ": GST_MESSAGE_STATE_CHANGE: " << (int) old_state << " to " << (int) new_state << std::endl;
#endif
if(old_state == GST_STATE_PLAYING && new_state == GST_STATE_PAUSED) {
- set_role_state(false);
-
// Seek back to beginning so any subsequent play starts there
if (!gst_element_seek(m_playbin,
1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH,