194 lines
5.9 KiB
C++
194 lines
5.9 KiB
C++
/*
|
|
* adapted from the work of Adam Feakin <adamf@snika.uklinux.net>
|
|
* and Daniel Stodden <stodden@in.tum.de>
|
|
* for the audacious media player
|
|
*
|
|
* 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.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <time.h>
|
|
#include <pthread.h>
|
|
#include <string.h>
|
|
|
|
#include <math.h>
|
|
#include <glib.h>
|
|
|
|
#include <deadbeef/deadbeef.h>
|
|
#define DDB_WARN_DEPRECATED 1
|
|
|
|
#define trace(fmt,...)
|
|
|
|
static const char alarm_conf_dlg[] =
|
|
"property \"Hour\" hscale[0,23,1] alarm_conf_hour 6;\n"
|
|
"property \"Minute\" hscale[0,59,1] alarm_conf_min 30;\n"
|
|
"property \"Monday\" checkbox alarm_conf_day1 1;\n"
|
|
"property \"Tuesday\" checkbox alarm_conf_day2 1;\n"
|
|
"property \"Wednesday\" checkbox alarm_conf_day3 1;\n"
|
|
"property \"Thursday\" checkbox alarm_conf_day4 1;\n"
|
|
"property \"Friday\" checkbox alarm_conf_day5 1;\n"
|
|
"property \"Saturday\" checkbox alarm_conf_day6 0;\n"
|
|
"property \"Sunday\" checkbox alarm_conf_day0 0;\n"
|
|
"property \"volume\" hscale[0,100,1] alarm_conf_volume 60;\n"
|
|
"property \"playlist\n(leave empty to use current list)\" file alarm_conf_pls \"\";\n"
|
|
;
|
|
|
|
const char* pl_fallback = NULL;
|
|
|
|
static const char* conf_keys[] = {
|
|
"alarm_conf_day0",
|
|
"alarm_conf_day1",
|
|
"alarm_conf_day2",
|
|
"alarm_conf_day3",
|
|
"alarm_conf_day4",
|
|
"alarm_conf_day5",
|
|
"alarm_conf_day6" };
|
|
|
|
static DB_functions_t* deadbeef = NULL;
|
|
|
|
static int timeout_source;
|
|
static time_t play_start;
|
|
|
|
/* the main alarm thread */
|
|
static gboolean alarm_timeout (void * unused) {
|
|
struct tm *currtime;
|
|
time_t timenow;
|
|
unsigned today;
|
|
int alarm_h, alarm_m;
|
|
float newVolume;
|
|
int alarm_on;
|
|
|
|
timenow = time(nullptr);
|
|
currtime = localtime(&timenow);
|
|
today = currtime->tm_wday;
|
|
|
|
/* already went off? */
|
|
if (timenow < play_start + 60)
|
|
return true;
|
|
|
|
/* not activated today? */
|
|
alarm_on = deadbeef->conf_get_int(conf_keys[today],1);
|
|
if (alarm_on != 1)
|
|
return true;
|
|
else
|
|
{
|
|
alarm_h = deadbeef->conf_get_int("alarm_conf_hour",6);
|
|
alarm_m = deadbeef->conf_get_int("alarm_conf_min",30);
|
|
}
|
|
|
|
/* compare the current time with the alarm setting */
|
|
if ((currtime->tm_hour != alarm_h) || (currtime->tm_min != alarm_m))
|
|
return true;
|
|
|
|
/* none of the early exits were taken;
|
|
* it must be time to start playing something.
|
|
* First set the volume */
|
|
int confVolume = deadbeef->conf_get_int("alarm_conf_volume",60);
|
|
newVolume = ((float) confVolume/2)-50;
|
|
deadbeef->volume_set_db(newVolume);
|
|
|
|
/* Next try to load the requested playlist */
|
|
deadbeef->pl_select_all();
|
|
char pname[200];
|
|
deadbeef->conf_get_str("alarm_conf_pls",pl_fallback,pname,sizeof(pname));
|
|
trace("adding playlist %s\n", pname);
|
|
|
|
ddb_playlist_t *pl = deadbeef->plt_get_curr();
|
|
DB_playItem_t *after = deadbeef->pl_get_last (PL_MAIN);
|
|
|
|
int ab=0;
|
|
DB_playItem_t *it;
|
|
it = deadbeef->plt_load2 (0, pl, after, pname, &ab, NULL, NULL);
|
|
if (!it) {
|
|
trace("failed to load playlist %s\n", pname);
|
|
}
|
|
else {
|
|
/* successfully loaded playlist, so delete previous contents */
|
|
deadbeef->pl_delete_selected();
|
|
}
|
|
|
|
if (after) {
|
|
deadbeef->pl_item_unref(after);
|
|
}
|
|
|
|
/* Start playing */
|
|
play_start=time(nullptr);
|
|
DB_playItem_t *first = deadbeef->pl_get_first (PL_MAIN);
|
|
int trackid = deadbeef->plt_get_item_idx (pl, first, PL_MAIN);
|
|
/* Avoid hard-coding trackid=1, in case random playorder is in effect */
|
|
deadbeef->sendmessage(DB_EV_PLAY_NUM,0,trackid,0);
|
|
|
|
if (first) {
|
|
deadbeef->pl_item_unref(first);
|
|
}
|
|
|
|
deadbeef->plt_unref(pl);
|
|
return true;
|
|
}
|
|
|
|
int onStart() {
|
|
timeout_source = g_timeout_add_seconds(12, alarm_timeout, nullptr);
|
|
return 0;
|
|
}
|
|
|
|
int onStop() {
|
|
if (timeout_source)
|
|
{
|
|
g_source_remove (timeout_source);
|
|
timeout_source = 0;
|
|
}
|
|
return 0;
|
|
}
|
|
// define plugin interface
|
|
static DB_misc_t plugin = {
|
|
.plugin = {
|
|
.type = DB_PLUGIN_MISC,
|
|
.api_vmajor = 1,
|
|
.api_vminor = 9,
|
|
.version_major = 0,
|
|
.version_minor = 1,
|
|
.id = "alarm",
|
|
.name = "Alarm Clock",
|
|
.descr = "load a playlist and start the music at a predetermined time",
|
|
.copyright = "Copyright (C) 2022 John McQuah <jmcquah@disroot.org>\n"
|
|
"\n"
|
|
"This program is free software; you can redistribute it and/or\n"
|
|
"modify it under the terms of the GNU General Public License\n"
|
|
"as published by the Free Software Foundation; either version 2\n"
|
|
"of the License, or (at your option) any later version.\n"
|
|
"\n"
|
|
"This program is distributed in the hope that it will be useful,\n"
|
|
"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
|
|
"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
|
|
"GNU General Public License for more details.\n"
|
|
"\n"
|
|
"You should have received a copy of the GNU General Public License\n"
|
|
"along with this program; if not, write to the Free Software\n"
|
|
"Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n",
|
|
.website = "https://git.sdf.org/jmq/cruxports/deadbeef-alarm",
|
|
.start = onStart,
|
|
.stop = onStop,
|
|
.connect = NULL,
|
|
.disconnect = NULL,
|
|
.configdialog = alarm_conf_dlg,
|
|
}
|
|
};
|
|
|
|
extern "C" DB_plugin_t *alarm_load (DB_functions_t *ddb) {
|
|
deadbeef = ddb;
|
|
return &plugin.plugin;
|
|
}
|