|
|
ed4d8c |
#include <math.h></math.h>
|
|
|
ed4d8c |
#include <time.h></time.h>
|
|
|
ed4d8c |
#include <gtk gtk.h=""></gtk>
|
|
|
ed4d8c |
#include <al.h></al.h>
|
|
|
ed4d8c |
#include <alc.h></alc.h>
|
|
|
ed4d8c |
|
|
|
ed4d8c |
|
|
|
ed4d8c |
const double pi = 3.141592653589793;
|
|
|
ed4d8c |
|
|
|
ed4d8c |
GtkWidget *hours[3], *minutes[3];
|
|
|
ed4d8c |
GtkWidget *enable_alarm;
|
|
|
ed4d8c |
|
|
|
ed4d8c |
|
|
|
ed4d8c |
// This function plays beep via OpenAL.
|
|
|
ed4d8c |
// It's may be difficult to understand how it works, so just use it as is.
|
|
|
ed4d8c |
// This function uses OpenAL, so you need
|
|
|
ed4d8c |
// to include <al.h> and <alc.h></alc.h></al.h>
|
|
|
ed4d8c |
// and link with OpenAL library (for GCC add param: -lopenal)
|
|
|
ed4d8c |
void beep() {
|
|
|
ed4d8c |
const int frequency = 440;
|
|
|
ed4d8c |
const int rate = 10000;
|
|
|
ed4d8c |
|
|
|
ed4d8c |
ALCshort samples[2000];
|
|
|
ed4d8c |
const int count = 2000;
|
|
|
ed4d8c |
|
|
|
ed4d8c |
for(int i = 0; i < count; ++i)
|
|
|
ed4d8c |
samples[i] = (int)(32760*sin(2*pi*i*frequency/rate));
|
|
|
ed4d8c |
|
|
|
ed4d8c |
ALCdevice *device = alcOpenDevice(NULL);
|
|
|
ed4d8c |
ALCcontext *context = alcCreateContext(device, NULL);
|
|
|
ed4d8c |
alcMakeContextCurrent(context);
|
|
|
ed4d8c |
|
|
|
ed4d8c |
ALuint buffer, source;
|
|
|
ed4d8c |
alGenBuffers(1, &buffer);
|
|
|
ed4d8c |
alBufferData(buffer, AL_FORMAT_MONO16, samples, sizeof(samples), rate);
|
|
|
ed4d8c |
alGenSources(1, &source);
|
|
|
ed4d8c |
alSourcei(source, AL_BUFFER, buffer);
|
|
|
ed4d8c |
alSourcePlay(source);
|
|
|
ed4d8c |
|
|
|
ed4d8c |
g_usleep(count*1000000/rate + 10000);
|
|
|
ed4d8c |
|
|
|
ed4d8c |
alcMakeContextCurrent(NULL);
|
|
|
ed4d8c |
alcDestroyContext(context);
|
|
|
ed4d8c |
alcCloseDevice(device);
|
|
|
ed4d8c |
}
|
|
|
ed4d8c |
|
|
|
ed4d8c |
gboolean timeout(gpointer data) {
|
|
|
ed4d8c |
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(enable_alarm))) {
|
|
|
ed4d8c |
time_t timer = time(NULL);
|
|
|
ed4d8c |
struct tm *t = localtime(&timer);
|
|
|
ed4d8c |
for(int i = 0; i < 3; ++i) {
|
|
|
ed4d8c |
int hour = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(hours[i]));
|
|
|
ed4d8c |
int minute = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(minutes[i]));
|
|
|
ed4d8c |
if (hour == t->tm_hour && minute == t->tm_min)
|
|
|
ed4d8c |
beep();
|
|
|
ed4d8c |
}
|
|
|
ed4d8c |
}
|
|
|
ed4d8c |
return TRUE;
|
|
|
ed4d8c |
}
|
|
|
ed4d8c |
|
|
|
ed4d8c |
void activate(GtkApplication* app, gpointer data) {
|
|
|
ed4d8c |
GtkWidget *window = gtk_application_window_new (app);
|
|
|
ed4d8c |
gtk_container_set_border_width(GTK_CONTAINER(window), 10);
|
|
|
ed4d8c |
|
|
|
ed4d8c |
GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
|
|
|
ed4d8c |
gtk_container_add(GTK_CONTAINER(window), vbox);
|
|
|
ed4d8c |
|
|
|
ed4d8c |
GtkWidget *label = gtk_label_new("Set following three alarm clocks,\nenable alarm\nand take a sleep.");
|
|
|
ed4d8c |
gtk_container_add(GTK_CONTAINER(vbox), label);
|
|
|
ed4d8c |
|
|
|
ed4d8c |
for(int i = 0; i < 3; ++i) {
|
|
|
ed4d8c |
GtkWidget *hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
|
|
|
ed4d8c |
gtk_container_add(GTK_CONTAINER(vbox), hbox);
|
|
|
ed4d8c |
|
|
|
ed4d8c |
hours[i] = gtk_spin_button_new(NULL, 1.2, 0);
|
|
|
ed4d8c |
gtk_spin_button_set_range(GTK_SPIN_BUTTON(hours[i]), 0.0, 23.0);
|
|
|
ed4d8c |
gtk_spin_button_set_increments(GTK_SPIN_BUTTON(hours[i]), 1.0, 10.0);
|
|
|
ed4d8c |
gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(hours[i]), TRUE);
|
|
|
ed4d8c |
gtk_container_add(GTK_CONTAINER(hbox), hours[i]);
|
|
|
ed4d8c |
|
|
|
ed4d8c |
minutes[i] = gtk_spin_button_new(NULL, 1.2, 0);
|
|
|
ed4d8c |
gtk_spin_button_set_range(GTK_SPIN_BUTTON(minutes[i]), 0.0, 59.0);
|
|
|
ed4d8c |
gtk_spin_button_set_increments(GTK_SPIN_BUTTON(minutes[i]), 1.0, 10.0);
|
|
|
ed4d8c |
gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(minutes[i]), TRUE);
|
|
|
ed4d8c |
gtk_container_add(GTK_CONTAINER(hbox), minutes[i]);
|
|
|
ed4d8c |
}
|
|
|
ed4d8c |
|
|
|
ed4d8c |
// set initial values
|
|
|
ed4d8c |
time_t timer = time(NULL);
|
|
|
ed4d8c |
struct tm *t = localtime(&timer);
|
|
|
ed4d8c |
int h = t->tm_hour;
|
|
|
ed4d8c |
int m = t->tm_min;
|
|
|
ed4d8c |
|
|
|
ed4d8c |
gtk_spin_button_set_value(GTK_SPIN_BUTTON(hours[0]), h);
|
|
|
ed4d8c |
gtk_spin_button_set_value(GTK_SPIN_BUTTON(minutes[0]), m);
|
|
|
ed4d8c |
|
|
|
ed4d8c |
m += 1;
|
|
|
ed4d8c |
if (m >= 60) { m -= 60; h = (h + 1)%24; }
|
|
|
ed4d8c |
gtk_spin_button_set_value(GTK_SPIN_BUTTON(hours[1]), h);
|
|
|
ed4d8c |
gtk_spin_button_set_value(GTK_SPIN_BUTTON(minutes[1]), m);
|
|
|
ed4d8c |
|
|
|
ed4d8c |
m += 4;
|
|
|
ed4d8c |
if (m >= 60) { m -= 60; h = (h + 1)%24; }
|
|
|
ed4d8c |
gtk_spin_button_set_value(GTK_SPIN_BUTTON(hours[2]), h);
|
|
|
ed4d8c |
gtk_spin_button_set_value(GTK_SPIN_BUTTON(minutes[2]), m);
|
|
|
ed4d8c |
|
|
|
ed4d8c |
enable_alarm = gtk_check_button_new_with_label("Enable alarm");
|
|
|
ed4d8c |
gtk_container_add(GTK_CONTAINER(vbox), enable_alarm);
|
|
|
ed4d8c |
|
|
|
ed4d8c |
gtk_widget_show_all(window);
|
|
|
ed4d8c |
|
|
|
ed4d8c |
g_timeout_add(1000, timeout, NULL);
|
|
|
ed4d8c |
}
|
|
|
ed4d8c |
|
|
|
ed4d8c |
int main(int argc, char **argv) {
|
|
|
ed4d8c |
GtkApplication *application = gtk_application_new(NULL, 0);
|
|
|
ed4d8c |
g_signal_connect(application, "activate", G_CALLBACK(activate), NULL);
|
|
|
ed4d8c |
int status = g_application_run(G_APPLICATION(application), argc, argv);
|
|
|
ed4d8c |
g_object_unref(application);
|
|
|
ed4d8c |
return status;
|
|
|
ed4d8c |
}
|
|
|
ed4d8c |
|
|
|
ed4d8c |
|