record.c
上传用户:ledjyj
上传日期:2014-08-27
资源大小:2639k
文件大小:6k
源码类别:

驱动编程

开发平台:

Unix_Linux

  1. /* record.c
  2.  *
  3.  * Copyright (C) 2001 J鰎gen Scheibengruber
  4.  *
  5.  * This program is free software; you can redistribute it and/or 
  6.  * modify it under the terms of the GNU General Public License as 
  7.  * published by the Free Software Foundation; either version 2 of the
  8.  * License, or (at your option) any later version.
  9.  *
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
  18.  * USA
  19.  */
  20. /*** the recording functionality */
  21. #include <config.h>
  22. #include <sys/types.h>
  23. #include <signal.h>
  24. #include <gnome.h>
  25. #include "gui.h"
  26. #include "tech.h"
  27. #include "rec_tech.h"
  28. #include "prefs.h"
  29. static int timeout_id = -1, wav_io_id = -1, mp3_io_id = -1;
  30. static GtkWidget *file_lbl, *size_lbl;
  31. static GtkWidget *status_dialog;
  32. void close_status_window(void)
  33. {
  34. if (timeout_id >= 0)
  35. {
  36. gtk_timeout_remove(timeout_id);
  37. timeout_id = -1;
  38. }
  39. if (status_dialog)
  40. gtk_widget_destroy(GTK_WIDGET(status_dialog));
  41. status_dialog = NULL;
  42. tray_icon_items_set_sensible(TRUE);
  43. }
  44. static gboolean timeout_cb(gpointer data)
  45. {
  46. Recording *recording = data;
  47. gint s;
  48. gchar *size=NULL;
  49. g_assert(recording);
  50. if (!GTK_WIDGET_VISIBLE(status_dialog))
  51. gtk_widget_show_all(status_dialog);
  52. s = get_file_size(recording->filename);
  53. if (s > 0) {
  54. if (s < 1024) size = g_strdup_printf(_("%i byte"), s);
  55. if ((s >= 1024) && (s < 1024*1024)) size = g_strdup_printf(_("%i kB"), s>>10);
  56. if (s >= 1024*1024) size = g_strdup_printf(_("%.2f MB"), (float)s/1024/1024);
  57. } else {
  58. if (s) size = g_strdup(_("Error"));
  59. else size = g_strdup(_("0 byte"));
  60. }
  61. gtk_label_set_text(GTK_LABEL(file_lbl), recording->filename);
  62. gtk_label_set_text(GTK_LABEL(size_lbl), size);
  63. g_free(size);
  64. return TRUE;
  65. }
  66. void run_status_window(Recording *recording)
  67. {
  68. timeout_id = gtk_timeout_add(500, (GtkFunction) timeout_cb, recording);
  69. }
  70. static void button_clicked_cb(GtkButton *button, gpointer data)
  71. {
  72. Recording *recording = data;
  73. close_status_window();
  74. recording_stop(recording);
  75. }
  76. static gint delete_event_cb(GtkWidget* window, GdkEventAny* e, gpointer data)
  77. {
  78. button_clicked_cb(NULL, data);
  79. return TRUE;
  80. }
  81. GtkWidget* record_status_window(Recording *recording)
  82. {
  83. GtkWidget *btn_label, *btn_pixmap, *button;
  84. GtkWidget *vbox, *btn_box, *hbox;
  85. GtkWidget *table;
  86. GtkWidget *title, *f_lbl, *s_lbl;
  87. char *text, *str;
  88. status_dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  89. gtk_window_set_title(GTK_WINDOW(status_dialog),_("Gnomeradio recording status"));
  90. /*gtk_window_set_resizable(GTK_WINDOW(status_dialog), FALSE);*/
  91. gtk_window_set_default_size(GTK_WINDOW(status_dialog), 400, -1);
  92. vbox = gtk_vbox_new(FALSE, 5);
  93. gtk_container_set_border_width(GTK_CONTAINER(vbox), 6);
  94. table = gtk_table_new(3, 2, FALSE);
  95. gtk_table_set_row_spacings(GTK_TABLE(table), 10);
  96. gtk_table_set_col_spacings(GTK_TABLE(table), 12);
  97. gtk_container_set_border_width(GTK_CONTAINER(table), 6);
  98. str = g_strdup_printf(_("Recording from station %s"), recording->station);
  99. text = g_strdup_printf("<b><big>%s</big></b>", str);
  100. g_free(str);
  101. title = gtk_label_new(text);
  102. g_free(text);
  103. gtk_label_set_use_markup(GTK_LABEL(title), TRUE);
  104. text = g_strdup_printf("  <b>%s</b>", _("Destination:"));
  105. f_lbl = gtk_label_new(text);
  106. g_free(text);
  107. gtk_label_set_use_markup(GTK_LABEL(f_lbl), TRUE);
  108. text = g_strdup_printf("  <b>%s</b>", _("Filesize:"));
  109. s_lbl = gtk_label_new(text);
  110. g_free(text);
  111. gtk_label_set_use_markup(GTK_LABEL(s_lbl), TRUE);
  112. file_lbl = gtk_label_new("");
  113. gtk_label_set_ellipsize(GTK_LABEL(file_lbl), PANGO_ELLIPSIZE_START);
  114. size_lbl = gtk_label_new("");
  115. gtk_misc_set_alignment(GTK_MISC(title), 0.0f, 0.0f); 
  116. gtk_misc_set_alignment(GTK_MISC(f_lbl), 1.0f, 0.5f); 
  117. gtk_misc_set_alignment(GTK_MISC(s_lbl), 1.0f, 0.5f); 
  118. gtk_misc_set_alignment(GTK_MISC(file_lbl), 0.0f, 0.5f); 
  119. gtk_misc_set_alignment(GTK_MISC(size_lbl), 0.0f, 0.5f);
  120. gtk_table_attach(GTK_TABLE(table), title, 0, 2, 0, 1, GTK_FILL | GTK_SHRINK, GTK_FILL | GTK_EXPAND, 0, 0);
  121. gtk_table_attach(GTK_TABLE(table), f_lbl, 0, 1, 1, 2, GTK_FILL | GTK_SHRINK, GTK_FILL, 0, 0);
  122. gtk_table_attach(GTK_TABLE(table), s_lbl, 0, 1, 2, 3, GTK_FILL | GTK_SHRINK, GTK_FILL, 0, 0);
  123. gtk_table_attach(GTK_TABLE(table), file_lbl, 1, 2, 1, 2, GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0);
  124. gtk_table_attach(GTK_TABLE(table), size_lbl, 1, 2, 2, 3, GTK_FILL | GTK_EXPAND, GTK_FILL, 0, 0);
  125. button = gtk_button_new();
  126. btn_box = gtk_hbox_new(FALSE, 0);
  127. btn_label = gtk_label_new(_("Stop Recording"));
  128. btn_pixmap = gtk_image_new_from_stock(GTK_STOCK_STOP, GTK_ICON_SIZE_BUTTON);
  129. gtk_box_pack_start (GTK_BOX(btn_box), btn_pixmap, FALSE, FALSE, 2);
  130. gtk_box_pack_start (GTK_BOX(btn_box), btn_label, FALSE, FALSE, 2);
  131. gtk_container_add(GTK_CONTAINER(button), btn_box);
  132. hbox = gtk_hbox_new(FALSE, 0);
  133. gtk_box_pack_end (GTK_BOX(hbox), button, TRUE, FALSE, 0);
  134. gtk_box_pack_start (GTK_BOX(vbox), table, TRUE, TRUE, 0);
  135. gtk_box_pack_start (GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
  136. gtk_container_add(GTK_CONTAINER(status_dialog), vbox);
  137. g_signal_connect(GTK_OBJECT(status_dialog), "delete_event", GTK_SIGNAL_FUNC(delete_event_cb), recording);
  138. g_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(button_clicked_cb), recording);
  139. gtk_window_set_modal(GTK_WINDOW(status_dialog), TRUE);
  140. return status_dialog;
  141. }