tts_service.cc 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // Copyright 2020 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "chromeos/services/tts/tts_service.h"
  5. #include <dlfcn.h>
  6. #include <sys/resource.h>
  7. #include "chromeos/services/tts/constants.h"
  8. #include "media/base/audio_parameters.h"
  9. #include "media/base/audio_sample_types.h"
  10. namespace chromeos {
  11. namespace tts {
  12. TtsService::TtsService(mojo::PendingReceiver<mojom::TtsService> receiver)
  13. : service_receiver_(this, std::move(receiver)) {
  14. if (setpriority(PRIO_PROCESS, 0, -10 /* real time audio */) != 0) {
  15. PLOG(ERROR) << "Unable to request real time priority; performance will be "
  16. "impacted.";
  17. }
  18. }
  19. TtsService::~TtsService() = default;
  20. void TtsService::BindGoogleTtsStream(
  21. mojo::PendingReceiver<mojom::GoogleTtsStream> receiver,
  22. mojo::PendingRemote<media::mojom::AudioStreamFactory> factory) {
  23. google_tts_stream_ = std::make_unique<GoogleTtsStream>(
  24. this, std::move(receiver), std::move(factory));
  25. }
  26. void TtsService::BindPlaybackTtsStream(
  27. mojo::PendingReceiver<mojom::PlaybackTtsStream> receiver,
  28. mojo::PendingRemote<media::mojom::AudioStreamFactory> factory,
  29. mojom::AudioParametersPtr desired_audio_parameters,
  30. BindPlaybackTtsStreamCallback callback) {
  31. media::AudioParameters params;
  32. if (desired_audio_parameters) {
  33. params = media::AudioParameters(
  34. media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
  35. media::CHANNEL_LAYOUT_MONO, desired_audio_parameters->sample_rate,
  36. desired_audio_parameters->buffer_size);
  37. if (!params.IsValid()) {
  38. // Returning early disconnects the remote.
  39. return;
  40. }
  41. } else {
  42. // The client did not specify parameters; use defaults.
  43. params = media::AudioParameters(
  44. media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
  45. media::CHANNEL_LAYOUT_MONO, kDefaultSampleRate, kDefaultBufferSize);
  46. }
  47. DCHECK(params.IsValid());
  48. playback_tts_stream_ = std::make_unique<PlaybackTtsStream>(
  49. this, std::move(receiver), std::move(factory), params);
  50. auto ret_params = mojom::AudioParameters::New();
  51. ret_params->sample_rate = params.sample_rate();
  52. ret_params->buffer_size = params.frames_per_buffer();
  53. std::move(callback).Run(std::move(ret_params));
  54. }
  55. void TtsService::MaybeExit() {
  56. if ((!google_tts_stream_ || !google_tts_stream_->IsBound()) &&
  57. (!playback_tts_stream_ || !playback_tts_stream_->IsBound())) {
  58. service_receiver_.reset();
  59. if (!keep_process_alive_for_testing_) {
  60. if (google_tts_stream_)
  61. google_tts_stream_->set_is_in_process_teardown(true);
  62. exit(0);
  63. }
  64. }
  65. }
  66. } // namespace tts
  67. } // namespace chromeos