// Copyright (c) 2012 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.
//
// Header for SVOX Pico TTS engine implementation.

#ifndef SPEECH_CLIENT_SYNTHESIS_SERVICE_PICO_PICO_TTS_ENGINE_H_
#define SPEECH_CLIENT_SYNTHESIS_SERVICE_PICO_PICO_TTS_ENGINE_H_

#include <map>
#include <string>
#include <vector>

#include "base/basictypes.h"
#include "base/compiler_specific.h"

#include "pico/picoapi.h"
#include "pico/picodbg.h"
#include "pico/picodefs.h"

#include "tts_engine.h"

namespace speech_synthesis {

//TODO(chaitanyag): Add a comment about the units of these values once we hear
// back from the SVox.
// Speaking speed
const int PICO_MIN_RATE = 20;
const int PICO_MAX_RATE = 500;
const int PICO_DEF_RATE = 100;

// Speaking pitch
const int PICO_MIN_PITCH = 50;
const int PICO_MAX_PITCH = 200;
const int PICO_DEF_PITCH = 100;

// Speaking volume
const int PICO_MIN_VOL = 0;
const int PICO_MAX_VOL = 500;
const int PICO_DEF_VOL = 120;

struct PicoTtsVoice : public TtsVoice {
 public:
  std::string ta_lingware;
  std::string sg_lingware;
  std::string utpp_lingware;
};

// Thread-safe.  Unfortunately Pico is not 64-bit clean.
class PicoTtsEngine : public TtsEngine {
 public:
  // A hack to prevent infinite loops.
  static int max_iterations_without_apparent_progress;

  explicit PicoTtsEngine(const std::string& base_path);
  virtual ~PicoTtsEngine();

  // TtsEngine overrides:
  virtual tts_result Init() OVERRIDE;
  virtual tts_result Shutdown() OVERRIDE;
  virtual tts_result Stop() OVERRIDE;
  virtual int GetVoiceCount() OVERRIDE;
  virtual const TtsVoice* GetVoiceInfo(int voice_index) OVERRIDE;
  virtual tts_result SetVoice(int voice_index) OVERRIDE;
  virtual void SetReceiver(TtsDataReceiver* receiver) OVERRIDE;
  virtual tts_result SetProperty(const char *property,
                                 const char *value) OVERRIDE;
  virtual tts_result SetRate(float rate) OVERRIDE;
  virtual tts_result SetPitch(float pitch) OVERRIDE;
  virtual tts_result SetVolume(float volume) OVERRIDE;
  virtual tts_result GetProperty(const char *property,
                                 const char **value) OVERRIDE;
  virtual int GetSampleRate() OVERRIDE;
  virtual tts_result SynthesizeText(const char *text,
                                    int16_t* audio_buffer,
                                    int audio_buffer_size,
                                    int* out_total_samples) OVERRIDE;

 private:
  tts_result LoadVoices(const std::string& filename);
  void CleanResources();
  tts_result InitVoice(int voice_index);
  tts_result GetAudioFromTts(int16_t* audio_buffer,
                             int audio_buffer_size,
                             int* out_total_samples);
  tts_result SetProperty(const char *property, float value);
  void AppendProperties(const char *text, std::string *synth_text);

  std::string base_path_;

  std::vector<PicoTtsVoice> voices_;
  int current_voice_index_;

  std::map<std::string, std::string> properties_;

  void *          mem_area_;
  pico_System     system_;
  pico_Engine     engine_;
  pico_Resource   ta_resource_;
  pico_Resource   sg_resource_;

  TtsDataReceiver *receiver_;

  DISALLOW_COPY_AND_ASSIGN(PicoTtsEngine);
};

}  // namespace speech_synthesis

#endif  // SPEECH_CLIENT_SYNTHESIS_SERVICE_PICO_PICO_TTS_ENGINE_H_
