// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/media/audio/audio/audio_core_client.h"

namespace media::audio {
AudioCoreClient::AudioCoreClient(sys::ComponentContext* startup_context, fit::closure quit_callback)
    : quit_callback_(std::move(quit_callback)) {
  audio_core_.set_error_handler([this](zx_status_t status) {
    FXL_LOG(ERROR) << "Connection to fuchsia.media.AudioCore failed: " << status;
    quit_callback_();
  });

  startup_context->svc()->Connect(audio_core_.NewRequest());

  audio_core_.events().SystemGainMuteChanged = [this](float gain, bool muted) {
    system_gain_db_ = gain;
    system_muted_ = muted;
    NotifyGainMuteChanged();
  };

  startup_context->outgoing()->AddPublicService<fuchsia::media::Audio>(
      [this](fidl::InterfaceRequest<fuchsia::media::Audio> request) {
        bindings_.AddBinding(this,
                             fidl::InterfaceRequest<fuchsia::media::Audio>(std::move(request)));
        bindings_.bindings().back()->events().SystemGainMuteChanged(system_gain_db_, system_muted_);
      });
}

void AudioCoreClient::NotifyGainMuteChanged() {
  for (auto& binding : bindings_.bindings()) {
    binding->events().SystemGainMuteChanged(system_gain_db_, system_muted_);
  }
}

}  // namespace media::audio
