#include <math.h>
#include <gtk/gtk.h>
#include <gtkwaveview.h>
#include <gtkmemorywavebuffer.h>
/* Quit callback. */
static void
quit (GtkWidget *widget, gpointer user_data)
{
gtk_main_quit ();
}
/* Button press event. */
static void
press (GtkWidget *widget, GdkEventButton *event, gpointer user_data)
{
if (event->button == 3)
{
GtkWaveView *waveview = GTK_WAVE_VIEW (widget);
GtkWaveBuffer *wavebuffer;
wavebuffer = gtk_wave_view_get_buffer (waveview);
if (GTK_IS_EDITABLE_WAVE_BUFFER (wavebuffer))
{
GtkEditableWaveBuffer *editable = GTK_EDITABLE_WAVE_BUFFER (wavebuffer);
gint32 start, length;
gtk_wave_view_get_selection (waveview, &start, &length);
if (length > 0)
{
g_print ("Deleting selection of length %i, buffer length = %in", length, gtk_wave_buffer_get_length (wavebuffer));
gtk_editable_wave_buffer_delete (editable, start, length);
}
}
}
}
int
main (int argc, char *argv[])
{
GtkWidget *window, *waveview;
GtkObject *wavebuffer;
gint16 *ptr;
gint i;
/* Initialize Gtk+. */
gtk_init (&argc, &argv);
/* Create a Gtk+ window. */
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
/* Create a GtkWaveView widget. */
waveview = gtk_wave_view_new ();
gtk_wave_view_set_select_channels (GTK_WAVE_VIEW (waveview), 0x03);
gtk_widget_set_usize (waveview, 300, 200);
/* Set the zoom factor such that 1 pixel = 5 frames. A frame is equal
to n samples at one point in time where n = number of channels. */
gtk_wave_view_set_zoom (GTK_WAVE_VIEW (waveview), 5.0);
/* Set the cache size to hold 8192 pixel columns of data. This means
the user can scroll the widget's contents back and forth and we
will cache the most recently displayed 8192 columns of data. */
gtk_wave_view_set_cache_size (GTK_WAVE_VIEW (waveview), 8192);
/* Create a data source object. */
wavebuffer = gtk_memory_wave_buffer_new (2, G_WAVEFILE_TYPE_S16, 44100, 44100);
/* Write some sample data to memory data source. Note that normally
you should call gtk_wave_buffer_set_samples (), but since we just created
the data source and we know it's not associated with any GtkWaveView
widgets yet, we can get away with this. */
ptr = (gint16*) GTK_MEMORY_WAVE_BUFFER (wavebuffer)->data;
for (i = 0; i < 44100; i++)
{
ptr [i << 1] = (int) (sin (i * 0.01) * 32767.0);
ptr [(i << 1) + 1] = (int) (cos (i * 0.01) * 32767.0);
}
/* Add GtkWaveView to the window. */
gtk_container_add (GTK_CONTAINER (window), waveview);
/* Set the Waveform widget's data stream to point to our wavebuffer. */
gtk_wave_view_set_buffer (GTK_WAVE_VIEW (waveview),
GTK_WAVE_BUFFER (wavebuffer));
/* Call the usual Gtk+ cruft. */
gtk_signal_connect (GTK_OBJECT (window), "delete_event",
(GtkSignalFunc) quit, NULL);
gtk_signal_connect (GTK_OBJECT (waveview), "button_press_event",
(GtkSignalFunc) press, NULL);
gtk_widget_show_all (window);
gtk_main ();
return 0;
}
|