void audio_output_finish(struct audio_output *ao) { audio_output_close(ao); assert(ao->fail_timer == NULL); if (ao->thread != NULL) { g_mutex_lock(ao->mutex); ao_command(ao, AO_COMMAND_KILL); g_mutex_unlock(ao->mutex); g_thread_join(ao->thread); } if (ao->mixer != NULL) mixer_free(ao->mixer); ao_plugin_finish(ao->plugin, ao->data); g_cond_free(ao->cond); g_mutex_free(ao->mutex); if (ao->replay_gain_filter != NULL) filter_free(ao->replay_gain_filter); if (ao->other_replay_gain_filter != NULL) filter_free(ao->other_replay_gain_filter); filter_free(ao->filter); pcm_buffer_deinit(&ao->cross_fade_buffer); }
int audio_output_open(audio_t *audio, media_t media, struct audio_info *info) { struct audio_output *out; if (!valid_audio_params(info)) return AUDIO_OUTPUT_INVALIDPARAM; out = bmalloc(sizeof(struct audio_output)); memset(out, 0, sizeof(struct audio_output)); memcpy(&out->info, info, sizeof(struct audio_info)); pthread_mutex_init_value(&out->line_mutex); out->media = media; out->block_size = get_audio_channels(info->speakers) * get_audio_bytes_per_channel(info->format); if (pthread_mutex_init(&out->line_mutex, NULL) != 0) goto fail; if (event_init(&out->stop_event, true) != 0) goto fail; if (!ao_add_to_media(out)) goto fail; if (pthread_create(&out->thread, NULL, audio_thread, out) != 0) goto fail; out->initialized = true; *audio = out; return AUDIO_OUTPUT_SUCCESS; fail: audio_output_close(out); return AUDIO_OUTPUT_FAIL; }
static void obs_free_audio(void) { struct obs_core_audio *audio = &obs->audio; if (audio->audio) audio_output_close(audio->audio); memset(audio, 0, sizeof(struct obs_core_audio)); }
void audio_output_release(struct audio_output *ao) { if (ao->always_on) audio_output_pause(ao); else audio_output_close(ao); }
void audio_output_finish(struct audio_output *ao) { audio_output_close(ao); assert(ao->fail_timer == NULL); if (ao->thread != NULL) { assert(ao->allow_play); ao_lock_command(ao, AO_COMMAND_KILL); g_thread_join(ao->thread); ao->thread = NULL; } audio_output_free(ao); }
// ---------------------------------------------------------------------------- void player::play_stop() { if ( state_.state == playing ) { audio_output_close(); state_.state = stopped; if ( state_info_cb_ ){ state_info_cb_(state_); } state_.track = dm::track(); state_.source = std::string(); std::cout << "player state=" << state_.state << std::endl; } }
int audio_output_open(audio_t *audio, struct audio_output_info *info) { struct audio_output *out; pthread_mutexattr_t attr; bool planar = is_audio_planar(info->format); if (!valid_audio_params(info)) return AUDIO_OUTPUT_INVALIDPARAM; out = bzalloc(sizeof(struct audio_output)); if (!out) goto fail; memcpy(&out->info, info, sizeof(struct audio_output_info)); pthread_mutex_init_value(&out->line_mutex); out->channels = get_audio_channels(info->speakers); out->planes = planar ? out->channels : 1; out->block_size = (planar ? 1 : out->channels) * get_audio_bytes_per_channel(info->format); if (pthread_mutexattr_init(&attr) != 0) goto fail; if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) != 0) goto fail; if (pthread_mutex_init(&out->line_mutex, &attr) != 0) goto fail; if (pthread_mutex_init(&out->input_mutex, NULL) != 0) goto fail; if (os_event_init(&out->stop_event, OS_EVENT_TYPE_MANUAL) != 0) goto fail; if (pthread_create(&out->thread, NULL, audio_thread, out) != 0) goto fail; out->initialized = true; *audio = out; return AUDIO_OUTPUT_SUCCESS; fail: audio_output_close(out); return AUDIO_OUTPUT_FAIL; }