diff options
-rw-r--r-- | src/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/audiomanager_proxy.c | 70 | ||||
-rw-r--r-- | src/sm-pending.c | 76 | ||||
-rw-r--r-- | src/sm-pending.h | 39 | ||||
-rw-r--r-- | src/soundmanager.c | 61 |
5 files changed, 160 insertions, 87 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f157b7d..66e640f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -26,6 +26,7 @@ set(binding_sm_sources soundmanager.c sm-helper.c sm-error.c + sm-pending.c audiomanager_proxy.c dbus/audio_manager_interface.c) diff --git a/src/audiomanager_proxy.c b/src/audiomanager_proxy.c index b62ee8b..d4cb7bc 100644 --- a/src/audiomanager_proxy.c +++ b/src/audiomanager_proxy.c @@ -215,16 +215,16 @@ ErrorCode am_proxy_connect(int source, int sink, int *main_connection_id){ if(is_range_over_guint16(source) == OUT_RANGE || is_range_over_guint16(sink) == OUT_RANGE){ return OUT_RANGE; } - guint16 connection_id = -1, ret = UNABLE_SEND; + guint16 connection_id = 0, ret = 0; ErrorCode ec; GError *err = NULL; - assert(!am_cmd_bus); + assert(am_cmd_bus != NULL); audiomanager_commandinterface_call_connect_sync( am_cmd_bus, (guint16)source, (guint16)sink, - &ret, connection_id, + &ret, &connection_id, NULL, &err); *main_connection_id = (int)connection_id; ec = check_send_error(err, ret); @@ -235,11 +235,11 @@ ErrorCode am_proxy_disconnect(int main_connection_id){ if(is_range_over_guint16(main_connection_id) == OUT_RANGE){ return OUT_RANGE; } - guint16 ret = UNABLE_SEND; + guint16 ret = 0; ErrorCode ec; GError *err = NULL; - assert(!am_cmd_bus); + assert(am_cmd_bus != NULL); audiomanager_commandinterface_call_disconnect_sync( am_cmd_bus, (guint16)main_connection_id, @@ -253,11 +253,11 @@ ErrorCode am_proxy_set_volume(int sink, int volume){ if(is_range_over_guint16(sink) == OUT_RANGE && is_range_over_gint16(volume) == OUT_RANGE){ return OUT_RANGE; } - guint16 ret = UNABLE_SEND; + guint16 ret = 0; ErrorCode ec; GError *err = NULL; - assert(!am_cmd_bus); + assert(am_cmd_bus != NULL); audiomanager_commandinterface_call_set_volume_sync( am_cmd_bus, (guint16)sink, @@ -271,11 +271,11 @@ ErrorCode am_proxy_volume_step(int sink, int volume){ if(is_range_over_guint16(sink) == OUT_RANGE && is_range_over_gint16(volume) == OUT_RANGE){ return OUT_RANGE; } - guint16 ret = UNABLE_SEND; + guint16 ret = 0; ErrorCode ec; GError *err = NULL; - assert(!am_cmd_bus); + assert(am_cmd_bus != NULL); audiomanager_commandinterface_call_volume_step_sync( am_cmd_bus, (guint16)sink, @@ -289,25 +289,25 @@ ErrorCode am_proxy_set_sink_mute_state(int sink, int mute_state){ if(is_range_over_guint16(sink) == OUT_RANGE || is_range_over_gint16(mute_state) == OUT_RANGE){ return OUT_RANGE; } - guint16 ret = UNABLE_SEND; + guint16 ret = 0; ErrorCode ec; GError *err = NULL; - assert(!am_cmd_bus); + assert(am_cmd_bus != NULL); audiomanager_commandinterface_call_set_sink_mute_state_sync( am_cmd_bus, (guint16)sink, (gint16)mute_state, - ret, NULL, &err); + &ret, NULL, &err); ec = check_send_error(err, ret); return ec; } ErrorCode am_proxy_get_list_main_connections(GVariant* connection_list){ - guint16 ret = UNABLE_SEND; + guint16 ret = 0; ErrorCode ec; GError *err = NULL; - assert(!am_cmd_bus); + assert(am_cmd_bus != NULL); audiomanager_commandinterface_call_get_list_main_connections_sync( am_cmd_bus, &ret, @@ -320,11 +320,11 @@ ErrorCode am_proxy_get_list_main_connections(GVariant* connection_list){ } ErrorCode am_proxy_get_list_main_sources(GVariant* source_list){ - guint16 ret = UNABLE_SEND; + guint16 ret = 0; ErrorCode ec; GError *err = NULL; - assert(!am_cmd_bus); + assert(am_cmd_bus != NULL); audiomanager_commandinterface_call_get_list_main_sources_sync( am_cmd_bus, &ret, @@ -337,11 +337,11 @@ ErrorCode am_proxy_get_list_main_sources(GVariant* source_list){ } ErrorCode am_proxy_get_list_main_sinks(GVariant* sink_list){ - guint16 ret = UNABLE_SEND; + guint16 ret = 0; ErrorCode ec; GError *err = NULL; - assert(!am_cmd_bus); + assert(am_cmd_bus != NULL); audiomanager_commandinterface_call_get_list_main_sources_sync( am_cmd_bus, &ret, @@ -360,7 +360,7 @@ ErrorCode am_proxy_ack_connect(int handle, int connection_id, int usr_err){ return OUT_RANGE; } - assert(!am_route_bus); + assert(am_route_bus != NULL); GError *err = NULL; audiomanager_routinginterface_call_ack_connect_sync( @@ -377,7 +377,7 @@ ErrorCode am_proxy_ack_disconnect(int handle, int connection_id, int usr_err){ is_range_over_guint16(usr_err) == OUT_RANGE){ return OUT_RANGE; } - assert(!am_route_bus); + assert(am_route_bus != NULL); GError *err = NULL; audiomanager_routinginterface_call_ack_disconnect_sync( am_route_bus, @@ -393,7 +393,7 @@ ErrorCode am_proxy_ack_set_source_state(int handle, int usr_err){ return OUT_RANGE; } - assert(!am_route_bus); + assert(am_route_bus != NULL); GError *err = NULL; audiomanager_routinginterface_call_ack_set_source_state_sync( am_route_bus, @@ -404,18 +404,19 @@ ErrorCode am_proxy_ack_set_source_state(int handle, int usr_err){ } ErrorCode am_proxy_register_source(GVariant *source_data, int *source){ - assert(!am_route_bus); - guint16 ret = UNABLE_SEND; + assert(am_route_bus != NULL); + guint16 ret = 0, g_source = 0; ErrorCode ec; GError *err = NULL; audiomanager_routinginterface_call_register_source_sync( am_route_bus, source_data, - source, + &g_source, &ret, NULL, &err); g_variant_unref(source_data); + *source = (int)g_source; ec = check_send_error(err, ret); return ec; } @@ -424,11 +425,11 @@ ErrorCode am_proxy_deregister_source(int source){ if(is_range_over_guint16(source) == OUT_RANGE){ return OUT_RANGE; } - guint16 ret = UNABLE_SEND; + guint16 ret = 0; ErrorCode ec; GError *err = NULL; - assert(!am_route_bus); + assert(am_route_bus != NULL); audiomanager_routinginterface_call_deregister_source_sync( am_route_bus, (guint16)source, @@ -440,21 +441,22 @@ ErrorCode am_proxy_deregister_source(int source){ } ErrorCode am_proxy_register_domain(GVariant* domain_data, int *domain){ - guint16 ret = UNABLE_SEND; + guint16 ret = 0, g_domain = 0; ErrorCode ec; GError *err = NULL; - assert(!am_route_bus); + assert(am_route_bus != NULL); audiomanager_routinginterface_call_register_domain_sync( am_route_bus, domain_data, SOUND_MANAGER_BUS_NAME, SOUND_MANAGER_PATH, SOUND_MANAGER_RETURN_INTERFACE, - domain, &ret, + &g_domain, &ret, NULL, &err); g_variant_unref(domain_data); + *domain = (int)g_domain; ec = check_send_error(err, ret); return ec; } @@ -564,7 +566,7 @@ ErrorCode initialize_proxy(){ NULL, NULL ); - return (am_cmd_bus && am_route_bus) ? OK : UNABLE_SEND; + return (!am_cmd_bus || !am_route_bus) ? OK : UNABLE_SEND; } void close_proxy(){ @@ -573,13 +575,13 @@ void close_proxy(){ } void set_event_callback(const am_event* callback){ - assert(!am_cmd_bus); - assert(!am_route_bus); + assert(am_cmd_bus != NULL); + assert(am_route_bus != NULL); /* initialize signal from audio manager command interface */ _am_event.on_main_connection_state_changed = callback->on_main_connection_state_changed; _am_event.on_new_main_connection = callback->on_new_main_connection; _am_event.on_removed_main_connection = callback->on_removed_main_connection; - _am_event.on_set_routing_ready = callback->on_removed_main_connection; + _am_event.on_set_routing_ready = callback->on_set_routing_ready; _am_event.on_set_routing_rundown = callback->on_set_routing_rundown; _am_event.on_sink_mute_state_changed = callback->on_sink_mute_state_changed; _am_event.on_volume_changed = callback->on_volume_changed; @@ -646,5 +648,5 @@ ErrorCode open_soundmanager_interface(const am_instruction *callback){ } void close_soundmanager_inerface(){ - g_dbus_interface_skeleton_unexport(sm_adapter); + g_dbus_interface_skeleton_unexport(G_DBUS_INTERFACE_SKELETON(sm_adapter)); } diff --git a/src/sm-pending.c b/src/sm-pending.c new file mode 100644 index 0000000..43b18cf --- /dev/null +++ b/src/sm-pending.c @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2017 TOYOTA MOTOR CORPORATION + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include <stdlib.h> +#include "sm-pending.h" + +struct pending* add_pending(struct pending *list, int source_id, struct afb_req request) +{ + struct pending* pd; + + if(list == NULL){ + pd = malloc(sizeof(struct pending)); + if(NULL == pd){ + return NULL; + } + pd->source.sourceID = source_id; + pd->source.request = request; + pd->next = NULL; + return pd; + } + else{ + list->next = add_pending(list->next, source_id, request); + return list; + } +} + +struct pending* get_pending(struct pending *list, int source_id){ + if(list == NULL){ + return NULL; + } + if(list->source.sourceID == source_id){ + return list; + } + else{ + struct pending* pd = get_pending(list->next, source_id); + return pd; + } +} + +struct pending* del_pending(struct pending* list, int source_id){ + struct pending* tmp; + if(list == NULL){ + return NULL; + } + + if(list->source.sourceID == source_id){ + tmp = list->next; + free(list); + return tmp; + } + else{ + list->next = del_pending(list->next, source_id); + return list; + } +} + +void del_all_pendings(struct pending *list){ + struct pending* tmp; + if(list != NULL){ + tmp = list->next; + free(list); + del_all_pendings(tmp); + } +}
\ No newline at end of file diff --git a/src/sm-pending.h b/src/sm-pending.h new file mode 100644 index 0000000..f7de157 --- /dev/null +++ b/src/sm-pending.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2017 TOYOTA MOTOR CORPORATION + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef SOUNDMANAGER_PENDING_H +#define SOUNDMANAGER_PENDING_H + +#define _GNU_SOURCE +#define AFB_BINDING_VERSION 2 +#include <afb/afb-binding.h> + +struct pending_source{ + int sourceID; + struct afb_req request; +}; +struct pending{ + struct pending_source source; + struct pending* next; +}; + + +struct pending* add_pending(struct pending *list, int source_id, struct afb_req request); +struct pending* get_pending(struct pending *list, int source_id); +struct pending* del_pending(struct pending* list, int source_id); +void del_all_pendings(struct pending *list); + +#endif //SOUNDMANAGER_PENDING_H
\ No newline at end of file diff --git a/src/soundmanager.c b/src/soundmanager.c index 96d95d1..28ed7ba 100644 --- a/src/soundmanager.c +++ b/src/soundmanager.c @@ -26,60 +26,15 @@ #include "sm-def.h" #include "sm-error.h" #include "sm-helper.h" +#include "sm-pending.h" struct event{ char* name; struct afb_event* event; }; -struct pending{ - int sourceID; - struct afb_req request; - bool use_ahl; - struct pending* next; -}; - static struct pending* pending_list = NULL; -static bool add_pending(int source_id, bool use_ahl, struct afb_req request){ - struct pending* pd = malloc(sizeof(struct pending)); - if(NULL == pd){ - AFB_WARNING("memory allocation error"); - return false; - } - pd->sourceID = source_id; - pd->request = request; - pd->use_ahl = use_ahl; - pd->next = NULL; - if(pending_list == NULL){ - pending_list = pd; - } - struct pending* list = pending_list; - while(list->next != NULL){ - list = list->next; - } - list->next = pd; - return true; -} - - -static struct pending* get_pending(int source_id){ - struct pending* pd = pending_list; - while(pd && (pd->sourceID == source_id)){ - pd = pd->next; - } - return pd; -} - -static bool del_peding(int source_id){ - struct pending* pd = get_pending(source_id); - if(pd != NULL){ - - return true; - } - return false; -} - static int SOUNDMANAGER_DOMAIN_ID; static struct event command_event_list[COMMAND_EVENT_NUM]; static struct event routing_event_list[ROUTING_EVENT_NUM]; @@ -875,7 +830,7 @@ void setStreamState(struct afb_req request){ ctxt->source.mainConnectionID = main_connection_id; afb_req_addref(request); - add_peding(source_id, request); + pending_list = add_pending(pending_list, source_id, request); } #endif @@ -1005,12 +960,12 @@ static void on_async_set_sink_volume(void *closure, int handle, int sinkID, static void on_async_set_source_state(void *closure, int handle, int sourceID, int sourceState) { AFB_DEBUG( "%s called", __FUNCTION__); - struct pending* pd = get_pending(sourceID); - if((pd != NULL) && (pd->use_ahl)){ + struct pending* pd = get_pending(pending_list, sourceID); + if(pd != NULL){ AFB_DEBUG("Call ackSetSourceState in for the application"); am_proxy_ack_set_source_state(handle, 0); - del_peding(sourceID); - return; + afb_req_success(pd->source.request, NULL, NULL); + pending_list = del_pending(pending_list, sourceID); } struct json_object* ev_obj = json_object_new_object(); const char* ss_key = get_source_state_key(sourceState); @@ -1073,8 +1028,8 @@ int preinit() AFB_INFO("Initialize Dbus object"); /* Initialize Dbus interface */ - ErrorCode err = initialize_proxy(); - if(err != OK){ + ErrorCode ec = initialize_proxy(); + if(ec != OK){ AFB_ERROR("Failed to initialize"); return -1; } |