#include <hildon/hildon-file-chooser-dialog.h>
#include <string.h>
#include <sys/time.h>
-#include <hildon/hildon-help.h>
-#include <ossoemailinterface.h>
-
+#include <libmodest-dbus-client/libmodest-dbus-client.h>
#include "maemo-recorder.h"
#include "maemo-recorder-ui.h"
#include "maemo-recorder-file.h"
static gdouble guessMediaLength(AppData *data);
static GstCaps *createCapsFilter(AudioFormat format);
-static void new_pad_cb (GstElement *wavparse, GstPad *new_pad, gpointer data)
-{
- GstElement *sink;
- AppData* app = (AppData*) data;
-
- ULOG_INFO("new pad");
-
- sink = gst_element_factory_make ("dsppcmsink", "sink");
-
- gst_bin_add (GST_BIN (app->playPipeline), sink);
-
- if (!gst_element_link (wavparse, sink))
- g_error ("link(wavparse, sink) failed!");
- gst_element_sync_state_with_parent(sink);
-
-}
+static gboolean lengthSet = FALSE;
static gboolean createPipeline(AppData *app, PipeLineType type)
{
GstElement *queue = NULL;
GstElement *pipeline = NULL;
GstElement *parse = NULL;
+ GstElement *bin = NULL;
GstCaps *caps = NULL;
g_assert(NULL != app);
- pipeline = gst_pipeline_new("pipeline");
-
- gst_bus_add_watch(gst_pipeline_get_bus (GST_PIPELINE (pipeline)),
- cbBus, app);
-
/* create elements */
switch (type)
{
case PIPELINE_PLAY_MP3:
ULOG_INFO("mp3 playback - queue");
- src = gst_element_factory_make ("gnomevfssrc", "source");
- queue = gst_element_factory_make ("queue", "queue");
- sink = gst_element_factory_make ("dspmp3sink", "sink");
+ bin = gst_element_factory_make ("playbin2", "bin");
+ gchar* uri = g_strdup_printf("file://%s", app->openFileName);
+ g_object_set(G_OBJECT(bin),
+ "uri", uri,
+ NULL);
+ g_free(uri);
+ gst_bus_add_watch(gst_pipeline_get_bus (GST_PIPELINE (bin)),
+ cbBus, app);
- g_object_set(G_OBJECT (queue),
- "min-threshold-bytes", 131072,
- NULL );
- g_object_set(G_OBJECT(src),
- "location", app->openFileName,
- "blocksize", 65536,
- NULL);
+ app->playPipeline = bin;
+ app->playPipelineType = type;
+
+ return TRUE;
break;
case PIPELINE_PLAY:
case FORMAT_PCMU:
case FORMAT_PCM:
ULOG_INFO("using pcm sink");
- sink = gst_element_factory_make ("dsppcmsink", "sink");
+ sink = gst_element_factory_make ("pulsesink", "sink");
break;
case FORMAT_WAV:
ULOG_INFO("using wavparse & pcm sink");
- parse = gst_element_factory_make ("wavparse", "parse");
+ bin = gst_element_factory_make ("playbin2", "bin");
+ gchar* uri = g_strdup_printf("file://%s", app->openFileName);
+ g_object_set(G_OBJECT(bin),
+ "uri", uri,
+ NULL);
+ g_free(uri);
+
+ gst_bus_add_watch(gst_pipeline_get_bus (GST_PIPELINE (bin)),
+ cbBus, app);
+
+ app->playPipeline = bin;
+ app->playPipelineType = type;
+
+ return TRUE;
break;
default:
case FORMAT_PCMU:
case FORMAT_PCM:
ULOG_INFO("using pcm source");
- src = gst_element_factory_make("dsppcmsrc", "source");
+ src = gst_element_factory_make("pulsesrc", "source");
/*g_object_set(G_OBJECT (src),
"blocksize", DEFAULT_REC_BLOCKSIZE,
"dtx", DTX_OFF,
case FORMAT_WAV:
ULOG_INFO("using pcm source & wavenc");
- src = gst_element_factory_make("dsppcmsrc", "source");
- g_object_set(G_OBJECT (src),
- "blocksize", DEFAULT_REC_BLOCKSIZE,
- "dtx", DTX_OFF,
- NULL);
+ src = gst_element_factory_make("pulsesrc", "source");
parse = gst_element_factory_make("wavenc", "enc");
break;
default:
ULOG_ERR("Invalid pipeline type!");
- gst_object_unref(pipeline);
return FALSE;
}
+ pipeline = gst_pipeline_new("pipeline");
+
+ gst_bus_add_watch(gst_pipeline_get_bus (GST_PIPELINE (pipeline)),
+ cbBus, app);
+
if (!src || !pipeline)
{
ULOG_ERR("Could not create GstElement!");
return FALSE;
}
- if (!sink && app->filter != FORMAT_WAV)
+ if (!sink && app->filter != FORMAT_WAV )
{
ULOG_ERR("Could not create GstElement!");
return FALSE;
ULOG_ERR("gst_element_link failed for src, parse and sink!");
}
break;
-
+
default:
break;
break;
- case FORMAT_WAV:
- gst_bin_add_many(GST_BIN(pipeline), src, parse, NULL);
- if (!gst_element_link_many (src, parse, NULL))
- {
- ULOG_ERR("gst_element_link failed for src, parse and sink!");
- return FALSE;
- }
- app->playPipeline = pipeline;
- g_signal_connect(parse, "pad_added",
- G_CALLBACK(new_pad_cb), app);
- break;
-
default:
break;
}
break;
- case PIPELINE_PLAY_MP3:
default:
- gst_bin_add_many(GST_BIN(pipeline), src, queue, sink, NULL);
+ gst_bin_add_many(GST_BIN(pipeline), src, sink, NULL);
- if(!gst_element_link_many(src, queue, sink, NULL))
+ if(!gst_element_link_many(src, sink, NULL))
{
ULOG_ERR("gst_element_link failed for src and sink!");
return FALSE;
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);
+
switch (type)
{
case PIPELINE_REC:
hildon_banner_show_information(GTK_WIDGET(data->mainView), NULL, RECORDER_MSG_PAUSED);
gtk_entry_set_text(GTK_ENTRY(data->mainViewData.stateEntry),
RECORDER_MSG_PAUSED);
- /*
- gtk_tool_button_set_stock_id(GTK_TOOL_BUTTON(data->buttonPlay), GTK_STOCK_MEDIA_PLAY);
- gtk_widget_set_state(data->buttonPlay, GTK_STATE_NORMAL);
- */
- }
- else
- {
- hildon_banner_show_information(GTK_WIDGET(data->mainView), NULL, RECORDER_MSG_STOPPED);
- gtk_entry_set_text(GTK_ENTRY(data->mainViewData.stateEntry),
- RECORDER_MSG_STOPPED);
- gtk_widget_set_state(data->buttonPlay, GTK_STATE_NORMAL);
- gtk_tool_button_set_stock_id(GTK_TOOL_BUTTON(data->buttonPlay), GTK_STOCK_MEDIA_PLAY);
}
gtk_widget_set_state(data->buttonRec, GTK_STATE_NORMAL);
}
case GST_STATE_NULL:
ULOG_INFO("%s() - Null", 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_READY);
gtk_widget_set_state(data->buttonPlay, GTK_STATE_NORMAL);
gtk_tool_button_set_stock_id(GTK_TOOL_BUTTON(data->buttonPlay), GTK_STOCK_MEDIA_PLAY);
gtk_widget_set_state(data->buttonRec, GTK_STATE_NORMAL);
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);
+
break;
case APPSTATE_RECORDING:
{
GstFormat fmt = GST_FORMAT_TIME;
gint64 pos = 0, len = 0;
- static gboolean lengthSet = FALSE;
g_assert(NULL != data);
gtk_widget_set_sensitive(data->buttonSaveAs, FALSE);
data->saved = TRUE;
- gtk_window_set_title(GTK_WINDOW(data->mainView), RECORDER_FILE_UNTITLED);
-
ULOG_DEBUG_F("cbNew end");
}
basename = g_path_get_basename(selected);
gtk_entry_set_text(GTK_ENTRY(data->mainViewData.fileNameEntry), selected);
- gtk_window_set_title(GTK_WINDOW(data->mainView), basename);
g_free(basename);
g_free(data->openFileName);
data->openFileName = tmpfile;
data->file_format = format;
- data->filter = format;
+ //data->filter = format;
g_free(data->saveFileName);
data->saveFileName = NULL;
gtk_widget_set_sensitive(data->buttonSaveAs, TRUE);
basename = g_path_get_basename(selected);
gtk_entry_set_text(GTK_ENTRY(data->mainViewData.fileNameEntry), selected);
- gtk_window_set_title(GTK_WINDOW(data->mainView), basename);
g_free(basename);
g_free(data->openFileName);
data->openFileName = tmpfile;
data->file_format = format;
- data->filter = format;
+ //data->filter = format;
g_free(data->saveFileName);
data->saveFileName = NULL;
gtk_widget_set_sensitive(data->buttonSaveAs, TRUE);
GstFormat fmt = GST_FORMAT_TIME;
gint64 len;
gdouble size = 0;
+ lengthSet = FALSE;
/* create pipelines */
/* check file type */
switch (data->file_format)
case FORMAT_ILBC:
case FORMAT_WAV:
destroyPipelines(data);
- data->filter = data->file_format;
+ //data->filter = data->file_format;
createPipeline(data, PIPELINE_PLAY);
break;
case FORMAT_MP3:
destroyPipelines(data);
- data->filter = data->file_format;
+ //data->filter = data->file_format;
createPipeline(data, PIPELINE_PLAY_MP3);
break;
setLength(data, size);
}
}
- /*
else
{
- ULOG_INFO("playSize else");
setLength(data, 0.0);
}
- */
+
}
/* returns whether the action can proceed or should be aborted */
}
-#if 0
-static void cbSave(GtkWidget* widget, AppData *data)
-{
- GtkWidget* dialog = NULL;
- const gchar *current;
- gchar *selected = NULL;
-
- g_assert(data);
-
- ULOG_DEBUG("%s() - begin", G_STRFUNC);
-
- current = gtk_entry_get_text(GTK_ENTRY(data->mainViewData.fileNameEntry));
- if (NULL == current || strcmp(current, RECORDER_FILE_UNTITLED) == 0)
- {
- hildon_banner_show_information(GTK_WIDGET(data->mainView), GTK_STOCK_DIALOG_ERROR, _("Nothing to save"));
- return;
- }
-
- /* if saveFileName does not exist run saveas */
- if (NULL == data->saveFileName)
- {
- /* create dialog */
- dialog = GTK_WIDGET(hildon_file_chooser_dialog_new(
- GTK_WINDOW(data->mainView),
- GTK_FILE_CHOOSER_ACTION_SAVE));
-
- /* show it */
- gtk_widget_show_all(dialog);
-
- if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK)
- {
- selected = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
- }
-
- ULOG_DEBUG("%s() - dialog finished", G_STRFUNC);
-
- gtk_widget_destroy(dialog);
-
- if (NULL != selected)
- {
- ULOG_INFO("%s() - selected filename = '%s'", G_STRFUNC,
- selected);
- g_free(data->saveFileName);
- data->saveFileName = g_strdup_printf("%s%s", selected, getExtension(data->file_format));
- g_free(selected);
- selected = NULL;
- }
- else
- {
- return;
- }
- }
-
- /* save the file */
- if (doSave(gtk_entry_get_text(GTK_ENTRY(data->mainViewData.fileNameEntry)), data->saveFileName, data->file_format))
- {
- gchar *basename = g_path_get_basename(data->saveFileName);
- ULOG_INFO("%s() - file succesfully saved!", G_STRFUNC);
- g_free(data->openFileName);
- data->openFileName = g_strdup(data->saveFileName);
-
- gtk_entry_set_text(GTK_ENTRY(data->mainViewData.fileNameEntry),
- data->saveFileName);
- gtk_widget_set_sensitive(data->buttonSave, FALSE);
- gtk_window_set_title(GTK_WINDOW(data->mainView), basename);
- g_free(basename);
- }
-
- ULOG_DEBUG("%s() - end", G_STRFUNC);
-}
-#endif
-
static void cbSettings(GtkWidget* widget, AppData *data)
{
settings_edit( widget, data );
static void cbEmailing(GtkWidget* widget, AppData *data)
{
+
+ gboolean result;
+ GSList *list = NULL;
gchar *file = NULL;
- GSList *list = NULL;
g_assert(NULL != data);
file = file2uri(getFileName(data));
ULOG_INFO("Emailing: %s", file);
list = g_slist_append(list, file);
- if (osso_email_files_email(data->osso, list) != OSSO_OK)
+ result = libmodest_dbus_client_compose_mail(data->osso,
+ NULL, /*to*/
+ NULL, /*cc*/
+ NULL, /*bcc*/
+ NULL, /*body*/
+ NULL, /*subj*/
+ list);
+ if (!result)
hildon_banner_show_information(GTK_WIDGET(data->mainView), GTK_STOCK_DIALOG_ERROR, _("Emailing failed"));
g_slist_free(list);
basename = g_path_get_basename(data->saveFileName);
ULOG_DEBUG("%s() - file '%s' succesfully saved!", G_STRFUNC, data->saveFileName);
- gtk_window_set_title(GTK_WINDOW(data->mainView), basename);
-
/* Houston, we have a kludge:
* for AU files we need to keep the old tmpfile for playback
* for RAW/iLBC files, we can remove the tmpfile and point openFileName to the saved file
setAppState(data, APPSTATE_RECORDING);
gtk_widget_set_sensitive(data->buttonSaveAs, TRUE);
- gtk_window_set_title(GTK_WINDOW(data->mainView), RECORDER_FILE_UNTITLED);
data->file_format = data->filter;
setFormatString(data, data->file_format);
}
ULOG_INFO("filename %s", file);
- /*openPlayPipeline( data );*/
-
- /*if ( ! GST_IS_ELEMENT(data->playPipeline) )
- {
- if (g_strrstr(data->openFileName, EXTENSION_RAW))
- {
- ULOG_INFO("cbOpen() - file was raw, assuming audio/x-raw-int, 8kHz, 1 ch, 16-bit");
- destroyPipelines(data);
- createPipeline(data, PIPELINE_PLAY);
- }
- }*/
-
if (! GST_IS_ELEMENT(data->playPipeline))
{
ULOG_WARN("%s() - playPipeline does not exist", G_STRFUNC);
/* check if we are playing/recording */
- /*
- if (APPSTATE_PLAYING != getAppState(data) &&
- APPSTATE_RECORDING != getAppState(data))
- {
- ULOG_WARN("cbStop() - state different than PLAYING or RECORDING "
- "-> return");
- return;
- }
- */
-
/* stop playing or recording */
gtk_tool_button_set_stock_id(GTK_TOOL_BUTTON(data->buttonPlay), GTK_STOCK_MEDIA_PLAY);
gtk_widget_set_state(data->buttonPlay, GTK_STATE_NORMAL);
/* add items to toolbar */
gtk_toolbar_insert(toolBar, new, -1);
gtk_toolbar_insert(toolBar, open, -1);
- /*
- gtk_toolbar_insert(toolBar, save, -1);
- */
gtk_toolbar_insert(toolBar, saveas, -1);
gtk_toolbar_insert(toolBar, sep, -1);
gtk_toolbar_insert(toolBar, rec, -1);
g_signal_connect(G_OBJECT(open), "clicked",
G_CALLBACK(cbOpen),
data);
- /*
- g_signal_connect(G_OBJECT(save), "clicked",
- G_CALLBACK(cbSave),
- data);
- */
g_signal_connect(G_OBJECT(saveas), "clicked",
G_CALLBACK(cbSaveAs),
data);
/* Create the menu items needed for the main view */
static void createMenu( AppData *data )
{
- /* Create needed variables */
- GSList *group = NULL;
- GtkMenu *main_menu;
- GtkWidget *menu_file;
- GtkWidget *menu_others;
- GtkWidget *item_file;
- GtkWidget *item_file_open;
- GtkWidget *item_file_save_as;
- GtkWidget *item_others;
- GtkWidget *item_pcma;
- GtkWidget *item_pcmu;
- GtkWidget *item_ilbc;
- GtkWidget *item_pcm;
- GtkWidget *item_settings;
- GtkWidget *item_email;
- /*
- GtkWidget *item_radio_type1;
- */
- GtkWidget *item_close;
- GtkWidget *item_separator;
-
- /* Get the menu from view */
- main_menu = GTK_MENU(gtk_menu_new());
- hildon_window_set_menu(data->mainView, main_menu);
-
- /* Create new submenu for "Others" */
- menu_file = gtk_menu_new ();
- menu_others = gtk_menu_new ();
-
- /* Create menu items */
- item_file = gtk_menu_item_new_with_label (_("File"));
- item_file_open = gtk_menu_item_new_with_label(_("Open..."));
- item_file_save_as = gtk_menu_item_new_with_label(_("Save as..."));
- item_others = gtk_menu_item_new_with_label (_("Recording format"));
- item_settings = gtk_menu_item_new_with_label (_("Settings"));
- item_email = gtk_menu_item_new_with_label(_("Send via e-mail..."));
-
- item_pcma = gtk_radio_menu_item_new_with_label(
- group, FORMAT_NAME_PCMA);
- item_ilbc = gtk_radio_menu_item_new_with_label_from_widget(
- GTK_RADIO_MENU_ITEM(item_pcma), FORMAT_NAME_ILBC);
- item_pcmu = gtk_radio_menu_item_new_with_label_from_widget(
- GTK_RADIO_MENU_ITEM(item_pcma), FORMAT_NAME_PCMU);
- item_pcm = gtk_radio_menu_item_new_with_label_from_widget(
- GTK_RADIO_MENU_ITEM(item_pcma), FORMAT_NAME_WAV);
-
- data->filter = get_default_filter();
+ HildonAppMenu *menu;
+ GtkWidget *button_email;
- if (data->filter == FORMAT_ILBC)
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item_ilbc), TRUE);
- else if (data->filter == FORMAT_WAV)
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item_pcm), TRUE);
- else if (data->filter == FORMAT_PCMA)
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item_pcma), TRUE);
- else
- {
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item_ilbc), TRUE);
- data->filter = FORMAT_ILBC;
- }
-
- data->radio_pcma = item_pcma;
- data->radio_ilbc = item_ilbc;
- data->radio_pcm = item_pcm;
- /*
- data->radiotype = item_radio_type1;
- */
- item_close = gtk_menu_item_new_with_label(_("Close"));
- item_separator = gtk_separator_menu_item_new();
-
- /* Add menu items to right menus */
- gtk_menu_append(main_menu, item_file );
- gtk_menu_append(menu_file, item_file_open );
- gtk_menu_append(menu_file, item_file_save_as );
- gtk_menu_append(menu_file, item_email );
- gtk_menu_append(main_menu, item_others );
- gtk_menu_append(menu_others, item_pcm );
- gtk_menu_append(menu_others, item_pcma );
- gtk_menu_append(menu_others, item_ilbc);
-
- gtk_menu_append(main_menu, item_settings );
-
- gtk_menu_append(main_menu, item_close );
-
- /* Add others submenu to the "Others" item */
- gtk_menu_item_set_submenu(
- GTK_MENU_ITEM(item_file), menu_file );
- gtk_menu_item_set_submenu(
- GTK_MENU_ITEM(item_others), menu_others );
-
- /* Attach the callback functions to the activate signal */
- g_signal_connect( G_OBJECT( item_file_open), "activate",
- GTK_SIGNAL_FUNC (cbOpen), data);
- g_signal_connect( G_OBJECT( item_file_save_as), "activate",
- GTK_SIGNAL_FUNC (cbSaveAs), data);
- g_signal_connect( G_OBJECT( item_settings ), "activate",
- GTK_SIGNAL_FUNC (cbSettings), data);
- g_signal_connect( G_OBJECT( item_email ), "activate",
+ menu = HILDON_APP_MENU( hildon_app_menu_new() );
+ 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_email));
+
+ g_signal_connect( G_OBJECT( button_email ), "clicked",
GTK_SIGNAL_FUNC (cbEmailing), data);
- g_signal_connect( G_OBJECT( item_close ), "activate",
- GTK_SIGNAL_FUNC (cbItemClose), data);
- g_signal_connect_swapped(G_OBJECT(item_pcma), "activate", G_CALLBACK(cbItemGroupChanged), data);
- g_signal_connect_swapped(G_OBJECT(item_pcm), "activate", G_CALLBACK(cbItemGroupChanged), data);
- /* Make all menu widgets visible */
+ gtk_widget_show_all( GTK_WIDGET(menu));
+
+ hildon_window_set_app_menu(HILDON_WINDOW(data->mainView), menu);
+
+ data->filter = get_default_filter();
- gtk_widget_show_all( GTK_WIDGET( main_menu ) );
}
gboolean