Home | History | Annotate | Download | only in extensions
      1 // Copyright (c) 2011 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 
      5 #include "extension_tts_api.h"
      6 
      7 #include <string>
      8 
      9 #include "base/memory/singleton.h"
     10 #include "base/values.h"
     11 #include "chrome/browser/extensions/extension_function.h"
     12 
     13 #import <Cocoa/Cocoa.h>
     14 
     15 namespace util = extension_tts_api_util;
     16 
     17 class ExtensionTtsPlatformImplMac : public ExtensionTtsPlatformImpl {
     18  public:
     19   virtual bool Speak(
     20       const std::string& utterance,
     21       const std::string& language,
     22       const std::string& gender,
     23       double rate,
     24       double pitch,
     25       double volume);
     26 
     27   virtual bool StopSpeaking();
     28 
     29   virtual bool IsSpeaking();
     30 
     31   // Get the single instance of this class.
     32   static ExtensionTtsPlatformImplMac* GetInstance();
     33 
     34  private:
     35   ExtensionTtsPlatformImplMac();
     36   virtual ~ExtensionTtsPlatformImplMac() {}
     37 
     38   NSSpeechSynthesizer* speech_synthesizer_;
     39 
     40   friend struct DefaultSingletonTraits<ExtensionTtsPlatformImplMac>;
     41 
     42   DISALLOW_COPY_AND_ASSIGN(ExtensionTtsPlatformImplMac);
     43 };
     44 
     45 // static
     46 ExtensionTtsPlatformImpl* ExtensionTtsPlatformImpl::GetInstance() {
     47   return ExtensionTtsPlatformImplMac::GetInstance();
     48 }
     49 
     50 bool ExtensionTtsPlatformImplMac::Speak(
     51     const std::string& utterance,
     52     const std::string& language,
     53     const std::string& gender,
     54     double rate,
     55     double pitch,
     56     double volume) {
     57   // NSSpeechSynthesizer equivalents for kGenderKey and kLanguageNameKey do
     58   // not exist and thus are not supported.
     59 
     60   if (rate >= 0.0) {
     61     // The TTS api defines rate via words per minute.
     62     [speech_synthesizer_
     63         setObject:[NSNumber numberWithInt:rate * 400]
     64         forProperty:NSSpeechRateProperty error:nil];
     65   }
     66 
     67   if (pitch >= 0.0) {
     68     // The TTS api allows an approximate range of 30 to 65 for speech pitch.
     69     [speech_synthesizer_
     70         setObject: [NSNumber numberWithInt:(pitch * 35 + 30)]
     71         forProperty:NSSpeechPitchBaseProperty error:nil];
     72   }
     73 
     74   if (volume >= 0.0) {
     75     [speech_synthesizer_
     76         setObject: [NSNumber numberWithFloat:volume]
     77         forProperty:NSSpeechVolumeProperty error:nil];
     78   }
     79 
     80   return [speech_synthesizer_ startSpeakingString:
     81              [NSString stringWithUTF8String: utterance.c_str()]];
     82 }
     83 
     84 bool ExtensionTtsPlatformImplMac::StopSpeaking() {
     85   [speech_synthesizer_ stopSpeaking];
     86   return true;
     87 }
     88 
     89 bool ExtensionTtsPlatformImplMac::IsSpeaking() {
     90   return [speech_synthesizer_ isSpeaking];
     91 }
     92 
     93 ExtensionTtsPlatformImplMac::ExtensionTtsPlatformImplMac() {
     94   speech_synthesizer_ = [[NSSpeechSynthesizer alloc] init];
     95 }
     96 
     97 // static
     98 ExtensionTtsPlatformImplMac* ExtensionTtsPlatformImplMac::GetInstance() {
     99   return Singleton<ExtensionTtsPlatformImplMac>::get();
    100 }
    101