Program changes to enable audio output from Windows DLL. Language changes: an, de, en, nl, ta. git-svn-id: https://espeak.svn.sourceforge.net/svnroot/espeak/trunk@365 d46cf337-b52f-0410-862d-fd96e6ae7743master
@@ -6,7 +6,7 @@ | |||
.L03 f h j s y z r // allow [B] [D] [Q] before these consonants | |||
.L04 b v f p // labials, nasals are [m] | |||
.L05 g k // velars, nasals are [N] | |||
.L06 a e o | |||
.group a | |||
a a | |||
@@ -75,6 +75,8 @@ | |||
i) e E | |||
u) e E | |||
y) e E | |||
L06_) e e# // unstressed 'e' silent at start of word after a,e,o | |||
_) ent' (AP4 ent | |||
_) enta' ,ent%a | |||
@@ -199,6 +201,10 @@ q k | |||
&) s (_S1 s | |||
_) s' (AP2 s | |||
_) s (C@ %es | |||
_) s (hA s | |||
_) s (y s | |||
A_) s (C s | |||
.group t |
@@ -506,6 +506,7 @@ talk _^_EN | |||
teaser _^_EN | |||
tech _^_EN | |||
terminal _^_EN | |||
time _^_EN | |||
trip _^_EN | |||
tuner _^_EN | |||
unix _^_EN | |||
@@ -588,6 +589,7 @@ erst e:rst | |||
ersten e:rst@n | |||
erstmal e:rstma:l | |||
erzgebirg e:rtsg@bIrg | |||
expedient Ekspe:dI'Ent | |||
extravagant $1 | |||
extrem Ekstr'e:m | |||
@@ -734,6 +734,7 @@ financ) ie (r I'e: | |||
@t) ien (_ 'i:@n | |||
&) iens (_ =I;@ns | |||
ient (_ I'Ent | |||
d) ient (_ i:nt | |||
&) ienz (_ I'Ents | |||
sch) ie (n i: | |||
@) ie (reX 'i: |
@@ -18,6 +18,16 @@ | |||
೮ 8 | |||
೯ 9 | |||
.L01 ಕ ಖ ಗ ಘ ಙ // velar | |||
.L02 ಚ ಛ ಜ ಝ ಞ // palatal | |||
.L03 ಟ ಠ ಡ ಢ ಣ // retroflex | |||
.L04 ತ ಥ ದ ಧ ನ // dental | |||
.L05 ಪ ಫ ಬ ಭ ಮ // labial | |||
.group ಕ | |||
ಕ ka | |||
@@ -215,7 +225,11 @@ | |||
.group 0xe0b2 // characters which start with UTF-8 bytes: [e0 b2] | |||
ಂ m // anusvara (this should nasalize the vowel) | |||
ಂ(L01 N // anusvara (this should nasalize the vowel) | |||
ಂ(L02 n^ | |||
ಂ(L03 n. | |||
ಂ(L04 n | |||
ಂ m | |||
ಃ h // visarga | |||
@@ -403,7 +403,7 @@ zeten $alt | |||
boezemen $alt | |||
ademen $alt | |||
bliksemen $alt | |||
wasemen $alt | |||
wasemen v#a:s@m@n $alt | |||
// words where -er is not a stressed verb ending | |||
@@ -881,7 +881,7 @@ waaier $alt | |||
wakker $alt | |||
wapper $alt | |||
water $alt | |||
wedijver v#Ed'EIv@r $alt | |||
wedijver v#'EtEIv@r $alt | |||
weelder $alt | |||
wegwijzer $alt | |||
weiger $alt | |||
@@ -1805,7 +1805,7 @@ verderop $3 | |||
vergezicht vErQ@zIxt | |||
verre vEr@ | |||
verrekijker vEr@kEIk@r | |||
versa vErs'a: | |||
versa v'Erza: | |||
verste vErst@ | |||
verte vErt@ | |||
volledig $2 |
@@ -430,9 +430,10 @@ | |||
_) ge (tenL02 Qe: | |||
_) geu QY: | |||
_) ge (ven Qe: | |||
_) ge (ver Qe: | |||
ge (vend_ Qe: | |||
ge (ver Qe: | |||
ge (val Q@ | |||
_) ge (ving Qe: | |||
ge (ving Qe: | |||
ge (sprek Q@ // in compounds | |||
@@ -518,6 +519,7 @@ | |||
&) iko (_ =iko: | |||
fam) i (lie 'i | |||
_) in (C@P2 'In | |||
_) in (a@P2 'In | |||
_) ing (eC_ IN // bewerkingen | |||
_) in (do In | |||
_) in (forma In |
@@ -140,7 +140,8 @@ _⁃ odRa:Zka||'v||tvaRe||p'oml-tSki | |||
£ libRa | |||
¤ mena | |||
© kopiRajt | |||
® Registrovane: | |||
® RegistRovane: | |||
¶ 'oznatSenie||'odseku | |||
¥ jen | |||
− mi:nus | |||
± plus||m'i:nus |
@@ -206,7 +206,7 @@ _1M3 orUko:d.ie: | |||
_dpt _pul.l.i | |||
// drop final [U] when followed by an ordinal suffix | |||
// drop final [U] when followed by an ordinal suffix or thousands | |||
_1o onR | |||
_2o irVn.d. | |||
_3o mu:nR | |||
@@ -239,18 +239,30 @@ _6Co aRUnu:R | |||
_7Co ;ez.Unu:R | |||
_8Co ;en.n.u:R | |||
_#ம் a:m // ordinal suffix | |||
_#ல் il | |||
_#வது a:vVdU | |||
_#வதும் a:vVdUm | |||
_#வதுமாக a:vVdUma:gV | |||
_#ஆம் a:m // including ஆ | |||
_#ஆவது a:vVdU | |||
_#ஆவதும் a:vVdUm | |||
_#ஆவதுமாக a:vVdUma:gV | |||
_#-ம் a:m // ordinal suffix with hyphen | |||
_#-ல் il | |||
_#-வது a:vVdU | |||
_#-வதும் a:vVdUm | |||
_#-வதுமாக a:vVdUma:gV | |||
_#-ஆம் a:m // including ஆ | |||
_#-ஆவது a:vVdU | |||
_#-ஆவதும் a:vVdUm | |||
_#-ஆவதுமாக a:vVdUma:gV | |||
// English words | |||
tamil தமிழ் $text | |||
@@ -387,6 +399,7 @@ tamil தமிழ் $text | |||
பாதிக்காம $alt | |||
பனியா $alt | |||
பாம் $alt | |||
போத $alt | |||
// initial த as [d] | |||
@@ -548,7 +561,6 @@ tamil தமிழ் $text | |||
போன் fo:n | |||
போனில் fo:nil | |||
//பைலை faIlaI | |||
பாதர் fa:dVr | |||
பாதரிடம் fa:dVrid.Vm | |||
பாதருடன் fa:dVrUd.Vn | |||
பாதரில்லாமல் fa:dVrilla:mVl |
@@ -130,6 +130,9 @@ | |||
// endings after போர்ட (board) | |||
.L31 ்_ ிங் ின ை ுக்க ில ும | |||
// words after அர்த்த | |||
.L32 ராத்திரி ஜாம நிசி வேளை | |||
// consonants | |||
@@ -270,7 +273,6 @@ | |||
_) க (ால்ஃப் g | |||
_) கால்ப் ga:lf | |||
_) க (ிஃப்ட g | |||
_) கிட (ார git. | |||
_) க (ிடுகிடு g | |||
_) க (ிண்ணென்ற g | |||
_) க (ின்னஸ g | |||
@@ -601,9 +603,24 @@ _மன்மதக்) க (ுகை g | |||
_) க் (ளாஸ்_ g | |||
_) க்வ (A kw | |||
_) க் (வாலியர g | |||
_) க (ுட்கா g | |||
_) கோவர்த்த go:vVrddV# | |||
_) கோர்க (ாலாந்த go:rk | |||
_) குருமுக (ி gurumuk | |||
_) க (ோஸ்வாமி g | |||
_) க (ோசுவாமி g | |||
_) க (ிடார் g | |||
_) க (ிடாரை g | |||
_) க (ிடாரில g | |||
_) க (ிடாரின g | |||
_) க (ிடாரிட g | |||
//endsort | |||
//sort | |||
_முட்) க (டிகார gV | |||
_தமிழ்) க (ூற k | |||
_து) க (ாராம k | |||
_நாகர்) க (ோவில k | |||
_கோபி) க kV# | |||
_ஸ்டா) க kV# | |||
_ஜமாய்) க kV# | |||
@@ -1351,6 +1368,12 @@ _வெனி) ச (ுவேல z | |||
_) ச (ௌஹான tS | |||
_ந) ச் (னு tS | |||
_கா) ச்மூச tSmu:tSV# | |||
அ) சு (வமேத s | |||
அ) சோக (் s.o:k | |||
_பாஸ்கரா) ச (ாரி tS | |||
_பரமா) ச (ாரி tS | |||
_மி) ச (ோராம z | |||
_) சு (வாதி s | |||
//endsort | |||
@@ -1785,6 +1808,8 @@ _நடுரோ) ட் (ல t. | |||
அ) ட்லாண்ட t.la:n.t.V# // atlant | |||
_) ட்விங்க (ிள t.wiNk | |||
_) ட்வ (ிட்டர t.w | |||
_ஸ்) டி (ரைக் t. | |||
_) ட (ூல t. | |||
//endsort | |||
@@ -2205,9 +2230,13 @@ _) தீர்க்க (_சுமங்கலி di:rggV | |||
_) த (ோஹா d | |||
_) தௌலதாப (ாத daUlVd.a:b | |||
_) த (்ராட்சை d | |||
_) த (ாவீத d | |||
_) த (ுரியானந்த d | |||
_) த (ாவூத d | |||
//endsort | |||
//sort | |||
_அர்) த்த (_L32 ddV# | |||
_நிசப்) த dV# | |||
அனந்) த tV# | |||
_வசந்) த tV# | |||
@@ -3602,9 +3631,48 @@ _பெனசீர்_) ப (ுட்டோ b | |||
_) ப் (ளூஸ b | |||
_) ப் (ளோரிடா f | |||
_) ப் (ளௌஸ b | |||
_) புத்த (கய buddV | |||
_) பாப (ுஜி ba:p | |||
_) பிக (ார biH | |||
_) ப (ிஹார b | |||
_) ப (வ்விய bV | |||
_) பி (ளட் b | |||
L03) ப்ப (ூதகண bb | |||
L03) ப்ப (ூதங்கள bb | |||
_) புளூடூத் bl.u:t.u:T | |||
_) ப்ளூடூத் bl.u:t.u:T | |||
_) பி (ரவுன b | |||
_) ப் (ரவுன b | |||
_) ப (ட்டாச்சாரி bV | |||
_) ப (ிசினச b | |||
_) ப (ிசினெச b | |||
_) ப (ூசுக்த b | |||
_) ப (ேலூர b | |||
_) பி (ரஷர p | |||
_) பி (ரத்தியட்ச p | |||
_) பி (ரத்தியக்ஷ p | |||
_) ப (ோதத் b | |||
_) ப (ோதங்கள b | |||
_ஜுகல்_) ப (ந்தி bV | |||
_) புத்த (ியக்க putt | |||
_) ப (ாணம b | |||
_) ப (ாணத்த b | |||
//endsort | |||
//sort | |||
_சுக) ப (ோக_ b | |||
_க) ப (ளீகர bV | |||
_ஜா) ப (ர fV | |||
_முரண்) ப (ாட p | |||
_வழி) ப (ார் p | |||
_வழி) ப (ோட p | |||
_பழி) ப (ோட p | |||
_துர்) ப்ப (ுத்தி bb | |||
அவிர்) ப்ப (ாக bb | |||
L03) ப்பி (ரேத pp | |||
L03) ப்பி (ரதே pp | |||
_துண்டு) ப்பி (ரசுர pp | |||
_கை) ப்பி (ரசுர pp | |||
_நீர்) ப pV# | |||
_ப்ரூ) ப fV# | |||
இடர்) ப pV# | |||
@@ -4405,7 +4473,7 @@ _சந்தேக) ப்ப (ுத்தி bb | |||
_) வி (யா v | |||
வி (யூக v | |||
இண்டர்) வி (யூ v | |||
L03வ்) வி (யா v | |||
.group ஶ | |||
ஶ SV | |||
@@ -4427,6 +4495,7 @@ _சந்தேக) ப்ப (ுத்தி bb | |||
_ம) ஸ்த (ூர zd | |||
அரி) ஸ (ோன z | |||
_சூய) ஸ zV# | |||
_ஹி) ஸ்ப (ுல்லா zb | |||
.group ஹ | |||
ஹ HV | |||
@@ -4527,6 +4596,8 @@ _சந்தேக) ப்ப (ுத்தி bb | |||
இலேக்க (ிய le:gg | |||
இ (லேச | |||
இ (லையோலா | |||
இ (ராத்_ | |||
இ (ராப்பகல | |||
//endsort | |||
.group உ |
@@ -1,5 +1,5 @@ | |||
91 phoneme tables | |||
93 phoneme tables | |||
new total | |||
base 109 109 | |||
consonants 11 119 | |||
@@ -22,7 +22,7 @@ consonants 11 119 | |||
et 40 135 | |||
fr 64 146 | |||
fr-ca 11 146 | |||
nl 35 130 | |||
nl 37 131 | |||
hi 58 149 | |||
bn 12 152 | |||
ne 18 157 | |||
@@ -30,7 +30,7 @@ consonants 11 119 | |||
pa 15 151 | |||
ta 24 153 | |||
kn 17 149 | |||
ml 27 152 | |||
ml 30 152 | |||
hu 25 124 | |||
lt 44 139 | |||
lv 29 127 | |||
@@ -47,7 +47,7 @@ consonants 11 119 | |||
es 15 125 | |||
es-la 1 125 | |||
ca 11 127 | |||
an 4 125 | |||
an 5 126 | |||
pt 29 140 | |||
pt-pt 20 140 | |||
ro 36 148 | |||
@@ -85,6 +85,8 @@ consonants 11 119 | |||
si 24 155 | |||
gu 1 149 | |||
as 12 152 | |||
or 12 152 | |||
mni 11 152 | |||
tn 27 121 | |||
mt 32 129 | |||
bo 10 153 | |||
@@ -1090,11 +1092,15 @@ ustop/ts2 [ts] lv | |||
ustop/tsh [tS] base | |||
[tS#] bn | |||
[c] zhy | |||
[tS#] or | |||
[tS#] mni | |||
[tS] tn | |||
ustop/tsh_ [tS] base | |||
[c] hi | |||
[tS#] bn | |||
[c] zhy | |||
[tS#] or | |||
[tS#] mni | |||
[tS] tn | |||
ustop/tsh2 [tS] hr | |||
[dZ] hr | |||
@@ -1112,6 +1118,8 @@ ustop/tsh_unasp [c] hi | |||
[tS] hy | |||
[tS`] am | |||
ustop/tsh_unasp2 [tS] bn | |||
[tS] or | |||
[tS] mni | |||
ustop/ts_pzd [tS;] base | |||
[J#] hi | |||
[J#] ml | |||
@@ -1637,6 +1645,8 @@ vowel/@_2 [@:] vi | |||
[V] tt | |||
vowel/&_2 [&] bn | |||
[&] as | |||
[&] or | |||
[&] mni | |||
vowel/@_3 [@#] en | |||
[@] en-sc | |||
[I] en-sc | |||
@@ -1731,6 +1741,8 @@ vowel/a#_2 [A] nl | |||
[a] nso | |||
[a] te | |||
[a] si | |||
[a] or | |||
[a] mni | |||
vowel/a_3 [a] en-sc | |||
[a/] en-sc | |||
[A:] en-sc | |||
@@ -1749,6 +1761,8 @@ vowel/a_3 [a] en-sc | |||
[a] ka | |||
[a:] si | |||
[a] as | |||
[a] or | |||
[a] mni | |||
vowel/a#_3 [a#] en | |||
[a#] en-n | |||
[a#] en-us | |||
@@ -1888,6 +1902,8 @@ vowel/e [e] base | |||
[e:] dv | |||
[e:] te | |||
[e] as | |||
[e] or | |||
[e] mni | |||
[E] kl | |||
vowel/e# [I] en-sc | |||
[e] et | |||
@@ -2107,6 +2123,8 @@ vowel/i_6 [i] bn | |||
[i] te | |||
[i] si | |||
[i] as | |||
[i] or | |||
[i] mni | |||
vowel/i#_6 [i.] zh | |||
vowel/i_7 [i:] et | |||
[i] pl | |||
@@ -2246,6 +2264,8 @@ vowel/o [o] base2 | |||
[o] te | |||
[o:] te | |||
[o] as | |||
[o] or | |||
[o] mni | |||
[o] bo | |||
[o] kl | |||
vowel/o_2 [o:] cy | |||
@@ -2363,6 +2383,8 @@ vowel/oo_5 [O] bn | |||
[O] is | |||
[O] sq | |||
[O] as | |||
[O] or | |||
[O] mni | |||
vowel/oo_en [O] en | |||
[O:] en | |||
[O@] en | |||
@@ -2405,6 +2427,8 @@ vowel/u [u] base | |||
[u] ak | |||
[u:] wo | |||
[u] as | |||
[u] or | |||
[u] mni | |||
[u] bo | |||
[u] tt | |||
vowel/u# [u:] en-sc |
@@ -15,6 +15,12 @@ phoneme E | |||
FMT(vowel/ee_1) | |||
endphoneme | |||
phoneme e# | |||
vowel starttype #e endtype #e | |||
length 200 | |||
ChangeIfStressed(e) | |||
ChangePhoneme(NULL) | |||
endphoneme | |||
phoneme O | |||
vowel starttype #o endtype #o |
@@ -286,3 +286,11 @@ phoneme z | |||
CALL base/z | |||
endphoneme | |||
phoneme l | |||
import_phoneme en/l | |||
endphoneme | |||
phoneme x2 | |||
import_phoneme af/x2 | |||
endphoneme |
@@ -359,11 +359,13 @@ phoneme t | |||
Vowelin f1=0 f2=1700 -300 300 f3=-100 80 | |||
Vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20 | |||
IF nextPhW(isVowel) AND nextPh(isUnstressed) AND NOT next2PhW(n) THEN | |||
IF prevPhW(isVowel) THEN | |||
ChangePhoneme(t#) | |||
ELIF prevPhW(n) THEN | |||
WAV(ustop/t, 60) | |||
IF nextPhW(isVowel) AND nextPh(isUnstressed) THEN | |||
IF NOT next2PhW(n) OR nextPhW(3:) THEN | |||
IF prevPhW(isVowel) AND NOT prevPhW(aI@) THEN | |||
ChangePhoneme(t#) | |||
ELIF prevPhW(n) THEN | |||
WAV(ustop/t, 60) | |||
ENDIF | |||
ENDIF | |||
ENDIF | |||
@@ -277,3 +277,44 @@ phoneme g# | |||
endphoneme | |||
// suggested by Prasenjit Sen, but perhaps not needed? | |||
// ml_rules changes [p], [t], [k] to [b], [d], [g] in non-initial | |||
// positions | |||
phoneme p | |||
import_phoneme consonants/p- | |||
voicingswitch b | |||
IF thisPh(isWordStart) THEN | |||
CALL base/p | |||
ELIF thisPh(isWordEnd) AND NOT thisPh(isFirstVowel) THEN | |||
ChangePhoneme(b) | |||
ENDIF | |||
endphoneme | |||
phoneme t | |||
import_phoneme base/t[ | |||
voicingswitch d | |||
IF thisPh(isWordStart) THEN | |||
CALL base/t | |||
ELIF thisPh(isWordEnd) AND NOT thisPh(isFirstVowel) THEN | |||
ChangePhoneme(d) | |||
ENDIF | |||
endphoneme | |||
phoneme k | |||
import_phoneme consonants/k- | |||
voicingswitch g | |||
IF thisPh(isWordStart) THEN | |||
CALL base/k | |||
ELIF thisPh(isWordEnd) AND NOT thisPh(isFirstVowel) THEN | |||
ChangePhoneme(g) | |||
ENDIF | |||
endphoneme | |||
@@ -1934,6 +1934,11 @@ include ph_gujarati | |||
phonemetable as bn | |||
include ph_assamese | |||
phonemetable or bn | |||
include ph_oriya | |||
phonemetable mni bn | |||
include ph_manipuri | |||
@@ -990,6 +990,10 @@ static wxString CompileAllDictionaries() | |||
sprintf(fname_log,"%s%s",path_dsource,"dict_log"); | |||
log = fopen(fname_log,"w"); | |||
if(log != 0) | |||
{ | |||
fprintf(log, "%s", utf8_bom); | |||
} | |||
sprintf(fname_log,"%s%s",path_dsource,"dict_phonemes"); | |||
f_phused = fopen(fname_log,"w"); | |||
@@ -2407,6 +2411,9 @@ int CompileIf(int elif) | |||
else | |||
{ | |||
error("Unexpected keyword '%s'",item_string); | |||
if((strcmp(item_string, "phoneme") == 0) || (strcmp(item_string, "endphoneme") == 0)) | |||
return(-1); | |||
} | |||
// output the word |
@@ -425,7 +425,8 @@ static int compile_line(char *linebuf, char *dict_line, int *hash) | |||
char *mnemptr; | |||
unsigned char flag_codes[100]; | |||
char encoded_ph[200]; | |||
unsigned char bad_phoneme[4]; | |||
char bad_phoneme_str[4]; | |||
int bad_phoneme; | |||
static char nullstring[] = {0}; | |||
text_not_phonemes = 0; | |||
@@ -660,17 +661,18 @@ static int compile_line(char *linebuf, char *dict_line, int *hash) | |||
} | |||
else | |||
{ | |||
EncodePhonemes(phonetic,encoded_ph,bad_phoneme); | |||
EncodePhonemes(phonetic,encoded_ph,&bad_phoneme); | |||
if(strchr(encoded_ph,phonSWITCH) != 0) | |||
{ | |||
flag_codes[n_flag_codes++] = BITNUM_FLAG_ONLY_S; // don't match on suffixes (except 's') when switching languages | |||
} | |||
// check for errors in the phonemes codes | |||
if(bad_phoneme[0] != 0) | |||
if(bad_phoneme != 0) | |||
{ | |||
// unrecognised phoneme, report error | |||
fprintf(f_log,"%5d: Bad phoneme [%c] (0x%x) in: %s %s\n",linenum,bad_phoneme[0],bad_phoneme[0],word,phonetic); | |||
bad_phoneme_str[utf8_out(bad_phoneme, bad_phoneme_str)] = 0; | |||
fprintf(f_log,"%5d: Bad phoneme [%s] (U+%x) in: %s %s\n",linenum,bad_phoneme_str,bad_phoneme,word,phonetic); | |||
error_count++; | |||
} | |||
} | |||
@@ -1194,7 +1196,8 @@ static char *compile_rule(char *input) | |||
int finish=0; | |||
char buf[80]; | |||
char output[150]; | |||
unsigned char bad_phoneme[4]; | |||
int bad_phoneme; | |||
char bad_phoneme_str[4]; | |||
buf[0]=0; | |||
rule_cond[0]=0; | |||
@@ -1272,10 +1275,11 @@ static char *compile_rule(char *input) | |||
return(NULL); | |||
} | |||
EncodePhonemes(rule_phonemes,buf,bad_phoneme); | |||
if(bad_phoneme[0] != 0) | |||
EncodePhonemes(rule_phonemes,buf,&bad_phoneme); | |||
if(bad_phoneme != 0) | |||
{ | |||
fprintf(f_log,"%5d: Bad phoneme [%c] in %s\n",linenum,bad_phoneme[0],input); | |||
bad_phoneme_str[utf8_out(bad_phoneme, bad_phoneme_str)] = 0; | |||
fprintf(f_log,"%5d: Bad phoneme [%s] (U+%x) in: %s\n",linenum,bad_phoneme_str,bad_phoneme,input); | |||
error_count++; | |||
} | |||
strcpy(output,buf); |
@@ -347,8 +347,8 @@ int HashDictionary(const char *string) | |||
const char *EncodePhonemes(const char *p, char *outptr, unsigned char *bad_phoneme) | |||
/***************************************************************************/ | |||
const char *EncodePhonemes(const char *p, char *outptr, int *bad_phoneme) | |||
/******************************************************************/ | |||
/* Translate a phoneme string from ascii mnemonics to internal phoneme numbers, | |||
from 'p' up to next blank . | |||
Returns advanced 'p' | |||
@@ -365,7 +365,7 @@ const char *EncodePhonemes(const char *p, char *outptr, unsigned char *bad_phone | |||
unsigned int mnemonic_word; | |||
if(bad_phoneme != NULL) | |||
bad_phoneme[0] = 0; | |||
*bad_phoneme = 0; | |||
// skip initial blanks | |||
while(isspace(*p)) | |||
@@ -427,8 +427,7 @@ const char *EncodePhonemes(const char *p, char *outptr, unsigned char *bad_phone | |||
// not recognised, report and ignore | |||
if(bad_phoneme != NULL) | |||
{ | |||
bad_phoneme[0] = *p; | |||
bad_phoneme[1] = 0; | |||
utf8_in(bad_phoneme, p); | |||
} | |||
*outptr++ = 0; | |||
return(p+1); |
@@ -726,6 +726,7 @@ void MyFrame::OnTools(wxCommandEvent& event) | |||
int debug_flag=0; | |||
char fname_log[sizeof(path_dsource)+12]; | |||
char err_fname[sizeof(path_home)+15]; | |||
static const char utf8_bom[] = {0xef,0xbb,0xbf,0}; | |||
switch(event.GetId()) | |||
{ | |||
@@ -776,6 +777,10 @@ void MyFrame::OnTools(wxCommandEvent& event) | |||
case MENU_COMPILE_DICT: | |||
sprintf(fname_log,"%s%s",path_dsource,"dict_log"); | |||
log = fopen(fname_log,"w"); | |||
if(log != NULL) | |||
{ | |||
fprintf(log, "%s", utf8_bom); | |||
} | |||
LoadDictionary(translator, translator->dictionary_name, 0); | |||
if((err = CompileDictionary(path_dsource,translator->dictionary_name,log,err_fname,debug_flag)) < 0) |
@@ -24,7 +24,9 @@ | |||
//<includes | |||
#ifndef PLATFORM_WINDOWS | |||
#include <unistd.h> | |||
#endif | |||
#include <assert.h> | |||
#include <string.h> | |||
#include <stdlib.h> | |||
@@ -48,6 +50,7 @@ static sem_t my_sem_stop_is_required; | |||
static sem_t my_sem_stop_is_acknowledged; | |||
// my_thread: polls the audio duration and compares it to the duration of the first event. | |||
static pthread_t my_thread; | |||
static bool thread_inited; | |||
static t_espeak_callback* my_callback = NULL; | |||
static int my_event_is_running=0; | |||
@@ -95,16 +98,16 @@ void event_init(void) | |||
assert(-1 != sem_init(&my_sem_stop_is_acknowledged, 0, 0)); | |||
pthread_attr_t a_attrib; | |||
if (pthread_attr_init (& a_attrib) | |||
|| pthread_attr_setdetachstate(&a_attrib, PTHREAD_CREATE_JOINABLE) | |||
|| pthread_create( &my_thread, | |||
& a_attrib, | |||
polling_thread, | |||
(void*)NULL)) | |||
{ | |||
assert(0); | |||
} | |||
if (pthread_attr_init (&a_attrib) == 0 | |||
&& pthread_attr_setdetachstate(&a_attrib, PTHREAD_CREATE_JOINABLE) == 0) | |||
{ | |||
thread_inited = (0 == pthread_create(&my_thread, | |||
&a_attrib, | |||
polling_thread, | |||
(void*)NULL)); | |||
} | |||
assert(thread_inited); | |||
pthread_attr_destroy(&a_attrib); | |||
} | |||
//> | |||
@@ -127,7 +130,10 @@ ENTER("event_display"); | |||
"MARK", | |||
"PLAY", | |||
"END", | |||
"MSG_TERMINATED" | |||
"MSG_TERMINATED", | |||
"PHONEME", | |||
"SAMPLERATE", | |||
"??" | |||
}; | |||
SHOW("event_display > event=0x%x\n",event); | |||
@@ -712,7 +718,7 @@ void event_terminate() | |||
{ | |||
ENTER("event_terminate"); | |||
if (my_thread) | |||
if (thread_inited) | |||
{ | |||
pthread_cancel(my_thread); | |||
pthread_join(my_thread,NULL); | |||
@@ -721,6 +727,7 @@ ENTER("event_terminate"); | |||
sem_destroy(&my_sem_stop_is_required); | |||
sem_destroy(&my_sem_stop_is_acknowledged); | |||
init(); // purge event | |||
thread_inited = 0; | |||
} | |||
} | |||
@@ -24,7 +24,9 @@ | |||
//<includes | |||
#ifndef PLATFORM_WINDOWS | |||
#include <unistd.h> | |||
#endif | |||
#include <assert.h> | |||
#include <string.h> | |||
#include <stdlib.h> |
@@ -1506,7 +1506,10 @@ static int LookupNum2(Translator *tr, int value, const int control, char *ph_out | |||
else | |||
{ | |||
// followed by hundreds or thousands etc | |||
sprintf(string,"_%da",value); | |||
if(tr->langopts.numbers2 & NUM2_ORDINAL_AND_THOUSANDS) | |||
sprintf(string, "_%do", value); | |||
else | |||
sprintf(string, "_%da", value); | |||
found = Lookup(tr, string, ph_digits); | |||
} | |||
@@ -1612,7 +1615,10 @@ static int LookupNum2(Translator *tr, int value, const int control, char *ph_out | |||
else if(((control & 2) == 0) || ((tr->langopts.numbers & NUM_SWAP_TENS) != 0)) | |||
{ | |||
// followed by hundreds or thousands (or tens) | |||
sprintf(string,"_%da",units); | |||
if(tr->langopts.numbers2 & NUM2_ORDINAL_AND_THOUSANDS) | |||
sprintf(string, "_%do", units); | |||
else | |||
sprintf(string, "_%da", units); | |||
found = Lookup(tr, string, ph_digits); | |||
} | |||
} |
@@ -49,7 +49,7 @@ | |||
#define phSINGLE_INSTN 0x1000 // this phoneme has a single instruction program, with an implicit Return | |||
#define phBRKAFTER 0x4000 // [*] add a post-pause | |||
#define phNONSYLLABIC 0x100000 // don't count this vowel as a syllable when finding the stress position | |||
#define phNONSYLLABIC 0x100000 // don't count this vowel as a syllable when finding the stress position | |||
#define phLONG 0x200000 | |||
#define phLENGTHENSTOP 0x400000 // make the pre-pause slightly longer | |||
#define phRHOTIC 0x800000 // bit 23 | |||
@@ -113,7 +113,7 @@ typedef struct { | |||
unsigned char end_type; | |||
unsigned char std_length; // for vowels, in mS/2; for phSTRESS phonemes, this is the stress/tone type | |||
unsigned char length_mod; // a length_mod group number, used to access length_mod_tab | |||
} PHONEME_TAB; | |||
@@ -155,13 +155,13 @@ typedef struct { | |||
#define PH(c1,c2) (c2<<8)+c1 // combine two characters into an integer for phoneme name | |||
#define PH(c1,c2) (c2<<8)+c1 // combine two characters into an integer for phoneme name | |||
#define PH3(c1,c2,c3) (c3<<16)+(c2<<8)+c1 | |||
#define PhonemeCode2(c1,c2) PhonemeCode((c2<<8)+c1) | |||
int LookupPhonemeString(const char *string); | |||
int PhonemeCode(unsigned int mnem); | |||
const char *EncodePhonemes(const char *p, char *outptr, unsigned char *bad_phoneme); | |||
const char *EncodePhonemes(const char *p, char *outptr, int *bad_phoneme); | |||
void DecodePhonemes(const char *inptr, char *outptr); | |||
extern const char *WordToString(unsigned int word); |
@@ -31,7 +31,12 @@ | |||
#include "speech.h" | |||
#include <sys/stat.h> | |||
#ifndef PLATFORM_WINDOWS | |||
#ifdef PLATFORM_WINDOWS | |||
#include <fcntl.h> | |||
#include <io.h> | |||
#include <windows.h> | |||
#include <winreg.h> | |||
#else /* PLATFORM_POSIX */ | |||
#include <unistd.h> | |||
#endif | |||
@@ -551,7 +556,11 @@ static const char* label[] = { | |||
"SENTENCE", | |||
"MARK", | |||
"PLAY", | |||
"END"}; | |||
"END", | |||
"MSG_TERMINATED", | |||
"PHONEME", | |||
"SAMPLERATE", | |||
"??" }; | |||
#endif | |||
@@ -35,7 +35,7 @@ | |||
#include "translate.h" | |||
#include "wave.h" | |||
const char *version_string = "1.47.12 23.Sep.13"; | |||
const char *version_string = "1.47.13 22.Oct.13"; | |||
const int version_phdata = 0x014709; | |||
int option_device_number = -1; |
@@ -1482,6 +1482,7 @@ SetLengthMods(tr,3); // all equal | |||
SetupTranslator(tr,stress_lengths_ta, NULL); | |||
tr->letter_bits_offset = OFFSET_TAMIL; | |||
tr->langopts.numbers = NUM_OMIT_1_THOUSAND ; | |||
tr->langopts.numbers2 = NUM2_ORDINAL_AND_THOUSANDS; | |||
tr->langopts.param[LOPT_WORD_MERGE] = 1; // don't break vowels betwen words | |||
} | |||
else | |||
@@ -1578,6 +1579,7 @@ SetLengthMods(tr,3); // all equal | |||
break; | |||
case L('u','r'): // Urdu | |||
case L('s','d'): // Sindhi | |||
{ | |||
tr->letter_bits_offset = OFFSET_ARABIC; | |||
tr->langopts.param[LOPT_UNPRONOUNCABLE] = 1; // disable check for unpronouncable words |
@@ -1310,7 +1310,7 @@ if(end_type & SUFX_UNPRON) | |||
prefix_flags = 1; | |||
if(found == 0) | |||
{ | |||
end_type = TranslateRules(tr, wordx, phonemes, N_WORD_PHONEMES, end_phonemes, 0, dictionary_flags); | |||
end_type = TranslateRules(tr, wordx, phonemes, N_WORD_PHONEMES, end_phonemes, wflags & FLAG_HYPHEN_AFTER, dictionary_flags); | |||
if(phonemes[0] == phonSWITCH) | |||
{ | |||
@@ -1768,7 +1768,7 @@ static int TranslateWord2(Translator *tr, char *word, WORD_TAB *wtab, int pre_pa | |||
int ix; | |||
int sylimit; // max. number of syllables in a word to be combined with a preceding preposition | |||
const char *new_language; | |||
unsigned char bad_phoneme[4]; | |||
int bad_phoneme; | |||
int word_flags; | |||
int word_copy_len; | |||
char word_copy[N_WORD_BYTES+1]; | |||
@@ -1874,7 +1874,7 @@ static int TranslateWord2(Translator *tr, char *word, WORD_TAB *wtab, int pre_pa | |||
} | |||
else | |||
{ | |||
EncodePhonemes(word,word_phonemes,bad_phoneme); | |||
EncodePhonemes(word,word_phonemes,&bad_phoneme); | |||
} | |||
flags = FLAG_FOUND; | |||
} |
@@ -511,6 +511,7 @@ typedef struct { | |||
#define NUM2_ENGLISH_NUMERALS 0x8000 | |||
#define NUM2_PERCENT_BEFORE 0x10000 | |||
#define NUM2_OMIT_1_HUNDRED_ONLY 0x20000 | |||
#define NUM2_ORDINAL_AND_THOUSANDS 0x40000 | |||
// bits 1-4 use variant form of numbers before thousands,millions,etc. | |||
// bits 6-8 use different forms of thousand, million, etc (M MA MB) | |||
// bit9=(LANG=rw) say "thousand" and "million" before its number, not after | |||
@@ -521,6 +522,7 @@ typedef struct { | |||
// bit15=(LANG=ne) speak (non-replaced) English numerals in English | |||
// bit16=(LANG=si) say "%" before the number | |||
// bit17=(LANG=ml) omit "one" before hundred only if there are no previous digits | |||
// bit18=(LANG=ta) same variant for ordinals and thousands (#o = #a) | |||
int numbers2; | |||
#define BREAK_THOUSANDS 0x49249248 |
@@ -32,7 +32,9 @@ | |||
#include <time.h> | |||
#include "portaudio.h" | |||
#ifndef PLATFORM_WINDOWS | |||
#ifdef PLATFORM_WINDOWS | |||
#include <windows.h> | |||
#else | |||
#include <unistd.h> | |||
#endif | |||
#include "wave.h" | |||
@@ -40,6 +42,15 @@ | |||
//<Definitions | |||
#ifdef NEED_STRUCT_TIMESPEC | |||
#define HAVE_STRUCT_TIMESPEC 1 | |||
struct timespec { | |||
long tv_sec; | |||
long tv_nsec; | |||
}; | |||
#endif /* HAVE_STRUCT_TIMESPEC */ | |||
enum {ONE_BILLION=1000000000}; | |||
#ifdef USE_PORTAUDIO | |||
@@ -53,8 +64,8 @@ enum {ONE_BILLION=1000000000}; | |||
#endif | |||
#ifdef USE_PULSEAUDIO | |||
// create some wrappers for runtime detection | |||
@@ -203,8 +214,8 @@ static t_wave_callback* my_callback_is_output_enabled=NULL; | |||
#define BUFFER_LENGTH (MAX_SAMPLE_RATE*2*sizeof(uint16_t)) | |||
//#define THRESHOLD (BUFFER_LENGTH/5) | |||
static char myBuffer[BUFFER_LENGTH]; | |||
static char* myRead=NULL; | |||
static char* myWrite=NULL; | |||
static char* myRead=NULL; | |||
static char* myWrite=NULL; | |||
static int out_channels=1; | |||
static int my_stream_could_start=0; | |||
static int wave_samplerate; | |||
@@ -223,7 +234,7 @@ static PaError pa_init_err=0; | |||
// time measurement | |||
// The read and write position audio stream in the audio stream are measured in ms. | |||
// | |||
// | |||
// * When the stream is opened, myReadPosition and myWritePosition are cleared. | |||
// * myWritePosition is updated in wave_write. | |||
// * myReadPosition is updated in pa_callback (+ sample delay). | |||
@@ -275,12 +286,12 @@ static void start_stream() | |||
PaError err; | |||
SHOW_TIME("start_stream"); | |||
my_stream_could_start=0; | |||
my_stream_could_start=0; | |||
mInCallbackFinishedState = false; | |||
err = Pa_StartStream(pa_stream); | |||
SHOW("start_stream > Pa_StartStream=%d (%s)\n", err, Pa_GetErrorText(err)); | |||
#if USE_PORTAUDIO == 19 | |||
if(err == paStreamIsNotStopped) | |||
{ | |||
@@ -337,7 +348,7 @@ static int pa_callback(void *inputBuffer, void *outputBuffer, | |||
memcpy(outputBuffer, myRead, aUsedMem); | |||
} | |||
char* p = (char*)outputBuffer + aUsedMem; | |||
memset(p, 0, n - aUsedMem); | |||
memset(p, 0, n - aUsedMem); | |||
// myReadPosition += aUsedMem/(out_channels*sizeof(uint16_t)); | |||
myRead = aWrite; | |||
} | |||
@@ -367,7 +378,7 @@ static int pa_callback(void *inputBuffer, void *outputBuffer, | |||
myRead = myBuffer + aRest; | |||
} | |||
else | |||
{ | |||
{ | |||
SHOW_TIME("pa_callback > underflow"); | |||
aResult=1; // paComplete; | |||
@@ -387,7 +398,7 @@ static int pa_callback(void *inputBuffer, void *outputBuffer, | |||
size_t aUsedMem = aTopMem + aRest; | |||
char* p = (char*)outputBuffer + aUsedMem; | |||
memset(p, 0, n - aUsedMem); | |||
memset(p, 0, n - aUsedMem); | |||
// myReadPosition += aUsedMem/(out_channels*sizeof(uint16_t)); | |||
myRead = aWrite; | |||
} | |||
@@ -498,8 +509,8 @@ static int wave_open_sound() | |||
//paClipOff | paDitherOff, | |||
paNoFlag, | |||
pa_callback, (void *)userdata); | |||
SHOW("wave_open_sound > Pa_OpenDefaultStream(1): err=%d (%s)\n",err, Pa_GetErrorText(err)); | |||
SHOW("wave_open_sound > Pa_OpenDefaultStream(1): err=%d (%s)\n",err, Pa_GetErrorText(err)); | |||
if(err == paInvalidChannelCount) | |||
{ | |||
@@ -544,7 +555,7 @@ static int wave_open_sound() | |||
// paClipOff | paDitherOff, | |||
pa_callback, | |||
(void *)userdata); | |||
if ((err!=paNoError) | |||
if ((err!=paNoError) | |||
&& (err!=paInvalidChannelCount)) //err==paUnanticipatedHostError | |||
{ | |||
fprintf(stderr, "wave_open_sound > Pa_OpenStream : err=%d (%s)\n",err,Pa_GetErrorText(err)); | |||
@@ -600,7 +611,7 @@ static void update_output_parameters(int selectedDevice, const PaDeviceInfo *dev | |||
myOutputParameters.channelCount = 1; | |||
myOutputParameters.sampleFormat = paInt16; | |||
// Latency greater than 100ms for avoiding glitches | |||
// Latency greater than 100ms for avoiding glitches | |||
// (e.g. when moving a window in a graphical desktop) | |||
// deviceInfo = Pa_GetDeviceInfo(selectedDevice); | |||
if (deviceInfo) | |||
@@ -654,15 +665,15 @@ static void select_device(const char* the_api) | |||
for( i=0; i<numDevices; i++ ) | |||
{ | |||
deviceInfo = Pa_GetDeviceInfo( i ); | |||
if (deviceInfo == NULL) | |||
{ | |||
break; | |||
} | |||
const PaHostApiInfo *hostInfo = Pa_GetHostApiInfo( deviceInfo->hostApi ); | |||
if (hostInfo && hostInfo->type == paALSA) | |||
{ | |||
{ | |||
// Check (once) the default output device | |||
if (defaultAlsaIndex == numDevices) | |||
{ | |||
@@ -671,23 +682,23 @@ static void select_device(const char* the_api) | |||
update_output_parameters(defaultAlsaIndex, deviceInfo); | |||
if (Pa_IsFormatSupported(NULL, &myOutputParameters, wave_samplerate) == 0) | |||
{ | |||
SHOW( "select_device > ALSA (default), name=%s (#%d)\n", deviceInfo->name, defaultAlsaIndex); | |||
SHOW( "select_device > ALSA (default), name=%s (#%d)\n", deviceInfo->name, defaultAlsaIndex); | |||
selectedIndex = defaultAlsaIndex; | |||
selectedDeviceInfo = deviceInfo; | |||
break; | |||
} | |||
} | |||
// if the default output device does not match, | |||
// look for the device with the highest number of output channels | |||
// if the default output device does not match, | |||
// look for the device with the highest number of output channels | |||
SHOW( "select_device > ALSA, i=%d (numDevices=%d)\n", i, numDevices); | |||
update_output_parameters(i, deviceInfo); | |||
if (Pa_IsFormatSupported(NULL, &myOutputParameters, wave_samplerate) == 0) | |||
{ | |||
SHOW( "select_device > ALSA, name=%s (#%d)\n", deviceInfo->name, i); | |||
if (!selectedDeviceInfo | |||
|| (selectedDeviceInfo->maxOutputChannels < deviceInfo->maxOutputChannels)) | |||
{ | |||
@@ -703,14 +714,14 @@ static void select_device(const char* the_api) | |||
{ | |||
update_output_parameters(selectedIndex, selectedDeviceInfo); | |||
} | |||
else | |||
else | |||
{ | |||
i = Pa_GetDefaultOutputDevice(); | |||
deviceInfo = Pa_GetDeviceInfo( i ); | |||
update_output_parameters(i, deviceInfo); | |||
} | |||
#endif | |||
#endif | |||
} | |||
//> | |||
@@ -798,18 +809,18 @@ void* wave_open(const char* the_api) | |||
//<copyBuffer | |||
static size_t copyBuffer(char* dest, char* src, const size_t theSizeInBytes) | |||
{ | |||
static size_t copyBuffer(char* dest, char* src, const size_t theSizeInBytes) | |||
{ | |||
size_t bytes_written = 0; | |||
unsigned int i = 0; | |||
uint16_t* a_dest = NULL; | |||
uint16_t* a_src = NULL; | |||
if ((src != NULL) && dest != NULL) | |||
{ | |||
{ | |||
// copy for one channel (mono)? | |||
if(out_channels==1) | |||
{ | |||
{ | |||
SHOW("copyBuffer > 1 channel > memcpy %x (%d bytes)\n", (int)myWrite, theSizeInBytes); | |||
memcpy(dest, src, theSizeInBytes); | |||
bytes_written = theSizeInBytes; | |||
@@ -820,7 +831,7 @@ static size_t copyBuffer(char* dest, char* src, const size_t theSizeInBytes) | |||
i = 0; | |||
a_dest = (uint16_t* )dest; | |||
a_src = (uint16_t* )src; | |||
for(i=0; i<theSizeInBytes/2; i++) | |||
{ | |||
a_dest[2*i] = a_src[i]; | |||
@@ -829,8 +840,8 @@ static size_t copyBuffer(char* dest, char* src, const size_t theSizeInBytes) | |||
bytes_written = 2*theSizeInBytes; | |||
} // end if(out_channels==1) | |||
} // end if ((src != NULL) && dest != NULL) | |||
return bytes_written; | |||
return bytes_written; | |||
} | |||
//> | |||
@@ -843,7 +854,7 @@ size_t wave_write(void* theHandler, char* theMono16BitsWaveBuffer, size_t theSiz | |||
// space in ringbuffer for the sample needed: 1x mono channel but 2x for 1 stereo channel | |||
size_t bytes_to_write = (out_channels==1) ? theSize : theSize*2; | |||
my_stream_could_start = 0; | |||
if(pa_stream == NULL) | |||
{ | |||
SHOW_TIME("wave_write > wave_open_sound\n"); | |||
@@ -859,16 +870,16 @@ size_t wave_write(void* theHandler, char* theMono16BitsWaveBuffer, size_t theSiz | |||
my_stream_could_start = 1; | |||
} | |||
assert(BUFFER_LENGTH >= bytes_to_write); | |||
if (myWrite >= myBuffer + BUFFER_LENGTH) | |||
{ | |||
myWrite = myBuffer; | |||
} // end if (myWrite >= myBuffer + BUFFER_LENGTH) | |||
size_t aTotalFreeMem=0; | |||
char* aRead = myRead; | |||
SHOW("wave_write > aRead=%x, myWrite=%x\n", (int)aRead, (int)myWrite); | |||
while (1) | |||
{ | |||
if (my_callback_is_output_enabled && (0==my_callback_is_output_enabled())) | |||
@@ -876,9 +887,9 @@ size_t wave_write(void* theHandler, char* theMono16BitsWaveBuffer, size_t theSiz | |||
SHOW_TIME("wave_write > my_callback_is_output_enabled: no!"); | |||
return 0; | |||
} | |||
aRead = myRead; | |||
// write pointer is before read pointer? | |||
if (myWrite >= aRead) | |||
{ | |||
@@ -888,27 +899,27 @@ size_t wave_write(void* theHandler, char* theMono16BitsWaveBuffer, size_t theSiz | |||
{ | |||
aTotalFreeMem = aRead - myWrite; | |||
} // end if (myWrite >= aRead) | |||
if (aTotalFreeMem>1) | |||
{ | |||
// -1 because myWrite must be different of aRead | |||
// otherwise buffer would be considered as empty | |||
aTotalFreeMem -= 1; | |||
} // end if (aTotalFreeMem>1) | |||
if (aTotalFreeMem >= bytes_to_write) | |||
{ | |||
break; | |||
} // end if (aTotalFreeMem >= bytes_to_write) | |||
//SHOW_TIME("wave_write > wait"); | |||
SHOW("wave_write > wait: aTotalFreeMem=%d\n", aTotalFreeMem); | |||
SHOW("wave_write > aRead=%x, myWrite=%x\n", (int)aRead, (int)myWrite); | |||
usleep(10000); | |||
} // end while (1) | |||
aRead = myRead; | |||
// write pointer is ahead the read pointer? | |||
if (myWrite >= aRead) | |||
{ | |||
@@ -945,17 +956,17 @@ size_t wave_write(void* theHandler, char* theMono16BitsWaveBuffer, size_t theSiz | |||
SHOW_TIME("wave_write > myWrite <= aRead"); | |||
myWrite += copyBuffer(myWrite, theMono16BitsWaveBuffer, theSize); | |||
} // end if (myWrite >= aRead) | |||
bytes_written = bytes_to_write; | |||
myWritePosition += theSize/sizeof(uint16_t); // add number of samples | |||
if (my_stream_could_start && (get_used_mem() >= out_channels * sizeof(uint16_t) * FRAMES_PER_BUFFER)) | |||
{ | |||
start_stream(); | |||
} // end if (my_stream_could_start && (get_used_mem() >= out_channels * sizeof(uint16_t) * FRAMES_PER_BUFFER)) | |||
SHOW_TIME("wave_write > LEAVE"); | |||
return bytes_written; | |||
} | |||
@@ -974,7 +985,7 @@ int wave_close(void* theHandler) | |||
SHOW_TIME("wave_close > LEAVE (NULL stream)"); | |||
return 0; | |||
} | |||
if( Pa_IsStreamStopped( pa_stream ) ) | |||
{ | |||
SHOW_TIME("wave_close > LEAVE (stopped)"); | |||
@@ -986,7 +997,7 @@ int wave_close(void* theHandler) | |||
SHOW_TIME("wave_close > LEAVE (NULL stream)"); | |||
return 0; | |||
} | |||
if( Pa_StreamActive( pa_stream ) == false && mInCallbackFinishedState == false ) | |||
{ | |||
SHOW_TIME("wave_close > LEAVE (not active)"); | |||
@@ -1002,20 +1013,20 @@ int wave_close(void* theHandler) | |||
SHOW_TIME("wave_close > LEAVE (stopStreamCount)"); | |||
return 0; | |||
} | |||
// Comment from Audacity-1.2.4b adapted to the eSpeak context. | |||
// Comment from Audacity-1.2.4b adapted to the eSpeak context. | |||
// | |||
// We got here in one of two ways: | |||
// | |||
// 1. The calling program calls the espeak_Cancel function and we | |||
// therefore want to stop as quickly as possible. | |||
// 1. The calling program calls the espeak_Cancel function and we | |||
// therefore want to stop as quickly as possible. | |||
// So we use AbortStream(). If this is | |||
// the case the portaudio stream is still in the Running state | |||
// (see PortAudio state machine docs). | |||
// | |||
// 2. The callback told PortAudio to stop the stream since it had | |||
// reached the end of the selection. | |||
// The event polling thread discovered this by noticing that | |||
// reached the end of the selection. | |||
// The event polling thread discovered this by noticing that | |||
// wave_is_busy() returned false. | |||
// wave_is_busy() (which calls Pa_GetStreamActive()) will not return | |||
// false until all buffers have finished playing, so we can call | |||
@@ -1030,7 +1041,7 @@ int wave_close(void* theHandler) | |||
// call StopStream if the callback brought us here, and AbortStream | |||
// if the user brought us here. | |||
// | |||
#if (USE_PORTAUDIO == 19) | |||
if (pa_stream) | |||
{ | |||
@@ -1114,14 +1125,14 @@ int wave_is_busy(void* theHandler) | |||
if (pa_stream) | |||
{ | |||
#if USE_PORTAUDIO == 18 | |||
active = Pa_StreamActive(pa_stream) | |||
active = Pa_StreamActive(pa_stream) | |||
&& (mInCallbackFinishedState == false); | |||
#else | |||
active = Pa_IsStreamActive(pa_stream) | |||
&& (mInCallbackFinishedState == false); | |||
#endif | |||
} | |||
SHOW("wave_is_busy: %d\n",active); | |||
@@ -1160,7 +1171,7 @@ int wave_get_remaining_time(uint32_t sample, uint32_t* time) | |||
if (!time || !pa_stream) | |||
{ | |||
SHOW("event get_remaining_time> %s\n","audio device not available"); | |||
SHOW("event get_remaining_time> %s\n","audio device not available"); | |||
return -1; | |||
} | |||
@@ -1246,7 +1257,7 @@ void add_time_in_ms(struct timespec *ts, int time_in_ms) | |||
{ | |||
SHOW("event > add_time_in_ms ns: %d sec %Lu nsec \n", ts->tv_sec, t_ns); | |||
ts->tv_sec += 1; | |||
t_ns -= ONE_BILLION; | |||
t_ns -= ONE_BILLION; | |||
} | |||
ts->tv_nsec = (long int)t_ns; | |||
} |