Пример #1
0
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);
}
Пример #2
0
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);
}
Пример #3
0
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);
}
Пример #4
0
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);
}
Пример #5
0
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;
}