A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita audio rust zig deno mpris rockbox mpd
at master 179 lines 4.9 kB view raw
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}