static void brasero_song_control_update_position (BraseroSongControl *player) { gdouble value; BraseroSongControlPrivate *priv; gchar *pos_string, *len_string, *result; priv = BRASERO_SONG_CONTROL_PRIVATE (player); len_string = brasero_units_get_time_string (priv->end - priv->start, FALSE, FALSE); value = gtk_range_get_value (GTK_RANGE (priv->progress)); pos_string = brasero_units_get_time_string (value, FALSE, FALSE); /** * Translators: this is the position being played in a stream. The * first %s is the position and the second %s is the whole length of * the stream. I chose to make that translatable in case some languages * don't allow the "/" */ result = g_strdup_printf (_("%s / %s"), pos_string, len_string); g_free (len_string); g_free (pos_string); gtk_label_set_text (GTK_LABEL (priv->size), result); g_free (result); }
static void brasero_song_props_update_length (BraseroSongProps *self) { gchar *length_str; gint64 start; gint64 end; gint64 gap; end = brasero_time_button_get_value (BRASERO_TIME_BUTTON (self->priv->end)); start = brasero_time_button_get_value (BRASERO_TIME_BUTTON (self->priv->start)); gap = gtk_spin_button_get_value (GTK_SPIN_BUTTON (self->priv->gap)) * GST_SECOND; length_str = brasero_units_get_time_string (BRASERO_STREAM_LENGTH (start, end + gap), TRUE, FALSE); gtk_label_set_markup (GTK_LABEL (self->priv->length), length_str); g_free (length_str); }
static void brasero_split_dialog_merge_clicked_cb (GtkButton *button, BraseroSplitDialog *self) { BraseroSplitDialogPrivate *priv; GtkTreeSelection *selection; GtkTreeModel *model; GtkTreeIter iter; priv = BRASERO_SPLIT_DIALOG_PRIVATE (self); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->tree)); model = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->tree)); if (!gtk_tree_model_get_iter_first (model, &iter)) return; do { guint64 end; guint64 start; gchar *end_str; gchar *start_str; GtkTreeIter next; gchar *length_str; GtkTreeIter child; if (!gtk_tree_selection_iter_is_selected (selection, &iter)) continue; next = iter; if (!gtk_tree_model_iter_next (model, &next)) continue; if (!gtk_tree_selection_iter_is_selected (selection, &next)) continue; gtk_tree_model_get (model, &iter, START_COL, &start, -1); gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT (model), &child, &iter); do { GtkTreeIter next_child; gtk_tree_model_get (model, &next, END_COL, &end, -1); gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT (model), &next_child, &next); if (!gtk_list_store_remove (priv->model, &next_child)) break; gtk_tree_model_sort_convert_child_iter_to_iter (GTK_TREE_MODEL_SORT (model), &next, &next_child); } while (gtk_tree_selection_iter_is_selected (selection, &next)); length_str = brasero_units_get_time_string (end - start, TRUE, FALSE); start_str = brasero_units_get_time_string (start, TRUE, FALSE); end_str = brasero_units_get_time_string (end, TRUE, FALSE); gtk_list_store_set (priv->model, &child, START_COL, (gint64) start, END_COL, (gint64) end, LENGTH_COL, (gint64) end - 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); gtk_tree_model_sort_convert_child_iter_to_iter (GTK_TREE_MODEL_SORT (model), &iter, &child); } while (gtk_tree_model_iter_next (model, &iter)); if (gtk_tree_model_iter_n_children (GTK_TREE_MODEL (priv->model), NULL) == 1) gtk_list_store_clear (priv->model); }
static void brasero_split_dialog_remove_range (BraseroSplitDialog *self, gint64 start, gint64 end, gint64 length) { BraseroSplitDialogPrivate *priv; GtkTreeModel *model; GtkTreeIter iter; gchar *length_str; gchar *start_str; gchar *end_str; priv = BRASERO_SPLIT_DIALOG_PRIVATE (self); /* align on 2352 byte boundary */ 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 > length) end = length; } model = gtk_tree_view_get_model (GTK_TREE_VIEW (priv->tree)); if (!gtk_tree_model_get_iter_first (model, &iter)) { /* nothing in the tree yet; so create two new segments: * - 0 => start * - end => song end * also make sure that the track is longer than 4 sec */ if (start - priv->start < BRASERO_MIN_STREAM_LENGTH && !brasero_split_dialog_size_error (self)) { /* that's not necessarily a good solution */ start = BRASERO_MIN_STREAM_LENGTH; if (start > end) end = start; } if ((length - end) < BRASERO_MIN_STREAM_LENGTH && !brasero_split_dialog_size_error (self)) end = length - BRASERO_MIN_STREAM_LENGTH; length_str = brasero_units_get_time_string (start - priv->start, TRUE, FALSE); start_str = brasero_units_get_time_string (priv->start, TRUE, FALSE); end_str = brasero_units_get_time_string (start, TRUE, FALSE); gtk_list_store_append (priv->model, &iter); gtk_list_store_set (priv->model, &iter, START_COL, (gint64) priv->start, END_COL, (gint64) start, LENGTH_COL, (gint64) start - 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); if (end == length) return; length_str = brasero_units_get_time_string (length - end, TRUE, FALSE); start_str = brasero_units_get_time_string (end, TRUE, FALSE); end_str = brasero_units_get_time_string (length, TRUE, FALSE); gtk_list_store_append (priv->model, &iter); gtk_list_store_set (priv->model, &iter, START_COL, end, END_COL, length, LENGTH_COL, (gint64) (length - end), 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; } do { GtkTreeIter child; gint64 track_start; gint64 track_end; gtk_tree_model_get (model, &iter, START_COL, &track_start, END_COL, &track_end, -1); gtk_tree_model_sort_convert_iter_to_child_iter (GTK_TREE_MODEL_SORT (model), &child, &iter); if (start == track_start) { if (start == end) return; if (end == track_end) { /* suppress it */ gtk_list_store_remove (priv->model, &child); return; } if (end < track_end) { /* reduce the size but make sure the remaining * track is > 4 sec */ if ((track_end - end) < BRASERO_MIN_STREAM_LENGTH && !brasero_split_dialog_size_error (self)) end = track_end - BRASERO_MIN_STREAM_LENGTH; start_str = brasero_units_get_time_string (end, TRUE, FALSE); length_str = brasero_units_get_time_string (track_end - end, TRUE, FALSE); gtk_list_store_set (priv->model, &child, START_COL, end, START_STR_COL, start_str, LENGTH_COL, track_end - end, LENGTH_STR_COL, length_str, -1); g_free (length_str); g_free (start_str); } else if (!gtk_list_store_remove (priv->model, &child)) return; } else if (start > track_start) { if (start > track_end) continue; /* reduce the size but make sure the remaining track is * > 4 sec else change it */ if ((start - track_start) < BRASERO_MIN_STREAM_LENGTH && !brasero_split_dialog_size_error (self)) start = track_start + BRASERO_MIN_STREAM_LENGTH; start_str = brasero_units_get_time_string (start, TRUE, FALSE); length_str = brasero_units_get_time_string (start - track_start, TRUE, FALSE); gtk_list_store_set (priv->model, &child, END_COL, start, END_STR_COL, start_str, LENGTH_COL, start - track_start, LENGTH_STR_COL, length_str, -1); g_free (length_str); g_free (start_str); if (end == length) return; if (end == track_end) return; if (end > track_end) continue; /* create a new track with the remaining time. * make sure the remaining track is > 4 sec */ if ((track_end - end) < BRASERO_MIN_STREAM_LENGTH && !brasero_split_dialog_size_error (self)) end = track_end - BRASERO_MIN_STREAM_LENGTH; gtk_list_store_append (priv->model, &child); length_str = brasero_units_get_time_string (track_end - end, TRUE, FALSE); start_str = brasero_units_get_time_string (end, TRUE, FALSE); end_str = brasero_units_get_time_string (track_end, TRUE, FALSE); gtk_list_store_set (priv->model, &child, START_COL, end, END_COL, track_end, LENGTH_COL, (gint64) (track_end - end), 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); } else if (end > track_end) { if (!gtk_list_store_remove (priv->model, &child)) return; } else if (end == track_end) { gtk_list_store_remove (priv->model, &child); return; } else { if (end == length) { gtk_list_store_remove (priv->model, &child); return; } /* resize (make sure about the 4s) */ if ((track_end - end) < BRASERO_MIN_STREAM_LENGTH && !brasero_split_dialog_size_error (self)) end = track_end - BRASERO_MIN_STREAM_LENGTH; start_str = brasero_units_get_time_string (end, TRUE, FALSE); length_str = brasero_units_get_time_string (track_end - end, TRUE, FALSE); gtk_list_store_set (priv->model, &child, START_COL, end, START_STR_COL, start_str, LENGTH_COL, track_end - end, LENGTH_STR_COL, length_str, -1); g_free (length_str); g_free (start_str); } gtk_tree_model_sort_convert_child_iter_to_iter (GTK_TREE_MODEL_SORT (model), &iter, &child); } while (gtk_tree_model_iter_next (model, &iter)); }
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; }
gboolean brasero_project_save_audio_project_plain_text (BraseroBurnSession *session, const gchar *uri) { const gchar *title; guint written; GSList *iter; gchar *path; FILE *file; path = g_filename_from_uri (uri, NULL, NULL); if (!path) return FALSE; file = fopen (path, "w+"); g_free (path); if (!file) return FALSE; /* write title */ title = brasero_burn_session_get_label (session); written = fwrite (title, strlen (title), 1, file); if (written != 1) goto error; written = fwrite ("\n", 1, 1, file); if (written != 1) goto error; iter = brasero_burn_session_get_tracks (session); for (; iter; iter = iter->next) { BraseroTrackStream *track; const gchar *text; gchar *time; guint64 len; gchar *uri; track = iter->data; text = brasero_track_tag_lookup_string (BRASERO_TRACK (track), BRASERO_TRACK_STREAM_TITLE_TAG); written = fwrite (title, 1, strlen (title), file); if (written != strlen (title)) goto error; len = 0; brasero_track_stream_get_length (track, &len); time = brasero_units_get_time_string (len, TRUE, FALSE); if (time) { written = fwrite ("\t", 1, 1, file); if (written != 1) goto error; written = fwrite (time, 1, strlen (time), file); if (written != strlen (time)) { g_free (time); goto error; } g_free (time); } text = brasero_track_tag_lookup_string (BRASERO_TRACK (track), BRASERO_TRACK_STREAM_ARTIST_TAG); if (text) { gchar *string; written = fwrite ("\t", 1, 1, file); if (written != 1) goto error; /* Translators: %s is an artist */ string = g_strdup_printf (" by %s", text); written = fwrite (string, 1, strlen (string), file); if (written != strlen (string)) { g_free (string); goto error; } g_free (string); } written = fwrite ("\n(", 1, 2, file); if (written != 2) goto error; uri = brasero_track_stream_get_source (track, TRUE); written = fwrite (uri, 1, strlen (uri), file); if (written != strlen (uri)) { g_free (uri); goto error; } g_free (uri); written = fwrite (")", 1, 1, file); if (written != 1) goto error; written = fwrite ("\n\n", 1, 2, file); if (written != 2) goto error; } fclose (file); return TRUE; error: fclose (file); return FALSE; }