1 // Copyright 2013 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.
5 #include "ui/app_list/speech_ui_model.h"
13 // The default sound level, just gotten from the developer device.
14 const int16 kDefaultSoundLevel
= 200;
18 SpeechUIModel::SpeechUIModel()
21 state_(app_list::SPEECH_RECOGNITION_OFF
),
22 minimum_sound_level_(kDefaultSoundLevel
),
23 maximum_sound_level_(kDefaultSoundLevel
) {
26 SpeechUIModel::~SpeechUIModel() {}
28 void SpeechUIModel::SetSpeechResult(const base::string16
& result
,
30 if (result_
== result
&& is_final_
== is_final
)
35 FOR_EACH_OBSERVER(SpeechUIModelObserver
,
37 OnSpeechResult(result
, is_final
));
40 void SpeechUIModel::UpdateSoundLevel(int16 level
) {
41 if (sound_level_
== level
)
46 // Tweak the sound level limits adaptively.
47 // - min is the minimum value during the speech recognition starts but speech
48 // itself hasn't started.
49 // - max is the maximum value when the user speaks.
50 if (state_
== SPEECH_RECOGNITION_IN_SPEECH
)
51 maximum_sound_level_
= std::max(level
, maximum_sound_level_
);
53 minimum_sound_level_
= std::min(level
, minimum_sound_level_
);
55 if (maximum_sound_level_
< minimum_sound_level_
) {
56 maximum_sound_level_
= std::max(
57 static_cast<int16
>(minimum_sound_level_
+ kDefaultSoundLevel
),
61 int16 range
= maximum_sound_level_
- minimum_sound_level_
;
62 uint8 visible_level
= 0;
64 int16 visible_level_in_range
=
65 std::min(std::max(minimum_sound_level_
, sound_level_
),
66 maximum_sound_level_
);
68 (visible_level_in_range
- minimum_sound_level_
) * kuint8max
/ range
;
71 FOR_EACH_OBSERVER(SpeechUIModelObserver
,
73 OnSpeechSoundLevelChanged(visible_level
));
76 void SpeechUIModel::SetSpeechRecognitionState(SpeechRecognitionState new_state
,
77 bool always_show_ui
) {
78 // Don't show the speech view on a change to a network error or if the state
79 // has not changed, unless |always_show_ui| is true.
80 if (!always_show_ui
&&
81 (state_
== new_state
|| new_state
== SPEECH_RECOGNITION_NETWORK_ERROR
)) {
88 // Revert the min/max sound level to the default.
89 if (state_
!= SPEECH_RECOGNITION_RECOGNIZING
&&
90 state_
!= SPEECH_RECOGNITION_IN_SPEECH
) {
91 minimum_sound_level_
= kDefaultSoundLevel
;
92 maximum_sound_level_
= kDefaultSoundLevel
;
95 FOR_EACH_OBSERVER(SpeechUIModelObserver
,
97 OnSpeechRecognitionStateChanged(new_state
));
100 void SpeechUIModel::AddObserver(SpeechUIModelObserver
* observer
) {
101 observers_
.AddObserver(observer
);
104 void SpeechUIModel::RemoveObserver(SpeechUIModelObserver
* observer
) {
105 observers_
.RemoveObserver(observer
);
108 } // namespace app_list