simpler ui
authorMarko Nykanen <marko.nykanen@gmail.com>
Sun, 22 Nov 2009 06:06:51 +0000 (08:06 +0200)
committerMarko Nykanen <marko.nykanen@gmail.com>
Sun, 22 Nov 2009 06:06:51 +0000 (08:06 +0200)
14 files changed:
data/Makefile.am
data/maemo_recorder.desktop
data/maemo_recorder.png [deleted file]
data/pause.png [new file with mode: 0644]
data/play.png [new file with mode: 0644]
data/record.png [new file with mode: 0644]
data/recorder.png [new file with mode: 0644]
data/stop.png [new file with mode: 0644]
debian/changelog
debian/recorder.postinst
src/maemo-recorder-file.h
src/maemo-recorder-ui.c
src/maemo-recorder.h
src/settings.c

index a972a88..9c8912e 100644 (file)
@@ -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                 \
index f81d244..c768a2d 100644 (file)
@@ -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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
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 (file)
index 0000000..e90cba8
Binary files /dev/null and b/data/stop.png differ
index b75ba10..fb1ca50 100644 (file)
@@ -1,3 +1,11 @@
+recorder (0.3.2) unstable; urgency=low
+
+  * simpler ui
+  * pause
+  * tmpdir for recordings
+
+ -- Marko Nykanen <marko.ja.nykanen@nokia.com>  Sat, 21 Nov 2009 22:17:30 +0200
+
 recorder (0.3.1) unstable; urgency=low
 
   * Name changed to Recorder
index 74f2f1b..bc9840b 100644 (file)
@@ -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)
index 07da5b8..7544796 100644 (file)
@@ -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"
 
 /*
index 7e7381a..b0e4b75 100644 (file)
@@ -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);
 
index 55e4e37..4a3f66d 100644 (file)
@@ -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);
index 4afcc73..2147f2b 100755 (executable)
@@ -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;