From: Marko Nykanen Date: Sun, 22 Nov 2009 06:06:51 +0000 (+0200) Subject: simpler ui X-Git-Tag: 0.3.2~1 X-Git-Url: https://vcs.maemo.org/git/?a=commitdiff_plain;h=5dd087636e42968e6b88a4b6a34401c1ed91af33;hp=98890a8ca7a15631cd74131059a4416bb7162956;p=maemo-recorder simpler ui --- diff --git a/data/Makefile.am b/data/Makefile.am index a972a88..9c8912e 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -5,7 +5,10 @@ servicedir = /usr/share/dbus-1/services service_DATA = maemo_recorder.service pixmapdir = $(datadir)/pixmaps -pixmap_DATA = maemo_recorder.png +pixmap_DATA = recorder.png + +pixmapicondir = $(pixmapdir)/recorder +pixmapicon_DATA = record.png play.png stop.png pause.png EXTRA_DIST = \ maemo_recorder.desktop \ diff --git a/data/maemo_recorder.desktop b/data/maemo_recorder.desktop index f81d244..c768a2d 100644 --- a/data/maemo_recorder.desktop +++ b/data/maemo_recorder.desktop @@ -4,10 +4,10 @@ Version=1.0 Type=Application Name=Recorder Exec=/usr/bin/maemo_recorder -Icon=maemo_recorder -X-Window-Icon=maemo_recorder -X-Window-Icon-Dimmed=maemo_recorder -X-Icon-path=/usr/share/pixmaps/ +Icon=recorder +X-Window-Icon=recorder +X-Window-Icon-Dimmed=recorder +X-Icon-path=/usr/share/pixmaps X-HildonDesk-ShowInToolbar=true X-Osso-Service=com.nokia.maemo_recorder X-Osso-Type=application/x-executable diff --git a/data/maemo_recorder.png b/data/maemo_recorder.png deleted file mode 100644 index 01d66be..0000000 Binary files a/data/maemo_recorder.png and /dev/null differ diff --git a/data/pause.png b/data/pause.png new file mode 100644 index 0000000..895a908 Binary files /dev/null and b/data/pause.png differ diff --git a/data/play.png b/data/play.png new file mode 100644 index 0000000..beb197c Binary files /dev/null and b/data/play.png differ diff --git a/data/record.png b/data/record.png new file mode 100644 index 0000000..bf00e5f Binary files /dev/null and b/data/record.png differ diff --git a/data/recorder.png b/data/recorder.png new file mode 100644 index 0000000..01d66be Binary files /dev/null and b/data/recorder.png differ diff --git a/data/stop.png b/data/stop.png new file mode 100644 index 0000000..e90cba8 Binary files /dev/null and b/data/stop.png differ diff --git a/debian/changelog b/debian/changelog index b75ba10..fb1ca50 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,11 @@ +recorder (0.3.2) unstable; urgency=low + + * simpler ui + * pause + * tmpdir for recordings + + -- Marko Nykanen Sat, 21 Nov 2009 22:17:30 +0200 + recorder (0.3.1) unstable; urgency=low * Name changed to Recorder diff --git a/debian/recorder.postinst b/debian/recorder.postinst index 74f2f1b..bc9840b 100644 --- a/debian/recorder.postinst +++ b/debian/recorder.postinst @@ -22,6 +22,7 @@ case "$1" in update-mime-database /usr/share/mime update-desktop-database -q hildon-update-category-database /usr/share/mime + gconftool -s /apps/maemo-recorder/settings/default_dir "/home/user/MyDocs/.recorder" --type=string ;; abort-upgrade|abort-remove|abort-deconfigure) diff --git a/src/maemo-recorder-file.h b/src/maemo-recorder-file.h index 07da5b8..7544796 100644 --- a/src/maemo-recorder-file.h +++ b/src/maemo-recorder-file.h @@ -41,7 +41,7 @@ G_BEGIN_DECLS #define DEFAULT_TMP_PCMA_FILE "mrec.pcma" #define DEFAULT_TMP_PCMU_FILE "mrec.pcmu" #define DEFAULT_TMP_FILE "mrec.raw" -#define DEFAULT_TMP_WAV_FILE "mrec.wav" +#define DEFAULT_TMP_WAV_FILE "untitled.wav" #define DEFAULT_TMP_ILBC_FILE "mrec.ilbc" /* diff --git a/src/maemo-recorder-ui.c b/src/maemo-recorder-ui.c index 7e7381a..b0e4b75 100644 --- a/src/maemo-recorder-ui.c +++ b/src/maemo-recorder-ui.c @@ -41,7 +41,7 @@ #define DEFAULT_REC_BLOCKSIZE "160" #define STOP_DELAY 500 -#define REC_UPDATE_INTERVAL 750 +#define REC_UPDATE_INTERVAL 500 #define PLAY_UPDATE_INTERVAL 200 /* MACROs */ @@ -97,9 +97,9 @@ static gboolean seekToZero(AppData *data, GstElement *pipeline); static void setLength(AppData *data, gdouble secs); static void setFormatString(AppData *data, AudioFormat afmt); static gboolean cbStopPlayback(AppData *data); -static void cbStop(GtkWidget* widget, AppData *data); -static void cbPlay(GtkWidget* widget, AppData *data); -static void cbRec(GtkWidget* widget, AppData *data); +static void cbStop(GtkWidget* widget, GdkEventButton *event, AppData *data); +static void cbPlay(GtkWidget* widget, GdkEventButton *event, AppData *data); +static void cbRec(GtkWidget* widget, GdkEventButton *event, AppData *data); static void cbNew(GtkWidget* widget, AppData *data); static void cbOpen(GtkWidget* widget, AppData *data); /*static void cbSave(GtkWidget* widget, AppData *data);*/ @@ -392,9 +392,9 @@ static gboolean destroyPipeline(AppData *data, PipeLineType type) ULOG_INFO("%s() - Stopping playback/recording", G_STRFUNC); - hildon_banner_show_information(GTK_WIDGET(data->mainView), NULL, RECORDER_MSG_STOPPED); - gtk_entry_set_text(GTK_ENTRY(data->mainViewData.stateEntry), - RECORDER_MSG_STOPPED); + //hildon_banner_show_information(GTK_WIDGET(data->mainView), NULL, RECORDER_MSG_STOPPED); + gtk_label_set_text(GTK_LABEL(data->mainViewData.stateEntry), ""); + gtk_widget_set_sensitive(data->buttonRec, TRUE); switch (type) { @@ -456,12 +456,12 @@ static void pipelineStateChanged (GstElement *element, g_free(tmp); tmp = NULL; ULOG_INFO("%s() - Recording", G_STRFUNC); - gtk_entry_set_text(GTK_ENTRY(data->mainViewData.stateEntry), + gtk_label_set_text(GTK_LABEL(data->mainViewData.stateEntry), RECORDER_MSG_RECORDING); gtk_widget_set_state(data->buttonRec, GTK_STATE_ACTIVE); - if (data->recUpdateId == 0 && gettimeofday(&data->recStartTv, NULL) == 0) + if (data->recUpdateId == 0) { data->recUpdateId = g_timeout_add_full(G_PRIORITY_DEFAULT_IDLE, REC_UPDATE_INTERVAL, (GSourceFunc) cbUpdateRecLength, data, NULL); } @@ -473,7 +473,7 @@ static void pipelineStateChanged (GstElement *element, g_free(tmp); tmp = NULL; ULOG_INFO("%s() - Playing", G_STRFUNC); - gtk_entry_set_text(GTK_ENTRY(data->mainViewData.stateEntry), + gtk_label_set_text(GTK_LABEL(data->mainViewData.stateEntry), RECORDER_MSG_PLAYING); gtk_widget_set_state(data->buttonPlay, GTK_STATE_ACTIVE); /* @@ -486,8 +486,7 @@ static void pipelineStateChanged (GstElement *element, case GST_STATE_READY: /* hildon_banner_show_information(GTK_WIDGET(data->mainView), NULL, "Ready..."); */ ULOG_INFO("%s() - Ready", G_STRFUNC); - gtk_entry_set_text(GTK_ENTRY(data->mainViewData.stateEntry), - RECORDER_MSG_READY); + gtk_label_set_text(GTK_LABEL(data->mainViewData.stateEntry), ""); break; case GST_STATE_PAUSED: @@ -500,7 +499,7 @@ static void pipelineStateChanged (GstElement *element, if (GST_IS_ELEMENT(data->playPipeline) && gst_element_query_position(data->playPipeline, &fmt, &pos) && pos != 0) { hildon_banner_show_information(GTK_WIDGET(data->mainView), NULL, RECORDER_MSG_PAUSED); - gtk_entry_set_text(GTK_ENTRY(data->mainViewData.stateEntry), + gtk_label_set_text(GTK_LABEL(data->mainViewData.stateEntry), RECORDER_MSG_PAUSED); } gtk_widget_set_state(data->buttonRec, GTK_STATE_NORMAL); @@ -564,9 +563,9 @@ static gboolean cbBus(GstBus *bus, case APPSTATE_PLAYING: /* stop playback after a short break*/ g_timeout_add(STOP_DELAY, (GSourceFunc)cbStopPlayback, data); - hildon_banner_show_information(GTK_WIDGET(app->mainView), NULL, RECORDER_MSG_STOPPED); - gtk_entry_set_text(GTK_ENTRY(app->mainViewData.stateEntry), - RECORDER_MSG_STOPPED); + //hildon_banner_show_information(GTK_WIDGET(app->mainView), NULL, RECORDER_MSG_STOPPED); + gtk_label_set_text(GTK_LABEL(app->mainViewData.stateEntry), + ""); break; @@ -653,6 +652,9 @@ static gboolean cbCheckPosition (AppData *data) if (gst_element_query_position(data->playPipeline, &fmt, &pos)) { gdouble time = GST_TIME_TO_SECS(pos); + guint mins = 0; + gdouble secs; + gchar* tmp; ULOG_DEBUG("pos = %lld, time = %f", pos, @@ -663,6 +665,18 @@ static gboolean cbCheckPosition (AppData *data) GTK_ADJUSTMENT(data->mainViewData.adjustment), time); gtk_adjustment_value_changed(GTK_ADJUSTMENT(data->mainViewData.adjustment)); + if (secs >= 60.0) + { + mins = secs / 60; + secs -= mins * 60.0; + } + + tmp = g_strdup_printf("%02u:%02d", mins, (int)secs); + + gtk_label_set_text(GTK_LABEL(data->mainViewData.ctime), + tmp); + g_free(tmp); + } if (APPSTATE_PLAYING == getAppState(data)) @@ -681,7 +695,12 @@ static void cbNew(GtkWidget* widget, AppData *data) return; /* remove pipelines if existing */ - destroyPipelines(data); + if (APPSTATE_PLAYING == getAppState(data) || APPSTATE_RECORDING == getAppState(data)) { + cbStop(widget, NULL, data); + destroyPipelines(data); + } + + setAppState(data, APPSTATE_READY); ULOG_DEBUG_F("cbNew"); /* destroy tmp file */ @@ -694,12 +713,13 @@ static void cbNew(GtkWidget* widget, AppData *data) data->file_format = FORMAT_NONE; /* update display */ - gtk_entry_set_text(GTK_ENTRY(data->mainViewData.fileNameEntry), + gtk_label_set_text(GTK_LABEL(data->mainViewData.fileNameEntry), RECORDER_FILE_UNTITLED); setLength(data, 0.0); /* update the display + scale */ gtk_adjustment_set_value(GTK_ADJUSTMENT(data->mainViewData.adjustment), 0); + gtk_label_set_text(GTK_LABEL(data->mainViewData.ctime), "00:00"); gtk_widget_set_sensitive(data->buttonSave, FALSE); gtk_widget_set_sensitive(data->buttonSaveAs, FALSE); data->saved = TRUE; @@ -724,6 +744,10 @@ static void cbOpen(GtkWidget* widget, AppData *data) if (!closeFile(data)) return; + if (APPSTATE_PLAYING == getAppState(data) || APPSTATE_RECORDING == getAppState(data)) { + cbStop(widget, NULL, data); + destroyPipelines(data); + } #if 0 /* create filter */ @@ -759,8 +783,15 @@ static void cbOpen(GtkWidget* widget, AppData *data) */ } - if (NULL == selected) /* no file selected */ + if (NULL == selected) + { + /* no file selected */ + if (!g_file_test(getFileName(data), G_FILE_TEST_EXISTS)) + { + cbNew(widget, data); + } return; + } ULOG_INFO("%s() - selected filename = '%s'", G_STRFUNC, selected); @@ -773,7 +804,7 @@ static void cbOpen(GtkWidget* widget, AppData *data) /* update filenames */ basename = g_path_get_basename(selected); - gtk_entry_set_text(GTK_ENTRY(data->mainViewData.fileNameEntry), selected); + gtk_label_set_text(GTK_LABEL(data->mainViewData.fileNameEntry), basename); g_free(basename); g_free(data->openFileName); @@ -846,7 +877,7 @@ openURI(gpointer user_data) /* update filenames */ basename = g_path_get_basename(selected); - gtk_entry_set_text(GTK_ENTRY(data->mainViewData.fileNameEntry), selected); + gtk_label_set_text(GTK_LABEL(data->mainViewData.fileNameEntry), basename); g_free(basename); g_free(data->openFileName); @@ -962,6 +993,9 @@ closeFile(AppData *data) return FALSE; case GTK_RESPONSE_NO: + if (data->saveFileName) + g_unlink(data->saveFileName); + data->saved = TRUE; return TRUE; case GTK_RESPONSE_YES: @@ -979,7 +1013,7 @@ static const gchar * getFileName(AppData *data) { g_assert(data); - return gtk_entry_get_text(GTK_ENTRY(data->mainViewData.fileNameEntry)); + return gtk_label_get_text(GTK_LABEL(data->mainViewData.fileNameEntry)); } @@ -1083,8 +1117,8 @@ static void cbSaveAs(GtkWidget* widget, AppData *data) data->openFileName = g_strdup(data->saveFileName); } - gtk_entry_set_text(GTK_ENTRY(data->mainViewData.fileNameEntry), - data->saveFileName); + gtk_label_set_text(GTK_LABEL(data->mainViewData.fileNameEntry), + basename); g_free(basename); data->saved = TRUE; @@ -1100,17 +1134,41 @@ static void cbSaveAs(GtkWidget* widget, AppData *data) ULOG_DEBUG("%s() - end", G_STRFUNC); } -static void cbRec(GtkWidget* widget, AppData *data) +static void cbRec(GtkWidget* widget, GdkEventButton *event, AppData *data) { g_assert(NULL != data); ULOG_DEBUG("%s() - begin", G_STRFUNC); + if (APPSTATE_RECORDING == getAppState(data)) + { + if (GST_IS_ELEMENT(data->recPipeline)) + { + gst_element_set_state(GST_ELEMENT(data->recPipeline), GST_STATE_PAUSED); + gtk_label_set_text(GTK_LABEL(data->mainViewData.stateEntry), + RECORDER_MSG_PAUSED); + hildon_banner_show_information(GTK_WIDGET(data->mainView), NULL, RECORDER_MSG_PAUSED); + setAppState(data, APPSTATE_PAUSED); + } + return; + } + + if (APPSTATE_PAUSED == getAppState(data)) + { + if (GST_IS_ELEMENT(data->recPipeline)) + { + gst_element_set_state(GST_ELEMENT(data->recPipeline), + GST_STATE_PLAYING); + setAppState(data, APPSTATE_RECORDING); + return; + } + } + if (APPSTATE_READY != getAppState(data)) { ULOG_WARN("%s() - state different than READY -> return", G_STRFUNC); if (APPSTATE_RECORDING == getAppState(data)) - cbStop(widget,data); + cbStop(widget, NULL,data); return; } @@ -1153,19 +1211,25 @@ static void cbRec(GtkWidget* widget, AppData *data) break; } + g_mkdir(get_default_dir(), 755); + ULOG_INFO("%s() - creating pipelines", G_STRFUNC); /* start recording */ /* create related pipelines */ if (createPipeline(data, PIPELINE_REC)) { ULOG_INFO("%s() - starting recording", G_STRFUNC); + gchar *basename; /* start recording */ + data->rectime = 0; gst_element_set_state(GST_ELEMENT(data->recPipeline), GST_STATE_PLAYING); /* update display */ - gtk_entry_set_text(GTK_ENTRY(data->mainViewData.fileNameEntry), - data->saveFileName); + basename = g_path_get_basename(data->saveFileName); + gtk_label_set_text(GTK_LABEL(data->mainViewData.fileNameEntry), + basename); + g_free(basename); setAppState(data, APPSTATE_RECORDING); gtk_widget_set_sensitive(data->buttonSaveAs, TRUE); @@ -1184,7 +1248,7 @@ static void cbRec(GtkWidget* widget, AppData *data) ULOG_DEBUG("%s() - end", G_STRFUNC); } -static void cbPlay(GtkWidget* widget, AppData *data) +static void cbPlay(GtkWidget* widget, GdkEventButton *event, AppData *data) { const gchar * file = NULL; @@ -1199,19 +1263,22 @@ static void cbPlay(GtkWidget* widget, AppData *data) return; } - openPlayPipeline(data); - if (APPSTATE_PLAYING == getAppState(data)) { if (GST_IS_ELEMENT(data->playPipeline)) { gst_element_set_state(GST_ELEMENT(data->playPipeline), GST_STATE_PAUSED); - setAppState(data, APPSTATE_READY); + setAppState(data, APPSTATE_PAUSED); } return; } - if (APPSTATE_READY != getAppState(data)) + if (APPSTATE_PAUSED != getAppState(data)) { + openPlayPipeline(data); + setAppState(data, APPSTATE_READY); + } + + if (APPSTATE_READY != getAppState(data) && APPSTATE_PAUSED != getAppState(data)) { ULOG_WARN("%s() - state different than PLAYING or READY -> return", G_STRFUNC); return; @@ -1232,10 +1299,12 @@ static void cbPlay(GtkWidget* widget, AppData *data) g_timeout_add(PLAY_UPDATE_INTERVAL, (GSourceFunc)cbCheckPosition, data); + gtk_widget_set_sensitive(data->buttonRec, FALSE); + ULOG_DEBUG("%s() - end", G_STRFUNC); } -static void cbStop(GtkWidget* widget, AppData *data) +static void cbStop(GtkWidget* widget, GdkEventButton *event, AppData *data) { g_assert(NULL != data); @@ -1248,6 +1317,7 @@ static void cbStop(GtkWidget* widget, AppData *data) gtk_widget_set_state(data->buttonPlay, GTK_STATE_NORMAL); gtk_widget_set_state(data->buttonRec, GTK_STATE_NORMAL); gtk_widget_set_sensitive(data->buttonPlay, TRUE); + gtk_widget_set_sensitive(data->buttonRec, TRUE); /* destroy related pipeline */ switch(getAppState(data)) @@ -1259,6 +1329,7 @@ static void cbStop(GtkWidget* widget, AppData *data) gst_element_set_state(GST_ELEMENT(data->playPipeline), GST_STATE_PAUSED); /* flow through */ + case APPSTATE_PAUSED: case APPSTATE_READY: /* seek to zero, but not for PCM pipeline */ /* if (data->playPipelineType == PIPELINE_PLAY || seekToZero(data, GST_ELEMENT(data->playPipeline))) */ @@ -1267,8 +1338,9 @@ static void cbStop(GtkWidget* widget, AppData *data) gtk_adjustment_set_value( GTK_ADJUSTMENT(data->mainViewData.adjustment), 0); gtk_adjustment_value_changed(GTK_ADJUSTMENT(data->mainViewData.adjustment)); - gtk_entry_set_text(GTK_ENTRY(data->mainViewData.stateEntry), - RECORDER_MSG_STOPPED); + gtk_label_set_text(GTK_LABEL(data->mainViewData.ctime), "00:00"); + gtk_label_set_text(GTK_LABEL(data->mainViewData.stateEntry), + ""); } break; @@ -1302,83 +1374,6 @@ static void cbStop(GtkWidget* widget, AppData *data) /* ui construction functions */ -static GtkWidget* createToolBar(AppData *data) -{ - GtkToolbar* toolBar = NULL; - - GtkToolItem* new = NULL; - GtkToolItem* open = NULL; - GtkToolItem* save = NULL; - GtkToolItem* saveas = NULL; - GtkToolItem* sep = NULL; - GtkToolItem* play = NULL; - GtkToolItem* rec = NULL; - GtkToolItem* stop = NULL; - - /* create buttons */ - new = gtk_tool_button_new_from_stock(GTK_STOCK_NEW); - open = gtk_tool_button_new_from_stock(GTK_STOCK_OPEN); - save = gtk_tool_button_new_from_stock(GTK_STOCK_SAVE); - data->buttonSave = GTK_WIDGET(save); - saveas = gtk_tool_button_new_from_stock(GTK_STOCK_SAVE_AS); - data->buttonSaveAs = GTK_WIDGET(saveas); - gtk_widget_set_sensitive(data->buttonSave, FALSE); - gtk_widget_set_sensitive(data->buttonSaveAs, FALSE); - data->saved = TRUE; - - gtk_tool_item_set_expand( GTK_TOOL_ITEM(new), TRUE ); - gtk_tool_item_set_expand( GTK_TOOL_ITEM(open), TRUE ); - gtk_tool_item_set_expand( GTK_TOOL_ITEM(saveas), TRUE ); - - rec = gtk_tool_button_new_from_stock(GTK_STOCK_MEDIA_RECORD); - data->buttonRec = GTK_WIDGET(rec); - play = gtk_tool_button_new_from_stock(GTK_STOCK_MEDIA_PLAY); - data->buttonPlay = GTK_WIDGET(play); - stop = gtk_tool_button_new_from_stock(GTK_STOCK_MEDIA_STOP); - - gtk_tool_item_set_expand( GTK_TOOL_ITEM(rec), TRUE ); - gtk_tool_item_set_expand( GTK_TOOL_ITEM(play), TRUE ); - gtk_tool_item_set_expand( GTK_TOOL_ITEM(stop), TRUE ); - - /* create separator */ - sep = gtk_separator_tool_item_new(); - - /* create the toolbar itself */ - toolBar = GTK_TOOLBAR(gtk_toolbar_new()); - - /* add items to toolbar */ - gtk_toolbar_insert(toolBar, new, -1); - gtk_toolbar_insert(toolBar, open, -1); - gtk_toolbar_insert(toolBar, saveas, -1); - gtk_toolbar_insert(toolBar, sep, -1); - gtk_toolbar_insert(toolBar, rec, -1); - gtk_toolbar_insert(toolBar, play, -1); - gtk_toolbar_insert(toolBar, stop, -1); - - /* connect signals */ - g_signal_connect(G_OBJECT(new), "clicked", - G_CALLBACK(cbNew), - data); - g_signal_connect(G_OBJECT(open), "clicked", - G_CALLBACK(cbOpen), - data); - g_signal_connect(G_OBJECT(saveas), "clicked", - G_CALLBACK(cbSaveAs), - data); - g_signal_connect(G_OBJECT(rec), "clicked", - G_CALLBACK(cbRec), - data); - g_signal_connect(G_OBJECT(play), "clicked", - G_CALLBACK(cbPlay), - data); - g_signal_connect(G_OBJECT(stop), "clicked", - G_CALLBACK(cbStop), - data); - - return GTK_WIDGET(toolBar); - -} - static void cbItemGroupChanged( gpointer data ) { AppData* app = (AppData* ) data; @@ -1421,16 +1416,36 @@ static void cbItemClose(GtkWidget *widget, gpointer data) static void createMenu( AppData *data ) { HildonAppMenu *menu; + GtkWidget *button_new; + GtkWidget *button_open; + GtkWidget *button_save; GtkWidget *button_email; menu = HILDON_APP_MENU( hildon_app_menu_new() ); + button_new = hildon_gtk_button_new(HILDON_SIZE_AUTO); + gtk_button_set_label( GTK_BUTTON(button_new), "New"); + button_open = hildon_gtk_button_new(HILDON_SIZE_AUTO); + gtk_button_set_label( GTK_BUTTON(button_open), "Open"); + button_save = hildon_gtk_button_new(HILDON_SIZE_AUTO); + gtk_button_set_label( GTK_BUTTON(button_save), "Save"); button_email = hildon_gtk_button_new(HILDON_SIZE_AUTO); gtk_button_set_label( GTK_BUTTON(button_email), "Send via email"); + + hildon_app_menu_append( menu, GTK_BUTTON(button_new)); + hildon_app_menu_append( menu, GTK_BUTTON(button_open)); + hildon_app_menu_append( menu, GTK_BUTTON(button_save)); hildon_app_menu_append( menu, GTK_BUTTON(button_email)); - + g_signal_connect(G_OBJECT(button_new), "clicked", + G_CALLBACK(cbNew), + data); + g_signal_connect(G_OBJECT(button_open), "clicked", + G_CALLBACK(cbOpen), + data); + g_signal_connect(G_OBJECT(button_save), "clicked", + G_CALLBACK(cbSaveAs), + data); g_signal_connect( G_OBJECT( button_email ), "clicked", GTK_SIGNAL_FUNC (cbEmailing), data); - gtk_widget_show_all( GTK_WIDGET(menu)); @@ -1438,6 +1453,22 @@ static void createMenu( AppData *data ) data->filter = get_default_filter(); + setFormatString(data, data->filter); + +} + +gboolean +cbScaleRelease(GtkWidget *widget, GdkEventButton *ev, gpointer data) +{ + AppData* app = (AppData* ) data; + + if (getAppState(app) == APPSTATE_RECORDING || NULL == app->playPipeline) + return FALSE; + + seekToTime(app->playPipeline, gtk_adjustment_get_value(app->mainViewData.adjustment)); + + return FALSE; + } gboolean @@ -1447,13 +1478,13 @@ evKeypress(GtkWidget *widget, GdkEventKey *ev, AppData *appdata) switch (ev->keyval) { case GDK_Return: - cbRec(widget, appdata); + cbRec(widget, NULL, appdata); return TRUE; case GDK_Right: - cbPlay(widget, appdata); + cbPlay(widget, NULL, appdata); return TRUE; case GDK_Escape: - cbStop(widget, appdata); + cbStop(widget, NULL, appdata); return TRUE; default: break; @@ -1468,17 +1499,25 @@ gboolean maemo_recorder_ui_new(AppData *data) HildonProgram *app = NULL; HildonWindow *window = NULL; GtkWidget *hbox = NULL; - GtkWidget *vbox = NULL; GtkWidget *label = NULL; - GtkWidget *entry1 = NULL; - GtkWidget *entry2 = NULL; - GtkWidget *entry3 = NULL; + GtkWidget *ctime = NULL; + GtkWidget *etime = NULL; + GtkWidget *filename = NULL; + GtkWidget *format = NULL; + GtkWidget *state = NULL; GtkWidget *toolBar = NULL; GtkWidget *infohbox = NULL; GtkWidget *table = NULL; GtkWidget *scale = NULL; GtkObject *adjustment = NULL; + GtkWidget *rec = NULL; + GtkWidget *play = NULL; + GtkWidget *stop = NULL; + GtkWidget *recimage = NULL; + GtkWidget *playimage = NULL; + GtkWidget *stopimage = NULL; + g_assert(NULL != data); app = HILDON_PROGRAM(hildon_program_get_instance()); @@ -1491,78 +1530,21 @@ gboolean maemo_recorder_ui_new(AppData *data) /* content for main view */ - /* create vbox, divides control area and view area */ - vbox = gtk_vbox_new(FALSE, 0); - /* create hbox to divide control area */ hbox = gtk_hbox_new(FALSE, HILDON_MARGIN_DEFAULT); /* create toolbar */ - toolBar = createToolBar(data); /* create table for labels */ - table = gtk_table_new (4, 2, FALSE); - gtk_table_set_homogeneous(GTK_TABLE(table), FALSE); + table = gtk_table_new (6, 6, TRUE); + gtk_table_set_homogeneous(GTK_TABLE(table), TRUE); gtk_table_set_row_spacings (GTK_TABLE (table), 4); gtk_table_set_col_spacings (GTK_TABLE (table), HILDON_MARGIN_TRIPLE); - label = gtk_label_new_with_mnemonic(_("Filename:")); - gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); - gtk_table_attach_defaults (GTK_TABLE (table), - label, - 0, 1, 0, 1); - - entry1 = gtk_entry_new(); - gtk_entry_set_has_frame(GTK_ENTRY(entry1), FALSE); - gtk_entry_set_text(GTK_ENTRY (entry1), _(RECORDER_FILE_UNTITLED)); - gtk_entry_set_editable(GTK_ENTRY(entry1), FALSE); - gtk_table_attach_defaults(GTK_TABLE (table), entry1, 1, 2, 0, 1); - gtk_label_set_mnemonic_widget(GTK_LABEL (label), entry1); - - label = gtk_label_new_with_mnemonic (_("Length:")); - gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); - gtk_table_attach_defaults (GTK_TABLE (table), - label, - 0, 1, 1, 2); - - entry2 = gtk_entry_new (); - gtk_entry_set_has_frame(GTK_ENTRY(entry2), FALSE); - gtk_entry_set_text (GTK_ENTRY (entry2), "0:00.00"); - gtk_entry_set_editable(GTK_ENTRY(entry2), FALSE); - gtk_table_attach_defaults (GTK_TABLE (table), entry2, 1, 2, 1, 2); - gtk_label_set_mnemonic_widget (GTK_LABEL (label), entry2); - - /* audio format field */ - label = gtk_label_new_with_mnemonic(_("Format:")); - gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); - gtk_table_attach_defaults (GTK_TABLE (table), - label, - 0, 1, 2, 3); - - entry3 = gtk_entry_new(); - gtk_entry_set_has_frame(GTK_ENTRY(entry3), FALSE); - gtk_entry_set_width_chars(GTK_ENTRY(entry3), 40); - gtk_entry_set_text (GTK_ENTRY (entry3), RECORDER_FMT_STRING_NONE); - gtk_entry_set_editable(GTK_ENTRY(entry3), FALSE); - data->mainViewData.formatEntry = GTK_WIDGET(entry3); - - gtk_table_attach_defaults (GTK_TABLE (table), entry3, 1, 2, 2, 3); - gtk_label_set_mnemonic_widget (GTK_LABEL (label), entry3); - - label = gtk_label_new_with_mnemonic(_("State:")); - gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5); - gtk_table_attach_defaults (GTK_TABLE (table), - label, - 0, 1, 3, 4); - - entry3 = gtk_entry_new (); - gtk_entry_set_has_frame(GTK_ENTRY(entry3), FALSE); - gtk_entry_set_text (GTK_ENTRY (entry3), RECORDER_MSG_READY); - gtk_entry_set_editable(GTK_ENTRY(entry3), FALSE); - gtk_table_attach_defaults (GTK_TABLE (table), entry3, 1, 2, 3, 4); - gtk_label_set_mnemonic_widget(GTK_LABEL (label), entry3); - + filename = gtk_label_new(_(RECORDER_FILE_UNTITLED)); + format = gtk_label_new(RECORDER_FMT_STRING_NONE); + state = gtk_label_new(""); adjustment = gtk_adjustment_new (0.00, 0.00, 100.00, @@ -1570,36 +1552,73 @@ gboolean maemo_recorder_ui_new(AppData *data) 0.01, 0); + ctime = gtk_label_new("00:00"); + etime = gtk_label_new("00:00"); scale = gtk_hscale_new(GTK_ADJUSTMENT(adjustment)); + gtk_scale_set_draw_value(scale, FALSE); + gtk_box_pack_start(hbox, ctime, FALSE, FALSE, HILDON_MARGIN_DOUBLE); + gtk_box_pack_end(hbox, etime, FALSE, FALSE, HILDON_MARGIN_DOUBLE); + gtk_box_pack_end(hbox, scale, TRUE, TRUE, HILDON_MARGIN_DOUBLE); + gtk_box_set_homogeneous(hbox, FALSE); -/* gtk_table_attach_defaults (GTK_TABLE (table), - label, - 0, 3, 2, 3); -*/ + gtk_table_attach_defaults(table, filename, + 1, 4, 1, 2); + gtk_table_attach_defaults(table, format, + 1, 4, 2, 3); + gtk_table_attach_defaults(table, state, + 1, 4, 3, 4); + gtk_table_attach_defaults(table, hbox, + 0, 5, 5, 6); + + + recimage = gtk_image_new_from_file(REC_ICON); + rec = gtk_event_box_new(); + data->buttonRec = GTK_WIDGET(rec); + gtk_container_add(rec, recimage); + playimage = gtk_image_new_from_file(PLAY_ICON); + play = gtk_event_box_new(); + data->buttonPlay = GTK_WIDGET(play); + gtk_container_add(play, playimage); + stopimage = gtk_image_new_from_file(STOP_ICON); + stop = gtk_event_box_new(); + gtk_container_add(stop, stopimage); + + gtk_table_attach_defaults(table, rec, + 5, 6, 4, 6); + gtk_table_attach_defaults(table, play, + 5, 6, 2, 4); + gtk_table_attach_defaults(table, stop, + 5, 6, 0, 2); + + /* connect signals */ - g_signal_connect(G_OBJECT(adjustment), "value-changed", G_CALLBACK(cbUserSeek), data); - g_signal_connect(G_OBJECT(scale), "format-value", G_CALLBACK(cbFormatSeekbarValue), data); + g_signal_connect(G_OBJECT(scale), "button-release-event", G_CALLBACK(cbScaleRelease), data); g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(cbDestroy), data); g_signal_connect(G_OBJECT(window), "key-press-event", G_CALLBACK(evKeypress), data); + g_signal_connect(G_OBJECT(rec), "button-release-event", + G_CALLBACK(cbRec), + data); + g_signal_connect(G_OBJECT(play), "button-release-event", + G_CALLBACK(cbPlay), + data); + g_signal_connect(G_OBJECT(stop), "button-release-event", + G_CALLBACK(cbStop), + data); + + /* packing the view */ - gtk_container_add (GTK_CONTAINER(window), vbox); - infohbox = gtk_hbox_new(FALSE, 0); - gtk_box_pack_start (GTK_BOX(infohbox), table, FALSE, TRUE, 0); - gtk_box_pack_start (GTK_BOX(vbox), infohbox, FALSE, TRUE, 0); - gtk_box_pack_start (GTK_BOX(vbox), scale, FALSE, FALSE, 0); -/* gtk_box_pack_start (GTK_BOX(vbox), hbox, TRUE, TRUE, 0); */ + gtk_container_add(GTK_CONTAINER(window), table); - hildon_window_add_toolbar(window, GTK_TOOLBAR(toolBar)); - /* store needed widgets */ data->app = app; data->mainView = window; - data->mainViewData.toolBar = GTK_WIDGET(toolBar); - data->mainViewData.fileNameEntry = GTK_WIDGET(entry1); - data->mainViewData.lengthEntry = GTK_WIDGET(entry2); - data->mainViewData.stateEntry = GTK_WIDGET(entry3); + data->mainViewData.fileNameEntry = GTK_WIDGET(filename); + data->mainViewData.formatEntry = GTK_WIDGET(format); + data->mainViewData.lengthEntry = GTK_WIDGET(etime); + data->mainViewData.ctime = GTK_WIDGET(ctime); + data->mainViewData.stateEntry = GTK_WIDGET(state); data->mainViewData.adjustment = GTK_OBJECT(adjustment); /* show the app */ @@ -1684,7 +1703,7 @@ setFormatString(AppData *data, AudioFormat afmt) gint bits = 8; g_assert(data); - g_assert(GTK_IS_ENTRY(data->mainViewData.formatEntry)); + g_assert(GTK_IS_LABEL(data->mainViewData.formatEntry)); switch (afmt) { @@ -1709,12 +1728,12 @@ setFormatString(AppData *data, AudioFormat afmt) bits = PCM_WIDTH; break; default: - gtk_entry_set_text(GTK_ENTRY(data->mainViewData.formatEntry), RECORDER_FMT_STRING_NONE); + gtk_label_set_text(GTK_LABEL(data->mainViewData.formatEntry), RECORDER_FMT_STRING_NONE); return; } - str = g_strdup_printf("%s, %d %s, %d Hz, %d %s", format, channels, _("ch"), rate, bits, _("bits")); - gtk_entry_set_text(GTK_ENTRY(data->mainViewData.formatEntry), str); + str = g_strdup_printf("%s, %d %s, %d kHz, %d %s", format, channels, _("ch"), rate/1000, bits, _("bits")); + gtk_label_set_text(GTK_LABEL(data->mainViewData.formatEntry), str); g_free(str); } @@ -1740,12 +1759,12 @@ static void setLength(AppData *data, gdouble secs) secs -= mins * 60.0; } - tmp = g_strdup_printf("%u:%05.2f", mins, secs); + tmp = g_strdup_printf("%02u:%02d", mins, (int)secs); /* ULOG_INFO("Setting length to %s", tmp); */ - gtk_entry_set_text(GTK_ENTRY(data->mainViewData.lengthEntry), + gtk_label_set_text(GTK_LABEL(data->mainViewData.lengthEntry), tmp); g_free(tmp); } @@ -1846,13 +1865,12 @@ static gboolean cbStopPlayback(AppData *data) static void cbUserSeek(GtkAdjustment *adjustment, gpointer data) { - /*ULOG_INFO("cbUserSeek");*/ AppData *app; g_return_if_fail(data != NULL); app = (AppData *) data; - if (getAppState(app) != APPSTATE_READY || NULL == app->playPipeline) + if (getAppState(app) != APPSTATE_READY && getAppState(app) != APPSTATE_PAUSED || NULL == app->playPipeline) return; seekToTime(app->playPipeline, gtk_adjustment_get_value(adjustment)); @@ -1881,22 +1899,13 @@ static gboolean cbUpdateRecLength(AppData *data) gdouble secs; gchar *tmp; - if (gettimeofday(&tv, NULL) != 0) - return FALSE; + data->rectime += REC_UPDATE_INTERVAL/1000.0; - secs = tv.tv_sec - data->recStartTv.tv_sec; - secs += ((tv.tv_usec - data->recStartTv.tv_usec) / 1000000.0); - - if (secs >= 60.0) - { - mins = secs / 60; - secs -= mins * 60.0; - tmp = g_strdup_printf("%u:%05.2f", mins, secs); - } - else - tmp = g_strdup_printf("%0.2f", secs); + mins = data->rectime / 60; + secs = data->rectime - (mins * 60.0); + tmp = g_strdup_printf("%02u:%02d", mins, (int)secs); - gtk_entry_set_text(GTK_ENTRY(data->mainViewData.lengthEntry), + gtk_label_set_text(GTK_LABEL(data->mainViewData.lengthEntry), tmp); g_free(tmp); diff --git a/src/maemo-recorder.h b/src/maemo-recorder.h index 55e4e37..4a3f66d 100644 --- a/src/maemo-recorder.h +++ b/src/maemo-recorder.h @@ -66,7 +66,8 @@ typedef enum { APPSTATE_READY = 1, APPSTATE_PLAYING, - APPSTATE_RECORDING + APPSTATE_RECORDING, + APPSTATE_PAUSED } AppState; typedef enum @@ -89,6 +90,10 @@ typedef enum #define FORMAT_NAME_PCM "PCM raw" #define FORMAT_NAME_ILBC "iLBC" +#define PLAY_ICON "/usr/share/pixmaps/recorder/play.png" +#define REC_ICON "/usr/share/pixmaps/recorder/record.png" +#define STOP_ICON "/usr/share/pixmaps/recorder/stop.png" + /* TODO: this kind of struct might be more handy when passing around audioformat info */ #if 0 struct _AudioFormatSpec @@ -121,7 +126,7 @@ typedef struct _mainViewStr GtkWidget *stateEntry; GtkWidget *formatEntry; GtkObject *adjustment; - + GtkWidget *ctime; } mainViewStr; typedef struct _AppDataStr @@ -159,10 +164,9 @@ typedef struct _AppDataStr GtkWidget *buttonPlay; GtkWidget *buttonRec; - struct timeval recStartTv; /* timeval when recording started */ guint recUpdateId; /* g_source_id for rec update timeout func */ gchar *mimeURI; /* uri to open via mime cb */ - + gdouble rectime; } AppData; void setAppState(AppData *app, AppState state); diff --git a/src/settings.c b/src/settings.c index 4afcc73..2147f2b 100755 --- a/src/settings.c +++ b/src/settings.c @@ -68,7 +68,7 @@ reset_defaults() { gchar *str; - str = g_strdup_printf("/home/user/MyDocs/.sounds"); + str = g_strdup_printf("/home/user/MyDocs/.recorder"); gconf_client_set_string(settings_priv->gconf, KEY_DEFAULT_DIR, str, NULL); g_free(settings_priv->default_dir); settings_priv->default_dir = str;