SM_INSTANCE_CHECK(stream_h);
+ SM_ENTER_CRITICAL_SECTION_WITH_RETURN(&stream_h->vstream_mutex, SOUND_MANAGER_ERROR_INTERNAL);
+ if (stream_h->vstream) {
+ LOGE("virtual stream is still alive");
+ SM_LEAVE_CRITICAL_SECTION(&stream_h->vstream_mutex);
+ return _convert_sound_manager_error_code(__func__, MM_ERROR_SOUND_INVALID_STATE);
+ }
+ SM_LEAVE_CRITICAL_SECTION(&stream_h->vstream_mutex);
+
SM_ENTER_CRITICAL_SECTION_WITH_RETURN(&stream_h->focus_state_mutex, MM_ERROR_SOUND_INTERNAL);
ret = _destroy_pa_connection_and_unregister_focus(stream_h);
SM_LEAVE_CRITICAL_SECTION(&stream_h->focus_state_mutex);
LOGI(">> enter");
+ SM_INSTANCE_CHECK(stream_h);
+
+ SM_ENTER_CRITICAL_SECTION_WITH_RETURN(&stream_h->vstream_mutex, SOUND_MANAGER_ERROR_INTERNAL);
+
+ if (stream_h->vstream) {
+ LOGE("virtual stream was already created. stream_h(%p), vstream(%p)", stream_h, stream_h->vstream);
+ SM_LEAVE_CRITICAL_SECTION(&stream_h->vstream_mutex);
+ return _convert_sound_manager_error_code(__func__, MM_ERROR_SOUND_INVALID_STATE);
+ }
+
ret = _create_virtual_stream(stream_h, &vstream_h);
if (ret == MM_ERROR_NONE)
- *virtual_stream = (virtual_sound_stream_h)vstream_h;
+ *virtual_stream = stream_h->vstream = (virtual_sound_stream_h)vstream_h;
+
+ SM_LEAVE_CRITICAL_SECTION(&stream_h->vstream_mutex);
return _convert_sound_manager_error_code(__func__, ret);
}
int sound_manager_destroy_virtual_stream(virtual_sound_stream_h virtual_stream)
{
int ret = MM_ERROR_NONE;
+ pthread_mutex_t *vstream_mutex;
virtual_sound_stream_info_s *vstream_h = (virtual_sound_stream_info_s*)virtual_stream;
LOGI(">> enter");
+ SM_INSTANCE_CHECK(vstream_h);
+ SM_INSTANCE_CHECK(vstream_h->stream_info);
+
+ vstream_mutex = &vstream_h->stream_info->vstream_mutex;
+
+ SM_ENTER_CRITICAL_SECTION_WITH_RETURN(vstream_mutex, SOUND_MANAGER_ERROR_INTERNAL);
+
ret = _destroy_virtual_stream(vstream_h);
+ vstream_h->stream_info->vstream = NULL;
+
+ SM_LEAVE_CRITICAL_SECTION(vstream_mutex);
return _convert_sound_manager_error_code(__func__, ret);
}
int sound_manager_start_virtual_stream(virtual_sound_stream_h virtual_stream)
{
int ret = MM_ERROR_NONE;
+ pthread_mutex_t *vstream_mutex;
virtual_sound_stream_info_s *vstream_h = (virtual_sound_stream_info_s*)virtual_stream;
LOGI(">> enter");
+ SM_INSTANCE_CHECK(vstream_h);
+ SM_INSTANCE_CHECK(vstream_h->stream_info);
+
+ vstream_mutex = &vstream_h->stream_info->vstream_mutex;
+
+ SM_ENTER_CRITICAL_SECTION_WITH_RETURN(vstream_mutex, SOUND_MANAGER_ERROR_INTERNAL);
+
ret = _start_virtual_stream(vstream_h);
+ SM_LEAVE_CRITICAL_SECTION(vstream_mutex);
+
return _convert_sound_manager_error_code(__func__, ret);
}
int sound_manager_stop_virtual_stream(virtual_sound_stream_h virtual_stream)
{
int ret = MM_ERROR_NONE;
+ pthread_mutex_t *vstream_mutex;
virtual_sound_stream_info_s *vstream_h = (virtual_sound_stream_info_s*)virtual_stream;
LOGI(">> enter");
+ SM_INSTANCE_CHECK(vstream_h);
+ SM_INSTANCE_CHECK(vstream_h->stream_info);
+
+ vstream_mutex = &vstream_h->stream_info->vstream_mutex;
+
+ SM_ENTER_CRITICAL_SECTION_WITH_RETURN(vstream_mutex, SOUND_MANAGER_ERROR_INTERNAL);
+
ret = _stop_virtual_stream(vstream_h);
+ SM_LEAVE_CRITICAL_SECTION(vstream_mutex);
+
return _convert_sound_manager_error_code(__func__, ret);
}
int sound_manager_set_virtual_stream_volume(virtual_sound_stream_h virtual_stream, double ratio)
{
int ret = MM_ERROR_NONE;
+ pthread_mutex_t *vstream_mutex;
virtual_sound_stream_info_s *vstream_h = (virtual_sound_stream_info_s*)virtual_stream;
LOGI(">> enter");
+ SM_INSTANCE_CHECK(vstream_h);
+ SM_INSTANCE_CHECK(vstream_h->stream_info);
+
+ vstream_mutex = &vstream_h->stream_info->vstream_mutex;
+
+ SM_ENTER_CRITICAL_SECTION_WITH_RETURN(vstream_mutex, MM_ERROR_SOUND_INTERNAL);
+
ret = _set_virtual_stream_volume(vstream_h, ratio);
+ SM_LEAVE_CRITICAL_SECTION(vstream_mutex);
+
return _convert_sound_manager_error_code(__func__, ret);
}