// Copyright 2018 Samsung Electronics. 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/contrib/tizen/shared/alsa/alsa_util.h"

#include <pulse/error.h>
#include "starboard/log.h"

namespace starboard {
namespace shared {
namespace alsa {

void* AlsaOpenPlaybackDevice(int channel,
                             int sample_rate,
                             pa_sample_format sample_type) {
  const pa_sample_spec ss = {
      .format = sample_type, .rate = sample_rate, .channels = channel};
  int error;
  pa_simple* playback_handle =
      pa_simple_new(NULL, "cobalt", PA_STREAM_PLAYBACK, NULL, "playback", &ss,
                    NULL, NULL, &error);
  if (!playback_handle) {
    SB_LOG(ERROR) << " pa_simple_new failed " << pa_strerror(error);
  }

  return playback_handle;
}

bool AlsaWriteFrames(void* playback_handle, const void* buffer, size_t bytes) {
  if (bytes == 0) {
    return true;
  }

  int error;
  pa_simple* handle = reinterpret_cast<pa_simple*>(playback_handle);
  if (pa_simple_write(handle, buffer, (size_t)bytes, &error) < 0) {
    SB_LOG(ERROR) << " pa_simple_write failed " << pa_strerror(error);
    return false;
  }

  return true;
}

int AlsaGetBufferedFrames(void* playback_handle) {
  pa_usec_t latency;
  int error;
  latency = pa_simple_get_latency(reinterpret_cast<pa_simple*>(playback_handle),
                                  &error);
  if (latency != (pa_usec_t)-1)
    return (int)latency;
  SB_LOG(ERROR) << " pa_simple_get_latency failed " << pa_strerror(error);
  return 0;
}

void AlsaCloseDevice(void* playback_handle) {
  if (playback_handle) {
    int error;
    if (pa_simple_drain(reinterpret_cast<pa_simple*>(playback_handle), &error) <
        0) {
      SB_LOG(ERROR) << " pa_simple_drain failed " << pa_strerror(error);
    }
    pa_simple_free(reinterpret_cast<pa_simple*>(playback_handle));
  }
}

bool AlsaDrain(void* playback_handle) {
  if (playback_handle) {
    int error;
    if (pa_simple_drain(reinterpret_cast<pa_simple*>(playback_handle), &error) <
        0) {
      SB_LOG(ERROR) << " pa_simple_drain failed " << pa_strerror(error);
      return false;
    }
  }
  return true;
}

}  // namespace alsa
}  // namespace shared
}  // namespace starboard
