need help with final callback
- From: Gary Kline <kline thought org>
- To: GTK Devel List <gtk-app-devel-list gnome org>
- Subject: need help with final callback
- Date: Wed, 18 Jul 2012 16:15:10 -0700
Guys, I need your help with the last piece of my
voice-by-computer program. the appended section compiles to
the binary "xD" that lets the user choose the gender,
word-per-minute speed, delay-between-words, and pitch of th
e voice. Without this 'option' the user would type "hello"
and hit <enter>, a male voice would sound thru the speakers.
that's okay for *me*, nut probably not so if the user is a women
with impaired speech. in short, this callback option lets the
user select the gender and fine tune it.
I will let future developers deal with the text editor.
right now, vim is fine.
can anyone on this gtk list help me get this squared away?
thanks in advance,
gary kline
--
Gary Kline kline thought org http://www.thought.org Public Service Unix
Voice By Computer (for Universal Access): http:/www.thought.org/vbc
The 8.57a release of Jottings: http://jottings.thought.org
Twenty-six years of service to the Unix community.
/*
Compile::
gcc -Wall -Wextra -g dD.c -o xD `pkg-config --cflags gtk+-2.0` `pkg-config --libs gtk+-2.0`
*/
/* from here make this into:: Options callback */
#include <gtk/gtk.h>
#include <string.h>
#include <stdlib.h> // for exit()
#define PITCH 17.0
#define SPEED 100.0
#define VOLUME 100.0
#define DELAY 3.0
enum
{
MALE,
FEMALE
};
#define CONFIG "/tmp/chatConfig"
/* globals */
GtkWidget *gender_radio_male;
GtkWidget *gender_radio_female;
GtkWidget *pitch_scale1;
GtkWidget *speedWPM_scale2;
GtkWidget *volume_scale3;
GtkWidget *delay_scale4;
int valueGender = MALE; // default
double valuePitch, valueSpeed, valueVolume, valueDelay;
/* end globals */
/*
main prog writes default; this fn read and asks if ok
*/
void data_inout();
FILE *ifp, *ofp; /* in and out FILE pointers for fopen */
#define FALSE (0)
#define TRUE (~0)
static void
cb_gender_toggled (GtkToggleButton *button, gpointer userdata)
{
int malefemale = (int)userdata;
if (gtk_toggle_button_get_active (button))
{
if (malefemale == MALE)
{
fprintf(stdout, "Male \n");
}
else if (malefemale == FEMALE)
{
fprintf(stdout, "Female \n");
}
}
valueGender = malefemale;
fprintf(stderr,"valueGender: %d\n",valueGender);
}
static void hscale_value_changed_pitch (GtkRange *hscale, GtkWindow *parentWindow)
{
valuePitch = gtk_range_get_value(hscale);
//fprintf(stderr,"hscale pitch value: %g\n",valuePitch);
if (valueGender == 0)
{
fprintf(stdout, "\ngender is Male\n");
}
else
{
fprintf(stdout, "\ngender is Female\n");
}
fprintf(stdout,"In _pitch_: patch = %g, speed = %g, volume = %g delay = %g\n",
valuePitch, valueSpeed, valueVolume, valueDelay);
}
static void hscale_value_changed_speed (GtkRange *hscale, GtkWindow *parentWindow)
{
valueSpeed = gtk_range_get_value(hscale);
fprintf(stderr,"hscale speed value: %g\n",valueSpeed);
}
static void hscale_value_changed_volume (GtkRange *hscale, GtkWindow *parentWindow)
{
valueVolume = gtk_range_get_value(hscale);
fprintf(stderr,"hscale volume value: %g\n",valueVolume);
}
static void hscale_value_changed_delay (GtkRange *hscale, GtkWindow *parentWindow)
{
valueDelay = gtk_range_get_value(hscale);
fprintf(stderr,"hscale delay value: %g\n",valueDelay);
}
int
main (int argc, char *argv[])
{
/*
* Declare the GTK Widgets used in the program
*/
GtkWidget *dialog;
GtkWidget *main_hbox; //hbox1
GtkWidget *gender_frame;
GtkWidget *gender_align;
GtkWidget *gender_hbox; // hbox2
GtkWidget *params_frame;
GtkWidget *params_align;
GtkWidget *params_table;
GtkWidget *temp_widget;
GtkWidget *parent_window;
/*
Initialize GTK
*/
gtk_init (&argc, &argv);
parent_window = NULL; //Set to parent window if you want the dialog box
//to block access to the other windows in the app
//while it is open and running.
dialog = gtk_dialog_new_with_buttons ("Voice Settings", GTK_WINDOW (parent_window),
0,
GTK_STOCK_REVERT_TO_SAVED, //revert button which
GTK_RESPONSE_CANCEL, // returns a cancel response
GTK_STOCK_CLOSE, //close button which
GTK_RESPONSE_ACCEPT, // returns an accept response
NULL // mark the end of our buttons (we could have more)
);
gtk_window_set_title ( GTK_WINDOW ( dialog ) , "VBC Espeak Options");
gtk_widget_set_usize( GTK_WIDGET ( dialog ) , 600 , 400 );
//GTK_WINDOW ( dialog ) ->allow_shrink = TRUE;
/*
* dialog boxes have a vbox built in we can use
*/
main_hbox = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
/*
* Create the first frame
*/
gender_frame = gtk_frame_new ("<b>Voice Gender</b>");
gtk_frame_set_shadow_type (GTK_FRAME (gender_frame), GTK_SHADOW_NONE);
g_object_set (gtk_frame_get_label_widget (GTK_FRAME (gender_frame)),
"use-markup", TRUE, NULL);
gtk_widget_show (gender_frame);
/*
* ADD FRAME to the hbox
*/
gtk_box_pack_start (GTK_BOX (main_hbox), gender_frame, FALSE, FALSE, 0);//HBOX
/*
* Create an alignment widget to indent our child objects
*/
/*
* left aligned, top-aligned, children should fill the box
*/
gender_align = gtk_alignment_new (0, 0, 0, 1);
/*
* set a left margin of 12 pixels :: Padding
*/
gtk_alignment_set_padding (GTK_ALIGNMENT (gender_align), 0, 0, 12, 0);
gtk_widget_show (gender_align);
/*
* add alignmnet widget to frame
*/
gtk_container_add (GTK_CONTAINER (gender_frame), gender_align);
/*
* Create a [vh]box for the radio buttons and add it to the
* alignment widget inside the frame
*/
gender_hbox = gtk_hbox_new (FALSE, 2); //2 pixels between objects
gtk_widget_show (gender_hbox);
gtk_container_add (GTK_CONTAINER (gender_align), gender_hbox);
/*
* Create the first radio toggle-box with a label
*/
gender_radio_male = gtk_radio_button_new_with_label (NULL, "Male");
g_signal_connect (gender_radio_male,"toggled", G_CALLBACK (cb_gender_toggled),
(gpointer)MALE);
gtk_widget_show (gender_radio_male);
/*
* Create the rest of the radio toggle-box with label â??
*/
gender_radio_female = gtk_radio_button_new_with_label (gtk_radio_button_group
(GTK_RADIO_BUTTON (gender_radio_male)), "Female");
g_signal_connect (gender_radio_female, "toggled", G_CALLBACK (cb_gender_toggled),
(gpointer)FEMALE);
gtk_widget_show (gender_radio_female);
/*
* Pack the two radio buttons into the hbox.
*/
gtk_box_pack_start (GTK_BOX (gender_hbox), gender_radio_male, TRUE, TRUE, 2);
gtk_box_pack_start (GTK_BOX (gender_hbox), gender_radio_female, TRUE, TRUE, 2);
/************************************************************************************
End of male/female toggles
************************************************************************************/
/*
* Create the second frame
*/
params_frame = gtk_frame_new ("<b>Voice Parameters</b>");
gtk_frame_set_shadow_type (GTK_FRAME (params_frame), GTK_SHADOW_NONE);
g_object_set (gtk_frame_get_label_widget (GTK_FRAME (params_frame)),
"use-markup", TRUE, NULL);
gtk_widget_show (params_frame);
/*
* Add frame to the vbox [][]
*/
gtk_box_pack_start (GTK_BOX (main_hbox), params_frame, FALSE, FALSE, 0);
/*
* Create an alignment widget to indent our child objects
*
*
* left aligned, top-aligned, children should fill the box
*/
params_align = gtk_alignment_new (0, 0, 1, 1);
/*
* set a left margin of 12 pixels
*/
gtk_alignment_set_padding (GTK_ALIGNMENT (params_align), 0, 0, 12, 0);
gtk_widget_show (params_align);
/*
* add alignmnet widget to frame
*/
gtk_container_add (GTK_CONTAINER (params_frame), params_align);
/*
* create a table for the radio buttons and add it to the
* alignment widget inside the frame
*/
params_table = gtk_table_new (2, 2, FALSE);
gtk_table_set_row_spacings (GTK_TABLE (params_table), 2);
gtk_table_set_col_spacings (GTK_TABLE (params_table), 7);
gtk_widget_show (params_table);
gtk_container_add (GTK_CONTAINER (params_align), params_table);
temp_widget = gtk_label_new ("Pitch");
/*
* push label left instead of centering
*/
gtk_misc_set_alignment (GTK_MISC (temp_widget), 0.0, 0.5);
gtk_widget_show (temp_widget);
gtk_table_attach (GTK_TABLE (params_table), temp_widget, 0, 1, //column 0 (first)
0, 1, //row 1 (second)
GTK_FILL, 0, // Don't grow in size on screen
0, 0);
temp_widget = gtk_label_new ("Speed WPM");
gtk_misc_set_alignment (GTK_MISC (temp_widget), 0.0, 0.5);//Push label left don't center
gtk_widget_show (temp_widget);
gtk_table_attach (GTK_TABLE (params_table), temp_widget, 0, 1, //Column 0 (first)
1, 2, //row 1 (second)
GTK_FILL, 0, //don't grow in size
0, 0);
temp_widget = gtk_label_new ("Volume");
gtk_misc_set_alignment (GTK_MISC (temp_widget), 0.0, 0.5);
gtk_widget_show (temp_widget);
gtk_table_attach (GTK_TABLE (params_table), temp_widget, 0, 1, //Column 0 (first)
2, 3, //row 2 (second)
GTK_FILL, 0,
0, 0);
temp_widget = gtk_label_new ("Delay");
gtk_misc_set_alignment (GTK_MISC (temp_widget), 0.0, 0.5); //push label left
gtk_widget_show (temp_widget);
gtk_table_attach (GTK_TABLE (params_table), temp_widget, 0, 1, //column 0 (first)
3, 4, //row 3 (third)
GTK_FILL, 0, //don't grow in size on screen
0, 0);
/**********
Set ranges
*********/
pitch_scale1 = gtk_hscale_new_with_range (0.0, 100.0, 1.0);
gtk_range_set_value(GTK_RANGE(pitch_scale1), 17.0);
gtk_widget_show (pitch_scale1);
gtk_table_attach (GTK_TABLE (params_table), pitch_scale1, 1, 2,
0, 1, //row 0 (first)
GTK_EXPAND | GTK_FILL, //this part expands when window grows
0, 0, 0);
g_signal_connect (G_OBJECT (pitch_scale1), "value_changed",
GTK_SIGNAL_FUNC (hscale_value_changed_pitch), (gpointer) parent_window);
valuePitch = PITCH;
speedWPM_scale2 = gtk_hscale_new_with_range (80.0, 390.0, 1.0);
gtk_range_set_value(GTK_RANGE(speedWPM_scale2), 150.0);
gtk_widget_show (speedWPM_scale2);
gtk_table_attach (GTK_TABLE (params_table), speedWPM_scale2, 1, 2, //column 1 (second)
1, 2, //row 0 (first)
GTK_EXPAND | GTK_FILL, //this part expands when window grows
0, 0, 0);
g_signal_connect (G_OBJECT (speedWPM_scale2), "value_changed",
GTK_SIGNAL_FUNC (hscale_value_changed_speed), (gpointer) parent_window);
valueSpeed = SPEED;
volume_scale3 = gtk_hscale_new_with_range (0.0, 200.0, 1.0);
gtk_range_set_value(GTK_RANGE(volume_scale3), 100.0);
gtk_widget_show (volume_scale3);
gtk_table_attach (GTK_TABLE (params_table), volume_scale3, 1, 2, //column 1 (second)
2, 3, //row 0 (first) MOD: 14:1
GTK_EXPAND | GTK_FILL, //this part expands when window grows
0, 0, 0);
g_signal_connect (G_OBJECT (volume_scale3), "value_changed",
GTK_SIGNAL_FUNC (hscale_value_changed_volume), (gpointer) parent_window);
valueVolume = VOLUME;
/*
* The "delay" is in 10ths of a second between words. The faster the words
* are spoken, the more sense it makes to allow for more delay between
* words. For a slow WPM delivery, 3 to 5 tenths should be plenty for
* DEFAULT.
*/
delay_scale4 = gtk_hscale_new_with_range (0.0, 100.0, 1.0);
gtk_range_set_value(GTK_RANGE(delay_scale4), 3.0);
gtk_widget_show (delay_scale4);
gtk_table_attach (GTK_TABLE (params_table), delay_scale4, 1, 2, //column 1 (second)
3, 4, //row 0 (first) MOD: 14:1
GTK_EXPAND | GTK_FILL, //this part expands when window grows
0, 0, 0);
g_signal_connect (G_OBJECT (delay_scale4), "value_changed",
GTK_SIGNAL_FUNC (hscale_value_changed_delay), (gpointer) parent_window);
valueDelay = DELAY;
/*****
Print gender, pitch, speed, volume, delay to stdout.
*****/
puts("Initially:\n");
if (valueGender == 0)
{
fprintf(stdout, "gender is Male\n");
}
else
{
fprintf(stdout, "gender is Female\n");
}
fprintf(stdout,"patch = %g, speed = %g, volume = %g delay = %g\n",
valuePitch, valueSpeed, valueVolume, valueDelay);
/*
* Run the dialog (a main loop starts automatically)
*/
gtk_dialog_run (GTK_DIALOG (dialog));
/*
* Return 0 if exit is successful.
*/
data_inout();
return 0;
}
/*
* here, we first-time WRITE (fprintf) all ints or data with %g.
* ./dD 1 indicdate fscanf and printf to stdout and /tmp/file, ready to be
* read at next instantiation.
*/
void
data_inout()
{
char vbcintvalue[16];
int gender, pitch, speed, volume, delay;
puts("IN inout");
if ((ifp = fopen(CONFIG, "r+")) == NULL)
{
printf("Cannot open for reading: [%s]\n", CONFIG);
exit(1);
}
else
{
fscanf(ifp, "%d %d %d %d %d\n", &gender, &pitch, &speed, &volume,&delay);
printf("This okay?: %d %d %d %d %d\n", gender,pitch,speed,volume,delay);
}
fclose(ifp);
/*
* popup with "printf()" data. Ask if okay. Yes, No,
* Do not ask again. if user clicks yes, close popup, if No, open Opions
* menu, and if Do not ask again, set flag in CONFIG dir and
* close popup and open main VBC window.
*/
if ((ofp = fopen(CONFIG, "w+")) == NULL)
{
printf("Cannot open for writing: [%s]\n", CONFIG);
exit(1);
}
else
{
//sprintf(vbcintvalue, "%d", counter);
fprintf(stdout, "INOUT: Gender is %d %g %g %g %g\n ", valueGender, valuePitch,
valueSpeed, valueVolume, valueDelay);
fprintf(ofp, "%d %g %g %g %g\n", valueGender, valuePitch, valueSpeed ,
valueVolume, valueDelay);
}
fclose(ofp);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]