From: Seungbae Shin Date: Thu, 18 Oct 2018 07:38:01 +0000 (+0900) Subject: Merge branch 'tizen' into tizen_line_coverage X-Git-Tag: accepted/tizen/unified/20190710.103416~1^2~2 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fapi%2Faudio-io.git;a=commitdiff_plain;h=987d619e83678c5aee16770ea612d253c89c598f Merge branch 'tizen' into tizen_line_coverage Change-Id: Ib35e0f83c76869e8471b4deed33f4f0aec3f8a72 --- 987d619e83678c5aee16770ea612d253c89c598f diff --cc src/cpp/cpp_audio_in_privilege.cpp index 0000000,ae914ca..d8a56c0 mode 000000,100644..100644 --- a/src/cpp/cpp_audio_in_privilege.cpp +++ b/src/cpp/cpp_audio_in_privilege.cpp @@@ -1,0 -1,130 +1,134 @@@ + /* + * Copyright (c) 2018 Samsung Electronics Co., Ltd All Rights Reserved + * + * 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 "cpp_audio_in_privilege.h" + #include "CAudioIODef.h" + #include + #include + + #define RECORDER_PRIVILEGE "http://tizen.org/privilege/recorder" + #define CLIENT_NAME "AUDIO_IO_PA_CLIENT" + + using namespace std; + using namespace tizen_media_audio; + + + struct PrivilegeData { + bool isPrivilegeAllowed; + pa_threaded_mainloop *paMainloop; + }; + + static void __contextStateChangeCb(pa_context* c, void* user_data) { + pa_threaded_mainloop *paMainloop = (pa_threaded_mainloop *)user_data; + assert(paMainloop); + assert(c); + + switch (pa_context_get_state(c)) { + case PA_CONTEXT_READY: + AUDIO_IO_LOGD("The context is ready"); + pa_threaded_mainloop_signal(paMainloop, 0); + break; + + case PA_CONTEXT_FAILED: + case PA_CONTEXT_TERMINATED: + AUDIO_IO_LOGD("The context is lost"); + pa_threaded_mainloop_signal(paMainloop, 0); + break; + + case PA_CONTEXT_UNCONNECTED: + case PA_CONTEXT_CONNECTING: + case PA_CONTEXT_AUTHORIZING: + case PA_CONTEXT_SETTING_NAME: + break; + } + } + + static void __checkPrivilegeCb(pa_context *c, int success, void *user_data) { + AUDIO_IO_LOGD("pa_context[%p], success[%d], user_data[%p]", c, success, user_data); + assert(c); + assert(user_data); + + PrivilegeData *prData = (PrivilegeData *)user_data; + prData->isPrivilegeAllowed = success ? true : false; + + pa_threaded_mainloop_signal(prData->paMainloop, 0); + } + + bool cpp_audio_in_has_record_privilege(void) { + pa_operation *o; + pa_context *c; + int err = 0; + PrivilegeData prData; + + prData.paMainloop = pa_threaded_mainloop_new(); + if (prData.paMainloop == NULL) - THROW_ERROR_MSG(CAudioError::EError::ERROR_OUT_OF_MEMORY, "Failed pa_threaded_mainloop_new()"); ++ THROW_ERROR_MSG(CAudioError::EError::ERROR_OUT_OF_MEMORY, "Failed pa_threaded_mainloop_new()"); //LCOV_EXCL_LINE + + c = pa_context_new(pa_threaded_mainloop_get_api(prData.paMainloop), CLIENT_NAME); + if (c == NULL) - THROW_ERROR_MSG(CAudioError::EError::ERROR_OUT_OF_MEMORY, "Failed pa_context_new()"); ++ THROW_ERROR_MSG(CAudioError::EError::ERROR_OUT_OF_MEMORY, "Failed pa_context_new()"); //LCOV_EXCL_LINE + + pa_context_set_state_callback(c, __contextStateChangeCb, prData.paMainloop); + + if (pa_context_connect(c, NULL, PA_CONTEXT_NOFLAGS, NULL) < 0) - THROW_ERROR_MSG(CAudioError::EError::ERROR_OUT_OF_MEMORY, "Failed pa_context_connect()"); ++ THROW_ERROR_MSG(CAudioError::EError::ERROR_OUT_OF_MEMORY, "Failed pa_context_connect()"); //LCOV_EXCL_LINE + + pa_threaded_mainloop_lock(prData.paMainloop); + + if (pa_threaded_mainloop_start(prData.paMainloop) < 0) { + pa_threaded_mainloop_unlock(prData.paMainloop); - THROW_ERROR_MSG(CAudioError::EError::ERROR_FAILED_OPERATION, "Failed pa_threaded_mainloop_start()"); ++ THROW_ERROR_MSG(CAudioError::EError::ERROR_FAILED_OPERATION, "Failed pa_threaded_mainloop_start()"); //LCOV_EXCL_LINE + } + + while (true) { + pa_context_state_t state; + state = pa_context_get_state(c); + + if (state == PA_CONTEXT_READY) + break; + + if (!PA_CONTEXT_IS_GOOD(state)) { ++//LCOV_EXCL_START + err = pa_context_errno(c); + pa_threaded_mainloop_unlock(prData.paMainloop); + THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INTERNAL_OPERATION, + "pa_context's state is not good : err[%d]", err); ++//LCOV_EXCL_STOP + } + + /* Wait until the context is ready */ + pa_threaded_mainloop_wait(prData.paMainloop); + } + + o = pa_context_check_privilege(c, RECORDER_PRIVILEGE, __checkPrivilegeCb, &prData); + if (!o) { ++//LCOV_EXCL_START + pa_threaded_mainloop_unlock(prData.paMainloop); + THROW_ERROR_MSG(CAudioError::EError::ERROR_FAILED_OPERATION, "Failed to pa_context_check_privilege()"); ++//LCOV_EXCL_STOP + } + while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) + pa_threaded_mainloop_wait(prData.paMainloop); + pa_operation_unref(o); + + pa_threaded_mainloop_unlock(prData.paMainloop); + pa_threaded_mainloop_stop(prData.paMainloop); + pa_context_disconnect(c); + pa_context_unref(c); + pa_threaded_mainloop_free(prData.paMainloop); + + return prData.isPrivilegeAllowed; + }