From 547cf7dbc1e38bda791bdab3a665ccfe6e26915f Mon Sep 17 00:00:00 2001 From: Scott Murray Date: Tue, 25 Jun 2019 19:47:08 -0400 Subject: 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 Change-Id: I7ca5a438333bd046a1634a9056291bd7c215d4e6 --- app/app.pro | 2 +- app/fileplayer.cpp | 127 +---------------------------------------------------- app/fileplayer.h | 14 +----- app/main.cpp | 2 +- package/config.xml | 3 +- 5 files changed, 6 insertions(+), 142 deletions(-) diff --git a/app/app.pro b/app/app.pro index 2a6a48b..71cd509 100644 --- a/app/app.pro +++ b/app/app.pro @@ -5,7 +5,7 @@ SOURCES = main.cpp phone.cpp fileplayer.cpp HEADERS = phone.h numbertype.h fileplayer.h CONFIG += link_pkgconfig -PKGCONFIG += libhomescreen qlibwindowmanager qtappfw libafbwsc gstreamer-1.0 +PKGCONFIG += libhomescreen qlibwindowmanager qtappfw gstreamer-1.0 RESOURCES += \ phone.qrc \ 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 #include #include -#include -#include #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(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 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, diff --git a/app/fileplayer.h b/app/fileplayer.h index 5f52370..a580409 100644 --- a/app/fileplayer.h +++ b/app/fileplayer.h @@ -21,17 +21,10 @@ #include #include -extern "C" -{ -#include -#include -#include -} - class FilePlayer { public: - FilePlayer(int port, const std::string &token, const std::string &path, const std::string &role); + FilePlayer(const std::string &path, const std::string &role); ~FilePlayer(); void play(bool loop = false); @@ -42,10 +35,6 @@ public: private: std::string m_path; std::string m_role; - struct afb_wsj1 *m_ws = nullptr; - struct afb_wsj1_itf m_itf; - std::thread m_afb_thread; - sd_event *m_afb_loop = nullptr; std::thread m_gst_thread; GMainLoop *m_gst_loop = nullptr; GstElement *m_playbin = nullptr; @@ -55,7 +44,6 @@ private: bool m_playing = false; bool m_looping = false; - int set_role_state(bool state, std::string *output = nullptr); gboolean bus_callback(GstBus *bus, GstMessage *msg); }; diff --git a/app/main.cpp b/app/main.cpp index 95de315..6423844 100644 --- a/app/main.cpp +++ b/app/main.cpp @@ -66,7 +66,7 @@ int main(int argc, char *argv[]) context->setContextProperty("telephony", telephony); std::string token = secret.toStdString(); std::string install_dir = getenv("AFM_APP_INSTALL_DIR"); - FilePlayer *player = new FilePlayer(port, token, install_dir + "/bin/Phone.wav", std::string("phone")); + FilePlayer *player = new FilePlayer(install_dir + "/bin/Phone.wav", std::string("phone")); Phone *phone = new Phone(telephony, player); context->setContextProperty("phone", phone); QObject::connect(telephony, &Telephony::callStateChanged, phone, &Phone::onCallStateChanged); diff --git a/package/config.xml b/package/config.xml index cb3fa2a..a392f9c 100644 --- a/package/config.xml +++ b/package/config.xml @@ -11,13 +11,12 @@ - - + -- cgit 1.2.3-korg