// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_BROWSER_SPEECH_TTS_MAC_H_
#define CONTENT_BROWSER_SPEECH_TTS_MAC_H_
#import <AVFAudio/AVFAudio.h>
#include "base/functional/callback.h"
#include "base/no_destructor.h"
#include "content/browser/speech/tts_platform_impl.h"
class TtsPlatformImplMac;
@interface ChromeTtsDelegate : NSObject <AVSpeechSynthesizerDelegate>
- (instancetype)initWithPlatformImplMac:(TtsPlatformImplMac*)ttsImplMac;
@end
class TtsPlatformImplMac : public content::TtsPlatformImpl {
public:
static constexpr int kInvalidUtteranceId = -1;
~TtsPlatformImplMac() override;
TtsPlatformImplMac(const TtsPlatformImplMac&) = delete;
TtsPlatformImplMac& operator=(const TtsPlatformImplMac&) = delete;
bool PlatformImplSupported() override;
bool PlatformImplInitialized() override;
void Speak(int utterance_id,
const std::string& utterance,
const std::string& lang,
const content::VoiceData& voice,
const content::UtteranceContinuousParameters& params,
base::OnceCallback<void(bool)> on_speak_finished) override;
bool StopSpeaking() override;
void Pause() override;
void Resume() override;
bool IsSpeaking() override;
void GetVoices(std::vector<content::VoiceData>* out_voices) override;
// Called by ChromeTtsDelegate when we get a callback from the
// native speech engine.
void OnSpeechEvent(int utterance_id,
content::TtsEventType event_type,
int char_index,
int char_length,
const std::string& error_message);
// Get the single instance of this class.
CONTENT_EXPORT static TtsPlatformImplMac* GetInstance();
CONTENT_EXPORT static std::vector<content::VoiceData>& VoicesRefForTesting();
private:
friend base::NoDestructor<TtsPlatformImplMac>;
TtsPlatformImplMac();
void ProcessSpeech(int utterance_id,
const std::string& lang,
const content::VoiceData& voice,
const content::UtteranceContinuousParameters& params,
base::OnceCallback<void(bool)> on_speak_finished,
const std::string& parsed_utterance);
AVSpeechSynthesizer* __strong speech_synthesizer_;
ChromeTtsDelegate* __strong delegate_;
int utterance_id_ = kInvalidUtteranceId;
std::string utterance_;
int last_char_index_ = 0;
bool paused_ = false;
};
#endif // CONTENT_BROWSER_SPEECH_TTS_MAC_H_