void brasero_split_dialog_set_boundaries (BraseroSplitDialog *self, gint64 start, gint64 end) { BraseroSplitDialogPrivate *priv; guint64 length; priv = BRASERO_SPLIT_DIALOG_PRIVATE (self); if (BRASERO_DURATION_TO_BYTES (start) % 2352) start += BRASERO_BYTES_TO_DURATION (2352 - (BRASERO_DURATION_TO_BYTES (start) % 2352)); if (BRASERO_DURATION_TO_BYTES (end) % 2352) end += BRASERO_BYTES_TO_DURATION (2352 - (BRASERO_DURATION_TO_BYTES (end) % 2352)); if (end - start < BRASERO_MIN_STREAM_LENGTH) return; priv->start = start; priv->end = end; brasero_song_control_set_boundaries (BRASERO_SONG_CONTROL (priv->player), priv->start, priv->end); /* Don't allow splitting the track in sections longer than the track * length in seconds */ length = (gdouble) brasero_song_control_get_length (BRASERO_SONG_CONTROL (priv->player)) / 1000000000; gtk_spin_button_set_range (GTK_SPIN_BUTTON (priv->spin_sec), 1.0, length); }
void brasero_split_dialog_set_uri (BraseroSplitDialog *self, const gchar *uri, const gchar *title, const gchar *artist) { BraseroSplitDialogPrivate *priv; priv = BRASERO_SPLIT_DIALOG_PRIVATE (self); brasero_song_control_set_uri (BRASERO_SONG_CONTROL (priv->player), uri); brasero_song_control_set_info (BRASERO_SONG_CONTROL (priv->player), title, artist); }
static void brasero_song_control_range_value_changed (GtkRange *range, BraseroSongControl *player) { BraseroSongControlPrivate *priv; priv = BRASERO_SONG_CONTROL_PRIVATE (player); if (priv->state >= GST_STATE_PAUSED && !priv->update_scale_id) { gdouble pos; /* user changed the value tell the player/pipeline */ pos = gtk_range_get_value (GTK_RANGE (priv->progress)); brasero_song_control_set_pos (BRASERO_SONG_CONTROL (player), (gint64) pos + priv->start); } brasero_song_control_update_position (player); }
static void brasero_split_dialog_cut_clicked_cb (GtkButton *button, BraseroSplitDialog *self) { BraseroSplitDialogPrivate *priv; guint page; priv = BRASERO_SPLIT_DIALOG_PRIVATE (self); page = gtk_combo_box_get_active (GTK_COMBO_BOX (priv->combo)); if (page == 0) { gint64 pos; /* this one is before since it doesn't wipe all slices */ pos = brasero_song_control_get_pos (BRASERO_SONG_CONTROL (priv->player)); brasero_split_dialog_cut (self, pos + priv->start, TRUE); return; } if (!brasero_split_dialog_clear_confirm_dialog (self, _("Do you really want to carry on with automatic splitting?"), _("_Don't split"), _("_Split"))) return; if (page == 1) { gint64 sec; gint64 start; gint64 length; sec = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (priv->spin_sec)); sec *= 1000000000; if (sec < BRASERO_MIN_STREAM_LENGTH && !brasero_split_dialog_size_error (self)) return; length = priv->end - priv->start; gtk_list_store_clear (priv->model); for (start = sec; start < length; start += sec) brasero_split_dialog_cut (self, start, FALSE); return; } if (page == 2) { gint64 step; gint64 start; gint64 parts; gint64 length; parts = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (priv->spin_parts)); length = priv->end - priv->start; step = length / parts; if (step < BRASERO_MIN_STREAM_LENGTH && !brasero_split_dialog_size_error (self)) return; gtk_list_store_clear (priv->model); parts --; for (start = step; start < length && parts; start += step, parts --) brasero_split_dialog_cut (self, start, FALSE); return; } gtk_list_store_clear (priv->model); priv->metadata = brasero_metadata_new (); g_signal_connect (priv->metadata, "completed", G_CALLBACK (brasero_split_dialog_metadata_finished_cb), self); brasero_metadata_get_info_async (priv->metadata, brasero_song_control_get_uri (BRASERO_SONG_CONTROL (priv->player)), BRASERO_METADATA_FLAG_SILENCES); /* stop anything from playing and grey out things */ gtk_widget_set_sensitive (priv->cut, FALSE); }
static gboolean brasero_split_dialog_cut (BraseroSplitDialog *self, gint64 pos, gboolean warn) { BraseroSplitDialogPrivate *priv; BraseroAudioSlice slice = {0,0}; GtkTreeModel *model; GtkTreeIter child; GtkTreeIter iter; gchar *length_str; gchar *start_str; gchar *end_str; if (!pos) return FALSE; priv = BRASERO_SPLIT_DIALOG_PRIVATE (self); /* since pos is in nanosecond we have a small lattitude. Make sure that * is up to the size of a sector */ if (BRASERO_DURATION_TO_BYTES (pos) % 2352) pos += BRASERO_BYTES_TO_DURATION (2352 - (BRASERO_DURATION_TO_BYTES (pos) % 2352)); model = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->tree)); if (!gtk_tree_model_get_iter_first (model, &iter)) { gint64 end; /* nothing in the tree yet */ if (priv->end <= 0) end = brasero_song_control_get_length (BRASERO_SONG_CONTROL (priv->player)); else end = priv->end; /* check that pos > 300 sectors ( == 4 sec ) */ if (warn && pos - priv->start < BRASERO_MIN_STREAM_LENGTH && !brasero_split_dialog_size_error (self)) return FALSE; if (warn && end - (pos + 1) < BRASERO_MIN_STREAM_LENGTH && !brasero_split_dialog_size_error (self)) return FALSE; length_str = brasero_units_get_time_string (pos - priv->start, TRUE, FALSE); start_str = brasero_units_get_time_string (priv->start, TRUE, FALSE); end_str = brasero_units_get_time_string (pos, TRUE, FALSE); gtk_list_store_append (priv->model, &iter); gtk_list_store_set (priv->model, &iter, START_COL, (gint64) priv->start, END_COL, (gint64) pos, LENGTH_COL, (gint64) pos - priv->start, START_STR_COL, start_str, END_STR_COL, end_str, LENGTH_STR_COL, length_str, -1); g_free (length_str); g_free (start_str); g_free (end_str); pos ++; length_str = brasero_units_get_time_string (end - pos, TRUE, FALSE); start_str = brasero_units_get_time_string (pos, TRUE, FALSE); end_str = brasero_units_get_time_string (end, TRUE, FALSE); gtk_list_store_append (priv->model, &iter); gtk_list_store_set (priv->model, &iter, START_COL, pos, END_COL, end, LENGTH_COL, (gint64) (end - pos), START_STR_COL, start_str, END_STR_COL, end_str, LENGTH_STR_COL, length_str, -1); g_free (length_str); g_free (start_str); g_free (end_str); return TRUE; } /* Try to find an already created slice encompassing the position */ do { gint64 start; gint64 end; gtk_tree_model_get (model, &iter, START_COL, &start, END_COL, &end, -1); /* NOTE: if pos == start or pos == end then nothing changes */ if (pos <= start || pos >= end) continue; /* check the size of the new tracks */ if (warn && (pos - start) < BRASERO_MIN_STREAM_LENGTH && !brasero_split_dialog_size_error (self)) return FALSE; if (warn && (end - (pos + 1)) < BRASERO_MIN_STREAM_LENGTH && !brasero_split_dialog_size_error (self)) return FALSE; /* Found one */ slice.start = start; slice.end = end; break; } while (gtk_tree_model_iter_next (model, &iter)); /* see if we found a slice, if not create a new one starting at pos * until the end of the song */ if (slice.start == 0 && slice.end == 0) { slice.start = pos; /* check if we need to stop this slice at the end of the song * or at the start of the next slice. */ if (gtk_tree_model_get_iter_first (model, &iter)) { do { gint64 start; gint64 end; gtk_tree_model_get (model, &iter, START_COL, &start, END_COL, &end, -1); if (pos >= start) continue; /* Found one */ slice.end = start - 1; } while (gtk_tree_model_iter_next (model, &iter)); } if (!slice.end) slice.end = priv->end; /* check the size of the new slice */ if (warn && (slice.end - slice.start) < BRASERO_MIN_STREAM_LENGTH && !brasero_split_dialog_size_error (self)) return FALSE; } else { /* we are in the middle of an existing slice */ length_str = brasero_units_get_time_string (pos - slice.start, TRUE, FALSE); end_str = brasero_units_get_time_string (pos, TRUE, FALSE); gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT (model), &child, &iter); gtk_list_store_set (priv->model, &child, END_COL, (gint64) pos, LENGTH_COL, (gint64) (pos - slice.start), END_STR_COL, end_str, LENGTH_STR_COL, length_str, -1); g_free (length_str); g_free (end_str); /* move the position by one */ pos ++; } /* create a new one */ gtk_list_store_append (priv->model, &child); length_str = brasero_units_get_time_string (slice.end - pos, TRUE, FALSE); start_str = brasero_units_get_time_string (pos, TRUE, FALSE); end_str = brasero_units_get_time_string (slice.end, TRUE, FALSE); gtk_list_store_set (priv->model, &child, START_COL, pos, END_COL, slice.end, LENGTH_COL, (gint64) (slice.end - pos), START_STR_COL, start_str, END_STR_COL, end_str, LENGTH_STR_COL, length_str, -1); g_free (length_str); g_free (start_str); g_free (end_str); return TRUE; }