// Copyright 2019 The Cobalt Authors. 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 "starboard/shared/pulse/pulse_dynamic_load_dispatcher.h"

#include <dlfcn.h>

#include "starboard/common/log.h"
#include "starboard/once.h"

namespace starboard {
namespace shared {
namespace pulse {

namespace {
const char kPulseLibraryName[] = "libpulse.so";
void* pulse_lib_handle = NULL;
}  // namespace

int (*pa_context_connect)(pa_context*,
                          const char*,
                          pa_context_flags_t,
                          const pa_spawn_api*) = NULL;
void (*pa_context_disconnect)(pa_context*) = NULL;
pa_context_state_t (*pa_context_get_state)(pa_context*) = NULL;
pa_context* (*pa_context_new)(pa_mainloop_api*, const char*) = NULL;
void (*pa_context_set_state_callback)(pa_context*,
                                      pa_context_notify_cb_t,
                                      void*) = NULL;
void (*pa_context_unref)(pa_context*) = NULL;

size_t (*pa_frame_size)(const pa_sample_spec*) = NULL;
void (*pa_mainloop_free)(pa_mainloop*);
pa_mainloop_api* (*pa_mainloop_get_api)(pa_mainloop*) = NULL;
int (*pa_mainloop_iterate)(pa_mainloop*, int, int*) = NULL;
pa_mainloop* (*pa_mainloop_new)(void) = NULL;

void (*pa_operation_unref)(pa_operation*) = NULL;

int (*pa_stream_connect_playback)(pa_stream*,
                                  const char*,
                                  const pa_buffer_attr*,
                                  pa_stream_flags_t,
                                  const pa_cvolume*,
                                  pa_stream*) = NULL;
pa_operation* (*pa_stream_cork)(pa_stream*,
                                int,
                                pa_stream_success_cb_t,
                                void*) = NULL;
int (*pa_stream_disconnect)(pa_stream*) = NULL;
pa_stream_state_t (*pa_stream_get_state)(pa_stream*) = NULL;
int (*pa_stream_get_time)(pa_stream*, pa_usec_t*) = NULL;
int (*pa_stream_is_corked)(pa_stream*) = NULL;
pa_stream* (*pa_stream_new)(pa_context*,
                            const char*,
                            const pa_sample_spec*,
                            const pa_channel_map*) = NULL;
void (*pa_stream_set_underflow_callback)(pa_stream*,
                                         pa_stream_notify_cb_t,
                                         void*) = NULL;
void (*pa_stream_set_write_callback)(pa_stream*,
                                     pa_stream_request_cb_t,
                                     void*) = NULL;
void (*pa_stream_unref)(pa_stream*) = NULL;
size_t (*pa_stream_writable_size)(pa_stream*) = NULL;
int (*pa_stream_write)(pa_stream*,
                       const void*,
                       size_t,
                       pa_free_cb_t,
                       int64_t,
                       pa_seek_mode_t) = NULL;

void ReportSymbolError() {
  SB_LOG(ERROR) << "Pulse audio error: " << dlerror();
  dlclose(pulse_lib_handle);
  pulse_lib_handle = NULL;
}

bool pulse_load_library() {
  SB_DCHECK(!pulse_lib_handle);

  pulse_lib_handle = dlopen(kPulseLibraryName, RTLD_LAZY);
  if (!pulse_lib_handle) {
    return false;
  }

#define INITSYMBOL(symbol)                                                  \
  symbol =                                                                  \
      reinterpret_cast<decltype(symbol)>(dlsym(pulse_lib_handle, #symbol)); \
  if (!symbol) {                                                            \
    ReportSymbolError();                                                    \
    return false;                                                           \
  }

  INITSYMBOL(pa_context_connect);
  INITSYMBOL(pa_context_disconnect);
  INITSYMBOL(pa_context_get_state);
  INITSYMBOL(pa_context_new);
  INITSYMBOL(pa_context_set_state_callback);
  INITSYMBOL(pa_context_unref);
  INITSYMBOL(pa_frame_size);
  INITSYMBOL(pa_mainloop_free);
  INITSYMBOL(pa_mainloop_get_api);
  INITSYMBOL(pa_mainloop_iterate);
  INITSYMBOL(pa_mainloop_new);
  INITSYMBOL(pa_operation_unref);
  INITSYMBOL(pa_stream_connect_playback);
  INITSYMBOL(pa_stream_cork);
  INITSYMBOL(pa_stream_disconnect);
  INITSYMBOL(pa_stream_get_state);
  INITSYMBOL(pa_stream_get_time);
  INITSYMBOL(pa_stream_is_corked);
  INITSYMBOL(pa_stream_new);
  INITSYMBOL(pa_stream_set_underflow_callback);
  INITSYMBOL(pa_stream_set_write_callback);
  INITSYMBOL(pa_stream_unref);
  INITSYMBOL(pa_stream_writable_size);
  INITSYMBOL(pa_stream_write);

  return true;
}

void pulse_unload_library() {
  SB_DCHECK(pulse_lib_handle);

  dlclose(pulse_lib_handle);
  pulse_lib_handle = NULL;
}

}  // namespace pulse
}  // namespace shared
}  // namespace starboard
