# Copyright 2021 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.

import("//third_party/protobuf/proto_library.gni")

config("enable_fake_microphone_public") {
  defines = [ "ENABLE_FAKE_MICROPHONE" ]
}

config("speech_config") {
  include_dirs = [ "//third_party/protobuf/src" ]
}

proto_library("google_streaming_api_proto") {
  sources = [ "google_streaming_api.proto" ]
  generate_python = false
}

copy("speech_testdata") {
  install_content = true

  sources = [
    "testdata/audio1.raw",
    "testdata/audio2.raw",
    "testdata/audio3.raw",
    "testdata/quit.raw",
  ]

  outputs = [ "$sb_static_contents_output_data_dir/test/{{source_root_relative_dir}}/{{source_file_part}}" ]
}

static_library("speech") {
  has_pedantic_warnings = true

  # Creates cycle with //cobalt/dom
  check_includes = false

  sources = [
    "audio_encoder_flac.cc",
    "audio_encoder_flac.h",
    "cobalt_speech_recognizer.cc",
    "cobalt_speech_recognizer.h",
    "endpointer_delegate.cc",
    "endpointer_delegate.h",
    "google_speech_service.cc",
    "google_speech_service.h",
    "microphone.h",
    "microphone_manager.cc",
    "microphone_manager.h",
    "speech_configuration.h",
    "speech_recognition.cc",
    "speech_recognition.h",
    "speech_recognition_alternative.h",
    "speech_recognition_config.h",
    "speech_recognition_error.cc",
    "speech_recognition_error.h",
    "speech_recognition_event.cc",
    "speech_recognition_event.h",
    "speech_recognition_manager.cc",
    "speech_recognition_manager.h",
    "speech_recognition_result.cc",
    "speech_recognition_result.h",
    "speech_recognition_result_list.cc",
    "speech_recognition_result_list.h",
    "speech_recognizer.cc",
    "speech_recognizer.h",
    "speech_synthesis.cc",
    "speech_synthesis.h",
    "speech_synthesis_error_event.h",
    "speech_synthesis_event.cc",
    "speech_synthesis_event.h",
    "speech_synthesis_utterance.cc",
    "speech_synthesis_utterance.h",
    "speech_synthesis_voice.h",
  ]

  configs += [ ":speech_config" ]

  public_deps = [
    # Additionally, ensure that the include directories for generated
    # headers are put on the include directories for targets that depend
    # on this one.
    "//cobalt/browser:generated_types",
  ]

  deps = [
    ":google_streaming_api_proto",
    "//cobalt/base",
    "//cobalt/loader",
    "//cobalt/media",
    "//cobalt/network",
    "//cobalt/script",
    "//cobalt/web:dom_exception",
    "//content/browser/speech",
    "//starboard:starboard_group",
    "//third_party/flac",
    "//third_party/protobuf:protobuf_lite",
    "//url",
  ]

  if (is_starboard) {
    sources += [
      "microphone_starboard.cc",
      "microphone_starboard.h",
    ]
  }

  if (is_starboard && !is_gold) {
    sources += [
      "microphone_fake.cc",
      "microphone_fake.h",
      "url_fetcher_fake.cc",
      "url_fetcher_fake.h",
    ]

    public_configs = [ ":enable_fake_microphone_public" ]
    deps += [ "//cobalt/audio" ]
  }

  if (!is_gold) {
    deps += [ ":speech_testdata" ]
  }
}
