A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita
audio
rust
zig
deno
mpris
rockbox
mpd
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2010 Robert Bieber
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
16 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21
22#include "skintimer.h"
23#include "ui_skintimer.h"
24
25const int SkinTimer::millisPerTick = 250;
26
27SkinTimer::SkinTimer(DeviceState* device, QWidget *parent) :
28 QWidget(parent),
29 ui(new Ui::SkinTimer),
30 device(device)
31{
32 ui->setupUi(this);
33 setupUI();
34}
35
36SkinTimer::~SkinTimer()
37{
38 delete ui;
39}
40
41void SkinTimer::setupUI()
42{
43 playStateButtons.append(ui->playButton);
44 playStateButtons.append(ui->pauseButton);
45 playStateButtons.append(ui->rwndButton);
46 playStateButtons.append(ui->ffwdButton);
47
48 QObject::connect(ui->startButton, SIGNAL(clicked()),
49 this, SLOT(start()));
50 QObject::connect(ui->stopButton, SIGNAL(clicked()),
51 this, SLOT(stop()));
52 QObject::connect(&timer, SIGNAL(timeout()),
53 this, SLOT(tick()));
54 for(int i = 0; i < playStateButtons.count(); i++)
55 QObject::connect(playStateButtons[i], SIGNAL(toggled(bool)),
56 this, SLOT(stateChange()));
57 QObject::connect(device, SIGNAL(settingsChanged()),
58 this, SLOT(deviceChange()));
59
60 int playState = device->data("?mp").toInt();
61 switch(playState)
62 {
63 default:
64 case 1:
65 ui->playButton->setChecked(true);
66 break;
67 case 2:
68 ui->pauseButton->setChecked(true);
69 break;
70 case 3:
71 ui->ffwdButton->setChecked(true);
72 break;
73 case 4:
74 ui->rwndButton->setChecked(true);
75 break;
76 }
77}
78
79void SkinTimer::start()
80{
81 ui->startButton->setEnabled(false);
82 ui->stopButton->setEnabled(true);
83 ui->speedBox->setEnabled(false);
84 ui->durationBox->setEnabled(false);
85
86 totalTime = ui->durationBox->value() * 1000;
87 elapsedTime = 0;
88
89 timer.setInterval(millisPerTick);
90 ui->statusBar->setValue(0);
91 timer.start();
92}
93
94void SkinTimer::stop()
95{
96 ui->startButton->setEnabled(true);
97 ui->stopButton->setEnabled(false);
98 ui->speedBox->setEnabled(true);
99 ui->durationBox->setEnabled(true);
100
101 timer.stop();
102}
103
104void SkinTimer::tick()
105{
106
107 elapsedTime += millisPerTick * ui->speedBox->value();
108 if(elapsedTime >= totalTime)
109 {
110 ui->statusBar->setValue(100);
111 stop();
112 }
113
114 /* Calculating the simulated time elapsed */
115 double dTime = millisPerTick * ui->speedBox->value() / 1000;
116
117 /* Adding to the device's simtime */
118 device->setData("simtime", device->data("simtime").toDouble() + dTime);
119
120 /* Adding to the song time depending on mode*/
121 double songTime = device->data("?pc").toDouble();
122 double trackTime = device->data("?pt").toDouble();
123 if(ui->playButton->isChecked())
124 songTime += dTime;
125 else if(ui->rwndButton->isChecked())
126 songTime -= 2 * dTime;
127 else if(ui->ffwdButton->isChecked())
128 songTime += 2 * dTime;
129
130 if(songTime > trackTime)
131 {
132 songTime = trackTime;
133 ui->pauseButton->setChecked(true);
134 }
135 if(songTime < 0)
136 {
137 songTime = 0;
138 ui->pauseButton->setChecked(true);
139 }
140
141 device->setData("?pc", songTime);
142
143 /* Updating the status bar */
144 ui->statusBar->setValue(elapsedTime * 100 / totalTime);
145}
146
147void SkinTimer::stateChange()
148{
149 if(ui->playButton->isChecked())
150 device->setData("mp", "Play");
151 else if(ui->pauseButton->isChecked())
152 device->setData("mp", "Pause");
153 else if(ui->rwndButton->isChecked())
154 device->setData("mp", "Rewind");
155 else if(ui->ffwdButton->isChecked())
156 device->setData("mp", "Fast Forward");
157}
158
159void SkinTimer::deviceChange()
160{
161 int playState = device->data("?mp").toInt();
162 switch(playState)
163 {
164 case 1:
165 ui->playButton->setChecked(true);
166 break;
167 case 2:
168 ui->pauseButton->setChecked(true);
169 break;
170 case 3:
171 ui->ffwdButton->setChecked(true);
172 break;
173 case 4:
174 ui->rwndButton->setChecked(true);
175 break;
176 default:
177 break;
178 }
179}