137
void dbus_player_data_function(MediaPlayerRec *media_player) {
138
// This is called from media players on the DBus (see dbus_player.c module).
139
// Map the MediaPlayerRec data to this module.
141
if (!media_player) return;
143
dbus_player_debug_print(media_player);
147
Removed by moma 17.04.2012
149
// MediaPlayer is active?
150
if (!media_player->active) {
152
// Stop recording and return
153
rec_manager_stop_recording();
158
// Create a message and send it to the queue.
160
// Pointer to TrackInfo
161
TrackInfo *track = &media_player->track;
163
// MediaPlayer changed status.
165
if (track->status == PLAYER_STATUS_PAUSED) {
167
// Send RECORDING_PAUSE message to the queue
168
rec_manager_send_command_ex(RECORDING_PAUSE, track->track/*track*/,
169
track->artist/*artist*/,
170
track->album/*album*/,
171
track->current_secs/*track_pos*/,
172
track->total_secs/*track_len*/,
173
track->flags/*flags*/);
175
} else if (track->status == PLAYER_STATUS_PLAYING) {
177
// Send RECORDING_START message to the queue
178
rec_manager_send_command_ex(RECORDING_START, track->track/*track*/,
179
track->artist/*artist*/,
180
track->album/*album*/,
181
track->current_secs/*track_pos*/,
182
track->total_secs/*track_len*/,
183
track->flags/*flags*/);
185
} else if (track->status == PLAYER_STATUS_NOTIFY_MSG) {
187
// Send RECORDING_NOTIFY_MSG message to the queue
188
rec_manager_send_command_ex(RECORDING_NOTIFY_MSG, track->track/*track*/,
189
track->artist/*artist*/,
190
track->album/*album*/,
191
track->current_secs/*track_pos*/,
192
track->total_secs/*track_len*/,
193
track->flags/*flags*/);
196
// track.status == PLAYER_STATUS_CLOSED ||
197
// track.status == PLAYER_STATUS_STOPPED
199
// Send RECORDING_STOP message to the queue
200
rec_manager_send_command_ex(RECORDING_STOP, track->track/*track*/,
201
track->artist/*artist*/,
202
track->album/*album*/,
203
track->current_secs/*track_pos*/,
204
track->total_secs/*track_len*/,
205
track->flags/*flags*/);
209
137
gint64 rec_manager_get_stream_time() {
210
138
// Get and return current recording time (stream time) in seconds.
211
139
return rec_get_stream_time();
383
311
g_async_queue_push(g_cmd_queue, (gpointer)cmd);
386
static void rec_manager_start_command_thread() {
387
// Create a work thread to handle all incoming messages/commands
388
GError *error = NULL;
390
GThread *gthread = g_thread_create(rec_manager_command_thread, NULL, FALSE, &error);
391
if (!gthread || error) {
392
LOG_ERROR("Cannot start command thread. This program has terminated. %s\n", (error ? error->message : ""));
396
// This is a fatal error
314
gboolean rec_manager_command_thread(gpointer user_data) {
315
// Read next command from the queue
316
RecorderCommand *cmd = (RecorderCommand*)g_async_queue_try_pop(g_cmd_queue);
318
// TRUE: Continue calling this function
401
void *rec_manager_command_thread(gpointer user_data) {
402
#define TIMEOUT_USECONDS (5*G_USEC_PER_SEC)
404
while (!g_rec_manager_stop) {
406
RecorderCommand *cmd = NULL;
408
// Glib version is < 2.31.20?
409
// Ref: http://developer.gnome.org/glib/2.30/glib-Version-Information.html
410
// http://ftp.gnome.org/pub/gnome/sources/glib/
412
// $ pkg-config --modversion glib-2.0
414
#if (!GLIB_CHECK_VERSION(2, 31, 18))
415
// Glib version is < 2.31.18.
416
// We must use the older g_async_queue_timed_pop(...) function.
420
g_get_current_time(&time);
421
g_time_val_add(&time, TIMEOUT_USECONDS/*in micro seconds*/);
423
// Read next command from the queue
424
cmd = (RecorderCommand*)g_async_queue_timed_pop(g_cmd_queue, &time);
426
// Glib version is >= 2.31.18.
427
// We use the newer g_async_queue_timeout_pop(...) function.
429
// Read next command from the queue
430
cmd = (RecorderCommand*)g_async_queue_timeout_pop(g_cmd_queue, TIMEOUT_USECONDS/*in micro seconds*/);
436
323
#ifdef ACTIVE_DEBUGGING
437
rec_manager_print_command(cmd);
324
rec_manager_print_command(cmd);
440
if (cmd->type == RECORDING_START) {
441
// Save the values so gst-recorder.c can grab them
442
conf_save_string_value("track/track-name", check_null(cmd->track));
443
conf_save_int_value("track/track-pos", cmd->track_pos);
444
conf_save_int_value("track/track-len", cmd->track_len);
445
conf_save_string_value("track/artist-name", check_null(cmd->artist));
446
conf_save_string_value("track/album-name", check_null(cmd->album));
449
// Verify the delete flag and filename
450
gboolean del_flag = FALSE;
451
if (cmd->flags == RECORDING_DELETE_FILE) {
452
gchar *filename = NULL;
453
conf_get_string_value("track/last-track-name", &filename);
455
// Remove path and file extension
459
split_filename3(filename, &path, &base, &ext);
461
// Filenames do match?
462
del_flag = (filename && !g_strcmp0(base, cmd->track));
472
rec_stop_recording(del_flag/*delete file?*/);
475
case RECORDING_START:
476
rec_start_recording();
479
case RECORDING_PAUSE:
480
rec_pause_recording();
483
case RECORDING_CONTINUE:
484
rec_continue_recording();
487
case RECORDING_NOTIFY_MSG:
488
win_set_error_text(cmd->track);
491
case RECORDING_SHOW_WINDOW:
492
win_show_window(TRUE);
495
case RECORDING_HIDE_WINDOW:
496
win_show_window(FALSE);
499
case RECORDING_QUIT_LOOP:
500
rec_stop_recording(FALSE);
501
g_rec_manager_stop = TRUE;
504
case RECORDING_QUIT_APP:
505
rec_stop_recording(FALSE);
508
win_quit_application();
513
// Free the lastly saved command
514
rec_manager_free_command(g_last_rec_cmd);
517
g_last_rec_cmd = cmd;
521
LOG_DEBUG("rec_manager_command_thread: Command thread has terminated.\n");
327
if (cmd->type == RECORDING_START) {
328
// Save the values so gst-recorder.c can grab them
329
conf_save_string_value("track/track-name", check_null(cmd->track));
330
conf_save_int_value("track/track-pos", cmd->track_pos);
331
conf_save_int_value("track/track-len", cmd->track_len);
332
conf_save_string_value("track/artist-name", check_null(cmd->artist));
333
conf_save_string_value("track/album-name", check_null(cmd->album));
336
// Verify the delete flag and filename
337
gboolean del_flag = FALSE;
338
if (cmd->flags == RECORDING_DELETE_FILE) {
339
gchar *filename = NULL;
340
conf_get_string_value("track/last-track-name", &filename);
342
// Remove path and file extension
346
split_filename3(filename, &path, &base, &ext);
348
// Filenames do match?
349
del_flag = (filename && !g_strcmp0(base, cmd->track));
359
rec_stop_recording(del_flag/*delete file?*/);
362
case RECORDING_START:
363
rec_start_recording();
366
case RECORDING_PAUSE:
367
rec_pause_recording();
370
case RECORDING_CONTINUE:
371
rec_continue_recording();
374
case RECORDING_NOTIFY_MSG:
375
win_set_error_text(cmd->track);
378
case RECORDING_SHOW_WINDOW:
379
win_show_window(TRUE);
382
case RECORDING_HIDE_WINDOW:
383
win_show_window(FALSE);
386
case RECORDING_QUIT_LOOP:
387
rec_stop_recording(FALSE);
390
case RECORDING_QUIT_APP:
391
rec_stop_recording(FALSE);
394
win_quit_application();
399
// Free the lastly saved command
400
rec_manager_free_command(g_last_rec_cmd);
403
g_last_rec_cmd = cmd;
405
// TRUE: Continue calling this function