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; | |||
| } | |||