summaryrefslogtreecommitdiffstats
path: root/src/seekhelper.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/seekhelper.cpp')
-rw-r--r--src/seekhelper.cpp134
1 files changed, 134 insertions, 0 deletions
diff --git a/src/seekhelper.cpp b/src/seekhelper.cpp
new file mode 100644
index 0000000..eab7c1a
--- /dev/null
+++ b/src/seekhelper.cpp
@@ -0,0 +1,134 @@
+/***************************************************************************
+ seekhelper.cpp - description
+ -------------------
+ begin : Sam Mai 10 2003
+ copyright : (C) 2003 by Martin Witte
+ email : witte@kawo1.rwth-aachen.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "include/seekhelper.h"
+
+#include <kdebug.h>
+
+SeekHelper::SeekHelper(ISeekRadio &parent)
+ : m_state(off),
+ m_parent(parent),
+ m_SoundStreamID(SoundStreamID::InvalidID)
+{
+}
+
+
+SeekHelper::~SeekHelper()
+{
+}
+
+
+bool SeekHelper::connectI (Interface *i)
+{
+ bool a = IRadioDeviceClient::connectI(i);
+ bool b = ISoundStreamClient::connectI(i);
+ return a || b;
+}
+
+
+bool SeekHelper::disconnectI(Interface *i)
+{
+ bool a = IRadioDeviceClient::disconnectI(i);
+ bool b = ISoundStreamClient::disconnectI(i);
+ return a || b;
+}
+
+
+void SeekHelper::start(const SoundStreamID &id, direction_t dir)
+{
+ m_SoundStreamID = id;
+ if (m_state == off) {
+ getData();
+ m_state = isGood() ? searchWorse : searchBest;
+ m_direction = dir;
+
+ queryIsMuted(m_SoundStreamID, m_oldMute);
+ sendMute(m_SoundStreamID, true);
+
+ m_parent.notifySeekStarted(m_direction == up);
+
+ step();
+ }
+}
+
+
+void SeekHelper::stop ()
+{
+ if (m_state != off) {
+ m_state = off;
+ abort();
+ sendMute(m_SoundStreamID, m_oldMute);
+ m_parent.notifySeekStopped();
+ m_SoundStreamID = SoundStreamID::InvalidID;
+ }
+}
+
+
+void SeekHelper::finish ()
+{
+ if (m_state != off) {
+ applyBest();
+ const RadioStation &rs = queryCurrentStation();
+
+ stop();
+ m_parent.notifySeekFinished(rs, isGood());
+ }
+}
+
+
+void SeekHelper::step ()
+{
+ if (m_state == off)
+ return;
+
+ getData();
+
+ switch (m_state) {
+
+ case off : break;
+
+ case searchWorse :
+ if (isWorse())
+ m_state = searchBest;
+
+ if (! nextSeekStep()) {
+ stop();
+ }
+
+ break;
+
+ case searchBest :
+ if (isWorse() && bestFound()) {
+ finish();
+ } else {
+ if (isBetter() && isGood()) {
+ rememberBest();
+ }
+ if (! nextSeekStep()) {
+ if (isGood() && bestFound()) {
+ finish();
+ } else {
+ stop();
+ }
+ }
+ }
+ break;
+ }
+}
+
+
+