summaryrefslogtreecommitdiff
path: root/test/sinesliders.c
blob: 71402bb41ca7c7f14e320da7cdcc50cfe2d3bcd5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <stdio.h>
#include <gtk/gtk.h>
#include <gst/gst.h>
#include <sys/soundcard.h>

static gint quit_live(GtkWidget *window, GdkEventAny *e, gpointer data) {
  gtk_main_quit();
  return FALSE;
}

//static void volume_changed(GtkAdjustment *adj,GstElement *element) {
  //fprintf(stderr,"setting volume to %f\n",adj->value);
//  gtk_object_set(GTK_OBJECT(element),"volume",adj->value,NULL);
//}

static void dynparm_value_changed(GtkAdjustment *adj,GstDParam *dparam) {
  GValue **point;
  g_return_if_fail(dparam != NULL);
  g_return_if_fail(GST_IS_DPARAM (dparam));

  point = GST_DPARAM_GET_POINT(dparam, 0LL);
  
  GST_DPARAM_LOCK(dparam);
  g_print("setting value from %f to %f\n", g_value_get_float(point[0]), adj->value);  
  g_value_set_float(point[0], adj->value);
  GST_DPARAM_READY_FOR_UPDATE(dparam) = TRUE;
  GST_DPARAM_UNLOCK(dparam);
}


int main(int argc,char *argv[]) {
  GtkWidget *window;
  GtkWidget *hbox;
  GtkAdjustment *volume_adj;
  GtkAdjustment *freq_adj;
  GtkWidget *volume_slider;
  GtkWidget *freq_slider;

  GstElement *thread, *sinesrc, *osssink;
  GstDParamManager *dpman;
  GstDParam *volume, *freq;

  gtk_init(&argc,&argv);
  gst_init(&argc,&argv);

  /***** set up the GUI *****/
  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  g_signal_connect(window,"delete_event",GTK_SIGNAL_FUNC(quit_live),NULL);
  hbox = gtk_hbox_new(TRUE,0);
  gtk_container_add(GTK_CONTAINER(window),hbox);

  volume_adj = (GtkAdjustment*)gtk_adjustment_new(1.0, 0.0, 1.0, 0.01, 0.01, 0.01);
  volume_slider = gtk_vscale_new(volume_adj);
  gtk_box_pack_start(GTK_BOX(hbox),volume_slider,TRUE,TRUE,0);

  freq_adj = (GtkAdjustment*)gtk_adjustment_new(440.0, 0.0, 2000.0, 1.0, 5.0, 5.0);
  freq_slider = gtk_vscale_new(freq_adj);
  gtk_box_pack_start(GTK_BOX(hbox),freq_slider,TRUE,TRUE,0);

  /***** construct the pipeline *****/
  
  g_print("creating elements\n");
  thread = gst_thread_new("live-example");
  sinesrc = gst_elementfactory_make("sinesrc","sine-source");
  osssink = gst_elementfactory_make("osssink","sound-sink");
  gst_bin_add(GST_BIN(thread),sinesrc);
  gst_bin_add(GST_BIN(thread),osssink);
  gst_element_connect(sinesrc,"src",osssink,"sink");
  gtk_object_set(GTK_OBJECT(sinesrc),"GstSineSrc::buffersize",64,NULL);
 
  dpman = GST_ELEMENT_DPARAM_MANAGER(sinesrc);
  volume = gst_dparam_new();
  freq = gst_dparam_new();

  g_assert(gst_dpman_attach_dparam (dpman, "volume", volume));
  g_assert(gst_dpman_attach_dparam (dpman, "freq", freq));
  
  gst_dpman_set_mode(dpman, "synchronous");

  /***** set up the handlers and such *****/
  //gtk_signal_connect(volume_adj,"value-changed",GTK_SIGNAL_FUNC(volume_changed),sinesrc);
  g_signal_connect(volume_adj,"value-changed",
					 GTK_SIGNAL_FUNC(dynparm_value_changed),
					 volume);

  g_signal_connect(freq_adj,"value-changed",
					 GTK_SIGNAL_FUNC(dynparm_value_changed),
					 freq);
  gtk_adjustment_value_changed(volume_adj);
  gtk_adjustment_value_changed(freq_adj);
  
  g_print("starting pipeline\n");
 
  /***** start everything up *****/
  gst_element_set_state(thread,GST_STATE_PLAYING);


  gtk_widget_show_all(window);
  gtk_main();
  
  return 0;
}