/***************************************************************************
* Copyright (C) 2005 to 2013 by Jonathan Duddington *
* email: jonsd@users.sourceforge.net *
* Copyright (C) 2013 by Reece H. Dunn *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, see: *
* . *
***************************************************************************/
#include "wx/wx.h"
#include "wx/fileconf.h"
#include "wx/filename.h"
#include
#include "speech.h"
#ifdef PLATFORM_WINDOWS
#include "wx/msw/registry.h"
#endif
#include "main.h"
#include "options.h"
extern void WavegenInit(int samplerate, int wavemult_fact);
extern void strncpy0(char *to,const char *from, int size);
extern int GetNumeric(wxTextCtrl *t);
extern void SetNumeric(wxTextCtrl *t, int value);
extern int samplerate;
wxString path_espeakdata;
wxString path_spectload;
wxString path_spectload2;
wxString path_pitches;
wxString path_wave;
wxString path_speech;
wxString path_phfile;
wxString path_phsource;
wxString path_dictsource;
wxString path_speaktext;
wxString path_modifiervoice;
wxString path_dir1;
int option_speed=160;
char path_dsource[sizeof(path_home)+20];
char voice_name2[40];
BEGIN_EVENT_TABLE(Options, wxDialog)
EVT_BUTTON(wxID_SAVE,Options::OnCommand)
EVT_BUTTON(wxID_CLOSE,Options::OnCommand)
END_EVENT_TABLE()
Options::Options(wxWindow *parent) : wxDialog(parent,-1,_T("Options"),wxDefaultPosition,wxDefaultSize)
{//===================================================================================================
m_lab[0] = new wxStaticText(this,-1,_T("Sample rate"),wxPoint(72,84));
m_samplerate = new wxTextCtrl(this,-1,_T(""),wxPoint(8,80),wxSize(60,24));
SetNumeric(m_samplerate,samplerate);
m_save = new wxButton(this,wxID_SAVE,_T("Save"),wxPoint(8,120));
m_close = new wxButton(this,wxID_CLOSE,_T("Cancel"),wxPoint(98,120));
Show();
}
Options::~Options()
{//================
int ix;
for(ix=0; ix < 1; ix++)
delete m_lab[ix];
delete m_samplerate;
delete m_save;
delete m_close;
}
void Options::OnCommand(wxCommandEvent& event)
{//===========================================
int id;
int value;
switch(id = event.GetId())
{
case wxID_SAVE:
value = GetNumeric(m_samplerate);
if(value > 0) WavegenInit(value,0);
Destroy();
break;
case wxID_CLOSE:
Destroy();
break;
}
}
void ConfigSetPaths()
{//==================
// set c_string paths from wxStrings
strncpy0(path_source,path_phsource.mb_str(wxConvLocal),sizeof(path_source)-1);
strcat(path_source,"/");
strncpy0(path_dsource,path_dictsource.mb_str(wxConvLocal),sizeof(path_source)-1);
strcat(path_dsource,"/");
}
void ConfigInit(bool use_defaults)
{//==============
wxString string;
wxString basedir;
const char *path_base;
#ifdef PLATFORM_WINDOWS
int found = 0;
char buf[200];
wxRegKey *pRegKey = new wxRegKey(_T("HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Speech\\Voices\\Tokens\\eSpeak"));
if((path_base = getenv("ESPEAK_DATA_PATH")) != NULL)
{
sprintf(path_home,"%s\\espeak-data",path_base);
if(GetFileLength(path_home) == -2)
found = 1; // an espeak-data directory exists
}
if(found == 0)
{
if(pRegKey->Exists() )
{
wxString RegVal;
pRegKey->QueryValue(_T("Path"),RegVal);
strncpy0(buf,RegVal.mb_str(wxConvLocal),sizeof(buf));
path_base = buf;
}
else
{
path_base = "C:\\Program Files\\eSpeak";
}
sprintf(path_home,"%s\\espeak-data",path_base);
}
#else
char *env;
if((env = getenv("ESPEAK_DATA_PATH")) == NULL)
env = getenv("HOME");
snprintf(path_home,sizeof(path_home),"%s/espeak-data",env);
path_base = path_home;
#endif
mkdir(path_home,S_IRWXU); // create if it doesn't already exist
wxFileConfig *pConfig = new wxFileConfig(_T("espeakedit"));
wxFileConfig::Set(pConfig);
basedir = wxString(path_base,wxConvLocal); // this is only used to set defaults for other paths if they are not in the config file
if (use_defaults)
{
path_spectload = basedir + _T("/../phsource");
path_spectload2 = basedir + _T("/../phsource");
path_pitches = basedir + _T("/pitch");
path_phsource = basedir + _T("/../phsource");
path_phfile = path_phsource + _T("/phonemes");
path_dictsource = basedir + _T("/../dictsource");
path_modifiervoice = basedir;
path_dir1 = basedir;
}
else
{
pConfig->Read(_T("/espeakdata"),&path_espeakdata,wxEmptyString);
if(path_espeakdata != wxEmptyString)
{
strcpy(path_home, path_espeakdata.mb_str(wxConvLocal));
}
pConfig->Read(_T("/spectload"),&path_spectload,basedir+_T("/phsource"));
pConfig->Read(_T("/spectload2"),&path_spectload2,basedir+_T("/phsource"));
pConfig->Read(_T("/pitchpath"),&path_pitches,basedir+_T("/pitch"));
pConfig->Read(_T("/wavepath"),&path_wave,wxEmptyString);
pConfig->Read(_T("/speechpath"),&path_speech,wxEmptyString);
pConfig->Read(_T("/voicename"),&string,wxEmptyString);
strcpy(voice_name2,string.mb_str(wxConvLocal));
pConfig->Read(_T("/phsource"),&path_phsource,basedir+_T("/phsource"));
pConfig->Read(_T("/phfile"),&path_phfile,path_phsource+_T("/phonemes"));
pConfig->Read(_T("/dictsource"),&path_dictsource,basedir+_T("/dictsource"));
pConfig->Read(_T("/speaktext"),&path_speaktext,wxEmptyString);
pConfig->Read(_T("/modifiervoice"),&path_modifiervoice,basedir);
pConfig->Read(_T("/dir1"),&path_dir1,basedir);
option_speed = pConfig->Read(_T("/speed"),160);
frame_x = pConfig->Read(_T("/windowx"), 0l);
frame_y = pConfig->Read(_T("/windowy"), 0l);
frame_h = pConfig->Read(_T("/windowh"), 0l);
frame_w = pConfig->Read(_T("/windoww"), 0l);
}
ConfigSetPaths();
} // end of ConfigInit
void ConfigSave(int exit)
{//======================
wxFileConfig *pConfig = (wxFileConfig *)(wxConfigBase::Get());
#ifndef PLATFORM_WINDOWS
// pConfig->Write(_T("/samplerate"),samplerate);
#endif
pConfig->Write(_T("/espeakdata"),path_espeakdata);
pConfig->Write(_T("/spectload"),path_spectload);
pConfig->Write(_T("/spectload2"),path_spectload2);
pConfig->Write(_T("/pitchpath"),path_pitches);
pConfig->Write(_T("/wavepath"),path_wave);
pConfig->Write(_T("/speechpath"),path_speech);
pConfig->Write(_T("/voicename"),wxString(voice_name2,wxConvLocal));
pConfig->Write(_T("/phsource"),path_phsource);
pConfig->Write(_T("/phfile"),path_phfile);
pConfig->Write(_T("/dictsource"),path_dictsource);
pConfig->Write(_T("/speaktext"),path_speaktext);
pConfig->Write(_T("/speed"),option_speed);
pConfig->Write(_T("/modifiervoice"),path_modifiervoice);
pConfig->Write(_T("/dir1"),path_dir1);
pConfig->Write(_T("/windowx"),frame_x);
pConfig->Write(_T("/windowy"),frame_y);
pConfig->Write(_T("/windoww"),frame_w);
pConfig->Write(_T("/windowh"),frame_h);
if(exit)
delete wxFileConfig::Set((wxFileConfig *)NULL);
}