// Copyright (c) 2010 The Chromium OS 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 "include/generator_player.h"

#include <stdint.h>
#include <stdio.h>

GeneratorPlayer::GeneratorPlayer(size_t buf_size,
                                 int num_channels,
                                 const std::set<int> &active_channels,
                                 SampleFormat format,
                                 PlayClient *player)
    : buf_size_(buf_size),
      num_channels_(num_channels),
      active_channels_(active_channels),
      format_(format),
      player_(player),
      is_stopped_(true),
      buffer_(new uint8_t[buf_size_]) {}

void GeneratorPlayer::Play(ToneGenerator *generator) {
  if (!is_stopped_) {
    fprintf(stderr, "Player generator is still playing.\n");
    return;
  }
  is_stopped_ = false;
  thread_ = std::thread(&GeneratorPlayer::Run, this, generator);
}

void GeneratorPlayer::Stop() {
  if (is_stopped_)
    return;
  is_stopped_ = true;
  thread_.join();
}

void GeneratorPlayer::Run(ToneGenerator *generator) {
  while (!is_stopped_ && generator->HasMoreFrames()) {
    size_t frame_read = generator->GetFrames(
        format_, num_channels_, active_channels_, buffer_.get(), buf_size_);
    player_->Play(buffer_.get(), frame_read * num_channels_ * format_.bytes(),
	&is_stopped_);
  }
  is_stopped_ = true;
}
