summaryrefslogtreecommitdiff
path: root/main.c
blob: 71125684c63ffca8fc5b6ec05a81127577dcfda1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <gtk/gtk.h>
#include <stdio.h>
#include <stdint.h>
#include "interface.h"
#include "support.h"
#include "playlist.h"
#include "playback.h"
#include "unistd.h"
#include "threading.h"
#include "messagepump.h"
#include "messages.h"
#include "gtkplaylist.h"
#include "codec.h"
#include "streamer.h"

GtkWidget *mainwin;

int psdl_terminate = 0;

void
psdl_thread (uintptr_t ctx) {
    p_play ();
    while (!psdl_terminate) {
        uint32_t msg;
        uintptr_t ctx;
        uint32_t p1;
        uint32_t p2;
        while (messagepump_pop(&msg, &ctx, &p1, &p2) != -1) {
            switch (msg) {
            case M_SONGCHANGED:
                gtkps_songchanged (p1, p2);
                break;
            case M_PLAYSONG:
                GDK_THREADS_ENTER();
                gtkps_playsong ();
                GDK_THREADS_LEAVE();
                break;
            case M_PLAYSONGNUM:
                GDK_THREADS_ENTER();
                gtkps_playsongnum (p1);
                GDK_THREADS_LEAVE();
                break;
            case M_STOPSONG:
                GDK_THREADS_ENTER();
                gtkps_stopsong ();
                GDK_THREADS_LEAVE();
                break;
            case M_NEXTSONG:
                GDK_THREADS_ENTER();
                p_stop ();
                ps_nextsong (1);
                GDK_THREADS_LEAVE();
                break;
            case M_PREVSONG:
                GDK_THREADS_ENTER();
                p_stop ();
                ps_prevsong ();
                GDK_THREADS_LEAVE();
                break;
            case M_PAUSESONG:
                GDK_THREADS_ENTER();
                gtkps_pausesong ();
                GDK_THREADS_LEAVE();
                break;
            case M_PLAYRANDOM:
                GDK_THREADS_ENTER();
                gtkps_randomsong ();
                GDK_THREADS_LEAVE();
                break;
            case M_SONGSEEK:
                if (playlist_current.codec) {
                    p_pause ();
                    codec_lock ();
                    playlist_current.codec->seek (p1 / 1000.f);
                    codec_unlock ();
                    p_unpause ();
                }
                break;
            case M_ADDDIR:
                // long time processing
                gtkps_add_dir ((char *)ctx);
                break;
            case M_ADDFILES:
                gtkps_add_files ((GSList *)ctx);
                break;
            case M_FMDRAGDROP:
                gtkps_add_fm_dropped_files ((char *)ctx, p1, p2);
                break;
            }
        }
        usleep(10000);
        gtkps_update_songinfo ();
    }
}

int
main (int argc, char *argv[]) {
    messagepump_init ();
    codec_init_locking ();
    streamer_init ();
    p_init ();
    thread_start (psdl_thread, 0);

    g_thread_init (NULL);
    gdk_threads_init ();
    gdk_threads_enter ();
    gtk_set_locale ();
    gtk_init (&argc, &argv);

    mainwin = create_mainwin ();
    gtk_widget_show (mainwin);
    gtk_main ();
    gdk_threads_leave ();
    messagepump_free ();
    psdl_terminate = 1;
    p_free ();
    streamer_free ();
    codec_free_locking ();
    ps_free ();
    return 0;
}