From cf7357606df56c7410faa5f83c90feae1dc56e46 Mon Sep 17 00:00:00 2001 From: deanlee Date: Fri, 5 Nov 2021 16:15:29 +0800 Subject: [PATCH] pass AudibleAlert to setAlert --- selfdrive/ui/soundd.cc | 71 ++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 44 deletions(-) diff --git a/selfdrive/ui/soundd.cc b/selfdrive/ui/soundd.cc index 5da33831b4..ff0aa93593 100644 --- a/selfdrive/ui/soundd.cc +++ b/selfdrive/ui/soundd.cc @@ -21,67 +21,51 @@ void sigHandler(int s) { class Sound : public QObject { public: - explicit Sound(QObject *parent = 0) { + explicit Sound(QObject *parent = 0) : sm({"carState", "controlsState"}) { // TODO: merge again and add EQ in the amp config const QString sound_asset_path = Hardware::TICI() ? "../assets/sounds_tici/" : "../assets/sounds/"; std::tuple sound_list[] = { - {AudibleAlert::CHIME_DISENGAGE, sound_asset_path + "disengaged.wav", false}, - {AudibleAlert::CHIME_ENGAGE, sound_asset_path + "engaged.wav", false}, - {AudibleAlert::CHIME_WARNING1, sound_asset_path + "warning_1.wav", false}, - {AudibleAlert::CHIME_WARNING2, sound_asset_path + "warning_2.wav", false}, - {AudibleAlert::CHIME_WARNING2_REPEAT, sound_asset_path + "warning_2.wav", true}, - {AudibleAlert::CHIME_WARNING_REPEAT, sound_asset_path + "warning_repeat.wav", true}, - {AudibleAlert::CHIME_ERROR, sound_asset_path + "error.wav", false}, - {AudibleAlert::CHIME_PROMPT, sound_asset_path + "error.wav", false} - }; + {AudibleAlert::CHIME_DISENGAGE, "disengaged.wav", false}, + {AudibleAlert::CHIME_ENGAGE, "engaged.wav", false}, + {AudibleAlert::CHIME_WARNING1, "warning_1.wav", false}, + {AudibleAlert::CHIME_WARNING2, "warning_2.wav", false}, + {AudibleAlert::CHIME_WARNING2_REPEAT, "warning_2.wav", true}, + {AudibleAlert::CHIME_WARNING_REPEAT, "warning_repeat.wav", true}, + {AudibleAlert::CHIME_ERROR, "error.wav", false}, + {AudibleAlert::CHIME_PROMPT, "error.wav", false}}; for (auto &[alert, fn, loops] : sound_list) { QSoundEffect *s = new QSoundEffect(this); - QObject::connect(s, &QSoundEffect::statusChanged, this, &Sound::checkStatus); - s->setSource(QUrl::fromLocalFile(fn)); + QObject::connect(s, &QSoundEffect::statusChanged, [=]() { assert(s->status() != QSoundEffect::Error); }); + s->setSource(QUrl::fromLocalFile(sound_asset_path + fn)); sounds[alert] = {s, loops ? QSoundEffect::Infinite : 0}; } - sm = new SubMaster({"carState", "controlsState"}); - QTimer *timer = new QTimer(this); QObject::connect(timer, &QTimer::timeout, this, &Sound::update); timer->start(); }; - ~Sound() { - delete sm; - }; - -private slots: - void checkStatus() { - QSoundEffect *s = qobject_cast(sender()); - assert(s->status() != QSoundEffect::Error); - } void update() { - sm->update(100); - if (sm->updated("carState")) { + sm.update(100); + if (sm.updated("carState")) { // scale volume with speed - volume = util::map_val((*sm)["carState"].getCarState().getVEgo(), 0.f, 20.f, - Hardware::MIN_VOLUME, Hardware::MAX_VOLUME); + float volume = util::map_val(sm["carState"].getCarState().getVEgo(), 0.f, 20.f, + Hardware::MIN_VOLUME, Hardware::MAX_VOLUME); for (auto &[s, loops] : sounds) { s->setVolume(std::round(100 * volume) / 100); } } - if (sm->updated("controlsState")) { - const cereal::ControlsState::Reader &cs = (*sm)["controlsState"].getControlsState(); - setAlert({QString::fromStdString(cs.getAlertText1()), - QString::fromStdString(cs.getAlertText2()), - QString::fromStdString(cs.getAlertType()), - cs.getAlertSize(), cs.getAlertSound()}); - } else if (sm->rcv_frame("controlsState") > 0 && (*sm)["controlsState"].getControlsState().getEnabled() && - ((nanos_since_boot() - sm->rcv_time("controlsState")) / 1e9 > CONTROLS_TIMEOUT)) { - setAlert(CONTROLS_UNRESPONSIVE_ALERT); + if (sm.updated("controlsState")) { + setAlert(sm["controlsState"].getControlsState().getAlertSound()); + } else if (sm.rcv_frame("controlsState") > 0 && sm["controlsState"].getControlsState().getEnabled() && + ((nanos_since_boot() - sm.rcv_time("controlsState")) / 1e9 > CONTROLS_TIMEOUT)) { + setAlert(CONTROLS_UNRESPONSIVE_ALERT.sound); } } - void setAlert(Alert a) { - if (!alert.equal(a)) { - alert = a; + void setAlert(AudibleAlert sound) { + if (current_sound_ != sound) { + current_sound_ = sound; // stop sounds for (auto &[s, loops] : sounds) { // Only stop repeating sounds @@ -91,8 +75,8 @@ private slots: } // play sound - if (alert.sound != AudibleAlert::NONE) { - auto &[s, loops] = sounds[alert.sound]; + if (sound != AudibleAlert::NONE) { + auto &[s, loops] = sounds[sound]; s->setLoopCount(loops); s->play(); } @@ -100,10 +84,9 @@ private slots: } private: - Alert alert; - float volume = Hardware::MIN_VOLUME; + AudibleAlert current_sound_ = AudibleAlert::NONE; QMap> sounds; - SubMaster *sm; + SubMaster sm; }; int main(int argc, char **argv) {