Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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);
}
Exemplo n.º 3
0
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);
}
Exemplo n.º 4
0
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));
}
Exemplo n.º 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;
}
Exemplo n.º 6
0
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;
}