lang=hr: adjust phonemes [S tS tS; Z dZ dZ;] git-svn-id: https://espeak.svn.sourceforge.net/svnroot/espeak/trunk@173 d46cf337-b52f-0410-862d-fd96e6ae7743master
| @@ -26,7 +26,7 @@ _- b'IndEst@-*,IC | |||
| _! 'aUs_|@-*,u:fe:ts,aIC@n | |||
| _? f@-*'Age:ts,aIC@n | |||
| _' 'apOst@-*,Of | |||
| _" 'anf,y:*UNsts,aIC@n | |||
| _" tsi:t'A:t | |||
| _/ S@-*'Egst@-*IC | |||
| _( kl'am3||_|'aUf | |||
| _) kl'am3||ts'u: | |||
| @@ -288,9 +288,9 @@ w w2 x z Z | |||
| Dictionary ro_dict | |||
| @ @- @I a aI aU e ea | |||
| eI eU i I^ iI o Oa oI | |||
| oU u uI y | |||
| @ @- @I @U a aI aU e | |||
| ea eI eU i I^ iI iU o | |||
| Oa oI oU u uI y | |||
| * *; b c d dZ f g | |||
| h j k l m m; n p | |||
| @@ -360,13 +360,13 @@ t tS v w x z Z | |||
| Dictionary ko_dict | |||
| a aI@ aU@ E e e: i i@3 | |||
| IR ji o O~ u u- U@ V | |||
| y: | |||
| a e E i ji o u u- | |||
| V | |||
| b d dZ g h j k k` | |||
| l m n N p p` r s | |||
| s` t t` tS tS` w | |||
| b c C c` ch d dZ g | |||
| h j J k k` kh l m | |||
| n N p p` ph r s S; | |||
| s` t t` th w | |||
| Dictionary hbs_dict | |||
| @@ -394,8 +394,7 @@ v w x z | |||
| Dictionary rw_dict | |||
| a a# e e# i i# o u | |||
| u# | |||
| a e i o u | |||
| * : b B c d dZ f | |||
| g h j J k l m n | |||
| @@ -875,6 +875,7 @@ dipole daIpoUl | |||
| disconsolate dIsk'0ns@l@t | |||
| disc dIsk // for discs | |||
| disciple dIs'aIp@L | |||
| discourse $1 | |||
| discounted $2 | |||
| disease dIz'i:z | |||
| dishes dISIz | |||
| @@ -891,6 +892,7 @@ domino $1 | |||
| donor doUn3 | |||
| dont doUnt $only | |||
| dose doUs | |||
| dosage doUsIdZ | |||
| dramatic dr@matIk | |||
| drawer drO@ | |||
| drier draI3 | |||
| @@ -1256,7 +1258,6 @@ literature lItrItS3 | |||
| live laIv $onlys | |||
| live lIv $verb | |||
| livestock l'aIvst,0k | |||
| liver lIv3 | |||
| lively laIvlI2 | |||
| llama lA:m@ | |||
| loch l0x | |||
| @@ -1529,6 +1530,7 @@ pirate paIr@t | |||
| piteous pIti@s | |||
| pituitary $2 | |||
| plaguing pleIgIN | |||
| plugin plVgIn | |||
| plunging plVndZIN | |||
| plus plVs | |||
| poky poUkI2 | |||
| @@ -1772,6 +1774,7 @@ sergeant sA@dZ@nt | |||
| settee $2 | |||
| severe sIv'i@3 $only | |||
| severely sIv'i@3lI2 $verbf | |||
| sex sEks // sexism | |||
| several sEvr@L | |||
| shampoo $2 | |||
| sheriff S'ErIf | |||
| @@ -1936,7 +1939,6 @@ tribunal traIb'ju:n@L | |||
| trilogy trIl@dZI2 | |||
| trio tri:oU | |||
| trojan troUdZ@n | |||
| trolley tr0lI2 | |||
| trophy troUfI2 | |||
| truely tru:lI2 $verbf | |||
| truest tru:@st | |||
| @@ -660,7 +660,7 @@ | |||
| ann (eal a2n | |||
| ann (ih a2n | |||
| ann (oun a2n | |||
| ann (oy a2n | |||
| _) ann (oy a2n | |||
| ann (ui a2n | |||
| ann (ul a2n | |||
| ann (un a2n | |||
| @@ -1907,6 +1907,7 @@ | |||
| &) ella (_ 'El@ | |||
| &v) eller (_ @l@ | |||
| @) elli (_ 'ElI2 | |||
| &) elling @lI2N | |||
| &) ell (ous @l | |||
| cib) el (_ El | |||
| xc) el (_ 'El | |||
| @@ -2368,7 +2369,6 @@ | |||
| gg g | |||
| g (e dZ | |||
| _) gaol dZeIl | |||
| g) ged (_ gId | |||
| g (eek g | |||
| geous dZ=@s | |||
| g (E dZ | |||
| @@ -2432,6 +2432,8 @@ | |||
| K) hl L | |||
| &) hold (_$4 hoUld | |||
| holme hoUm | |||
| &) hood (_S4 hUd | |||
| &) hoods (_S5 hUdz | |||
| _) h (our | |||
| _) h (onor | |||
| _) h (onou | |||
| @@ -3106,6 +3108,7 @@ | |||
| XC) iv (el Iv | |||
| _g) iv (e Iv | |||
| _l) iv (e Iv | |||
| l) iv (er Iv | |||
| r) iv (er Iv | |||
| dr) iv (er aIv | |||
| sh) iv (er Iv | |||
| @@ -3563,6 +3566,7 @@ | |||
| y) ol (k oU | |||
| p) oll (u @l | |||
| r) oll oUl | |||
| tr) oll (A 0l | |||
| car) oll @l | |||
| br) oll 0l | |||
| t) oll oUl | |||
| @@ -4248,6 +4252,8 @@ | |||
| rea (C% r,i:@ | |||
| _) rea (dC r,i:@ | |||
| rea (gen rI2eI | |||
| _) re (ali ,ri: | |||
| _) re (all ,ri: | |||
| _) re (au@P2 ,ri: | |||
| re (ck rE | |||
| reckon rEk@n | |||
| @@ -4306,7 +4312,7 @@ | |||
| rea (l ri@ | |||
| ?3 rea (l ri: | |||
| rea (lit rI2a | |||
| rea (lloc rI2a | |||
| _) rea (lloP2 ,ri: | |||
| rea (lm rE | |||
| rea (lte rI20 | |||
| re (ment r@ | |||
| @@ -4492,6 +4498,7 @@ | |||
| _) tele tElI2 | |||
| r) tga (g gI | |||
| &) tia (_ S@ | |||
| &s) tia (_ tS@ | |||
| @) t (ia S | |||
| pi) t (ia t | |||
| is) t (ian+ t | |||
| @@ -4625,7 +4632,6 @@ | |||
| @) u (ctive 'V | |||
| u (guC V | |||
| f) u (gal 'ju: | |||
| pl) ug Vg | |||
| ug (er_ u:g | |||
| s) ugge (st @dZE | |||
| mp) ug (n ju: | |||
| @@ -4896,6 +4902,9 @@ | |||
| y j | |||
| y (C_ I | |||
| y (CC I | |||
| _) y (C@ I | |||
| _) y (n@ V | |||
| _) y (s@ V | |||
| C) y (abl I2 | |||
| y (y | |||
| y (C I | |||
| @@ -68,6 +68,7 @@ | |||
| l l | |||
| K) l (K l- | |||
| lj (+ l^ | |||
| v) lj lj | |||
| .group m | |||
| m m | |||
| @@ -98,7 +99,7 @@ | |||
| rr R | |||
| r (_ R | |||
| K) r (K 'r- | |||
| K) r (K R // ?? | |||
| .group s | |||
| @@ -12,13 +12,15 @@ | |||
| .group a | |||
| a a | |||
| ai aI | |||
| ai (_ 'aI | |||
| ai (a aj | |||
| ai (_ 'aI | |||
| au aU // ?? only at end of word ?? | |||
| c) au (t au | |||
| au (_ 'aU | |||
| a (AAA a | |||
| &) a (_S1q a | |||
| gi) a (_S1q 'a | |||
| gi) a (_S1q a | |||
| V@) a (N_ 'a | |||
| ăi) a (_ 'a | |||
| @) abil (_ 'abil | |||
| @@ -31,6 +33,7 @@ | |||
| ă @ | |||
| ăi (_ @I | |||
| ău @U // ?? only at end of word ?? | |||
| c) ău (t @u | |||
| ău (_ '@U | |||
| @) ăte (_S3t @te | |||
| @) ătă (_S3t @t@ | |||
| @@ -86,6 +89,7 @@ | |||
| @) cnea (_ kne'a | |||
| .group d | |||
| d d | |||
| dd d | |||
| @@ -98,7 +102,9 @@ | |||
| ei (_ eI | |||
| // eu eU // only at end of word ?? | |||
| // eu e[u // ?? | |||
| eu (_ 'eU | |||
| @) eu (l_ 'eu | |||
| @) eu (_ eu | |||
| @) eu (_N 'eU | |||
| ea ea | |||
| &) ea (_S2q ea | |||
| &) eSi eaj | |||
| @@ -112,24 +118,24 @@ | |||
| @) eşului (_ =eSuluI | |||
| @) eşilor (_ =eSilor | |||
| @) ec (a_ =ek | |||
| @) ec (ă_ =ek | |||
| @) ec (ii_ =ek | |||
| @) ec (ile_ =ek | |||
| @) ec (ilor_ =ek | |||
| @At) ec (i@_ etS | |||
| @At) ec (A_ ek | |||
| @At) ec (ii_ eTtS | |||
| //@) ec (a_ =ek | |||
| //@) ec (ă_ =ek | |||
| //@) ec (ii_ =etS | |||
| //@) ec (i_ =etS | |||
| //@) ec (ilor_ =etS | |||
| //@At) ec (i@_ etS | |||
| //@At) ec (A_ ek | |||
| @At) ec (ii_ etS | |||
| // &) es (_S1q e | |||
| &C) e (re_ %e | |||
| _ac) ee (a eI | |||
| r) ei (er_ 'eI | |||
| @) e (re_ =e | |||
| @) e (ri_ =e | |||
| @) e (rea_ =e | |||
| @) e (rii_ =e | |||
| @) e (rei_ =e | |||
| i) e (re_ e | |||
| i) e (ri_ e | |||
| i) e (rii_ e | |||
| @@ -155,6 +161,9 @@ | |||
| g (i dZ | |||
| gii dZiI | |||
| gh g | |||
| &) gii (_ dZ'iI | |||
| &) gi (A_ dZi | |||
| .group h | |||
| @@ -221,6 +230,7 @@ | |||
| &) icile (_ =itSile | |||
| &) icilor (_ =itSilor | |||
| @) icii (_ =itSiI | |||
| @) icei (_ =itSeI | |||
| scr) i (e 'i | |||
| &) ing (_ %iNg // foreign words | |||
| @@ -263,8 +273,6 @@ | |||
| &) le (_S2t le | |||
| &) lor (_S3t lor | |||
| &) lui (_S3t luI | |||
| &) logi (A_ lodZ'i | |||
| &) logii (_ lodZ'iI | |||
| .group m | |||
| @@ -303,7 +311,8 @@ | |||
| _) oi oI | |||
| oi (_ 'oI | |||
| ou oU | |||
| ou (_ 'oU | |||
| ou (_N 'oU | |||
| ou (_ ou | |||
| o (AAA o | |||
| @@ -388,13 +397,15 @@ | |||
| .group u | |||
| u u | |||
| u (A w | |||
| _) ui uI | |||
| ui (_ uI | |||
| ui (e wi | |||
| V&) ui (_N u'i | |||
| u u | |||
| u (A w | |||
| _) ui uI | |||
| ui (_ 'uI | |||
| r) ui (n ui | |||
| ui (e wi | |||
| V&) ui (_N u'i | |||
| dest) ul ul | |||
| &) ul (_S2t ul | |||
| @ic) ul (_S2t ul | |||
| @ic) ule (_S3t ule | |||
| @@ -430,24 +441,15 @@ | |||
| .group x | |||
| x ks | |||
| A) x (A gz | |||
| ma) x (i ks | |||
| cone) x (iu ks | |||
| i) x (e ks | |||
| o) x (e ks // boxele | |||
| u) x (a ks | |||
| a) x (a ks | |||
| a) x (ă ks | |||
| a) x (e ks | |||
| i) x (a ks | |||
| o) x (a ks | |||
| A) x (â ks | |||
| @) x (ibil ks | |||
| o) x (i ks // oxigen | |||
| a) x (ia ks // axial | |||
| ale) x ks | |||
| ta) x ks | |||
| x ks | |||
| e) x (a gz | |||
| e) x (e gz | |||
| e) x (i gz | |||
| me) x (ic ks | |||
| e) x (iA_ ks | |||
| e) x (iu ks | |||
| e) x (Ag ks | |||
| le) x ks | |||
| .group y | |||
| @@ -466,13 +468,6 @@ | |||
| D_) % la_sut@ | |||
| % p@-*otSent | |||
| $ dolar | |||
| + plus | |||
| & ampersand | |||
| © k'apiraIt | |||
| @ a*'ond | |||
| / sleS | |||
| € 'eU*o | |||
| ° g@-*ade | |||
| , (D v'irgul@ | |||
| @@ -491,3 +486,4 @@ | |||
| **) * (_ _:: | |||
| @@ -105,11 +105,11 @@ language). | |||
| e (Dn @ //en eng | |||
| er @r | |||
| e1r @r55 | |||
| e2r @r35 | |||
| e3r @r214 | |||
| e4r @r51 | |||
| er (K @r | |||
| e1r (K @r55 | |||
| e2r (K @r35 | |||
| e3r (K @r214 | |||
| e4r (K @r51 | |||
| .group f | |||
| f f | |||
| @@ -24,7 +24,7 @@ | |||
| pl 15 109 | |||
| sk 29 127 | |||
| cs 6 127 | |||
| hr 20 132 | |||
| hr 26 132 | |||
| mk 3 133 | |||
| sr 14 132 | |||
| ru 39 129 | |||
| @@ -47,8 +47,8 @@ | |||
| tr 18 122 | |||
| ku 17 121 | |||
| id 15 119 | |||
| rw 12 122 | |||
| ko 18 114 | |||
| rw 15 124 | |||
| ko 18 145 | |||
| Data file Used by | |||
| b/b [b] base | |||
| @@ -172,8 +172,12 @@ dzh/dzh_ [dZ] base | |||
| [dZ;] base | |||
| [dz;] base | |||
| [J] hi | |||
| [dZ] hr | |||
| [dZ;] hr | |||
| [dZ;] mk | |||
| [dZ;] ru | |||
| dzh/dzh2 [dZ] hr | |||
| [dZ;] hr | |||
| dzh/dz_pzd [J] base | |||
| [J2] hi | |||
| [J] tr | |||
| @@ -184,11 +188,14 @@ dzh/xdzh [dZ] base | |||
| [dZ;] base | |||
| [dz;] base | |||
| [J] hi | |||
| [dZ] hr | |||
| [dZ;] hr | |||
| [dZ;] mk | |||
| [dZ;] ru | |||
| dzh/xdz_pzd [J] base | |||
| [J2] hi | |||
| envelope/i_risefall [11] zh | |||
| envelope/i_risefall2 [+2] rw | |||
| envelope/p_214 [214] zh | |||
| envelope/p_512 [8] vi | |||
| envelope/p_fall [2] vi | |||
| @@ -200,6 +207,7 @@ envelope/p_fall [2] vi | |||
| [22] zh | |||
| [33] zh | |||
| [53] zh | |||
| [+] rw | |||
| envelope/p_fallrise [4] vi | |||
| envelope/p_level [1] vi | |||
| [3] zhy | |||
| @@ -602,8 +610,11 @@ ufric/sh [S] base | |||
| ufric/sh_ [S] base | |||
| [S] fr | |||
| [s#] pt_pt | |||
| ufric/sh3 [S] hr | |||
| [Z] hr | |||
| ufric/sh_pzd [S;] base | |||
| [S;] ro | |||
| [s`] ko | |||
| ufric/sh_pzd_ [S;] base | |||
| [Z;] base | |||
| ufric/sh_pzd2 [S] sr | |||
| @@ -801,6 +812,8 @@ ustop/tsh [tS] base | |||
| [c] zhy | |||
| ustop/tsh_ [tS] base | |||
| [c] zhy | |||
| ustop/tsh2 [tS] hr | |||
| [dZ] hr | |||
| ustop/t_short [t.] hi | |||
| [t] sk | |||
| [t] el | |||
| @@ -811,11 +824,13 @@ ustop/ts_pzd [tS;] base | |||
| [ts;] base | |||
| [ch] hi | |||
| [tS;] ru | |||
| [tS`] ko | |||
| ustop/ts_pzd_ [c] hi | |||
| [c] hu | |||
| ustop/ts_pzd2 [c] hi | |||
| [c] hu | |||
| [c`] ko | |||
| ustop/ts_pzd3 [tS;] hr | |||
| [dZ;] hr | |||
| ustop/t_sr [d] sr | |||
| [t] sr | |||
| ustop/ts_rfx [ts.] zh | |||
| @@ -1135,10 +1150,12 @@ voc/z_ [z] base | |||
| voc/zh [Z] base | |||
| [z.] base | |||
| [R^] sk | |||
| [Z] hr | |||
| [Z] sr | |||
| [Z;] ro | |||
| voc/zh_ [Z] base | |||
| [z.] base | |||
| [Z] hr | |||
| [Z;] ro | |||
| voc/zh_2 [R^/] sk | |||
| voc/z_pzd [Z;] base | |||
| @@ -29,3 +29,5 @@ | |||
| 0 aI@ NULL 60 aI @ | |||
| 0 aU@ NULL 75 aU @ | |||
| 0 x NULL 0 k | |||
| 0 t2 NULL 0 t | |||
| @@ -13,6 +13,7 @@ | |||
| 0 a e 15 a _ | |||
| 0 a NULL 0 a | |||
| 0 @- NULL 0 NULL | |||
| 0 j NULL 0 i | |||
| 0 j/ NULL 0 j | |||
| 0 I^ _ 0 I | |||
| 0 I^ NULL 20 I _ | |||
| @@ -44,3 +44,4 @@ | |||
| 0 p NULL 0 p_h | |||
| 0 t NULL 0 t_h | |||
| 0 k NULL 0 k_h | |||
| 0 t2 NULL 0 t | |||
| @@ -40,5 +40,6 @@ | |||
| 0 U@ NULL 50 U r | |||
| 0 i@ NULL 50 I @ | |||
| 0 i@3 NULL 60 i r | |||
| 0 t2 NULL 0 t | |||
| @@ -1,3 +1,74 @@ | |||
| phoneme S // this is letter š | |||
| vls pla frc sibilant | |||
| vowelin f1=0 f2=2100 100 300 f3=-100 80 | |||
| vowelout f1=0 f2=2100 100 300 f3=-100 80 | |||
| length 30 | |||
| lengthmod 3 | |||
| wave ufric/sh3%220 | |||
| before _ ufric/sh3%160 | |||
| switchvoicing Z | |||
| endphoneme | |||
| phoneme tS // this is letter č | |||
| vls pla afr sibilant | |||
| vowelin f1=0 f2=1900 100 200 f3=-100 80 | |||
| length 90 | |||
| lengthmod 2 | |||
| wave ustop/tsh2 | |||
| before _ ustop/tsh2%70 | |||
| switchvoicing dZ | |||
| endphoneme | |||
| phoneme tS; // this is letter ć | |||
| vls pal afr sibilant palatal | |||
| vowelin f1=0 f2=2500 300 500 f3=300 80 rate len=70 | |||
| lengthmod 2 | |||
| wave ustop/ts_pzd3 | |||
| before _ ustop/ts_pzd3%80 | |||
| switchvoicing dZ; | |||
| endphoneme | |||
| phoneme Z // letter ž | |||
| vcd pla frc sibilant | |||
| vowelin f1=0 f2=2000 0 300 f3=-200 80 | |||
| vowelout f1=2 f2=2000 0 300 f3=-200 80 brk | |||
| formants voc/zh+ufric/sh3%240 | |||
| before _ voc/zh_+ufric/sh3%170 | |||
| lengthmod 6 | |||
| switchvoicing S | |||
| endphoneme | |||
| phoneme dZ //letter dž | |||
| vcd pla afr sibilant | |||
| vowelin f1=2 f2=1900 100 300 f3=100 80 | |||
| vowelout f1=2 f2=1900 100 300 f3=100 80 brk | |||
| formants dzh/dzh2+ustop/tsh2%140 | |||
| before _ dzh/dzh_+ustop/tsh2%100 | |||
| after _ NULL | |||
| after @ dzh/xdzh | |||
| lengthmod 5 | |||
| switchvoicing tS | |||
| endphoneme | |||
| phoneme dZ; // letter đ | |||
| vcd pla afr sibilant palatal | |||
| vowelin f1=2 f2=2500 300 500 f3=300 80 rate len=70 | |||
| formants dzh/dzh2+ustop/ts_pzd3%140 | |||
| before _ dzh/dzh_+ustop/ts_pzd3%80 | |||
| after _ NULL | |||
| after @ dzh/xdzh | |||
| lengthmod 5 | |||
| switchvoicing tS; | |||
| endphoneme | |||
| phoneme @ // Schwa | |||
| vowel starttype (@) endtype (@) | |||
| formants vowel/@_hgh | |||
| @@ -155,3 +226,4 @@ phoneme r* | |||
| length 50 | |||
| endphoneme | |||
| @@ -0,0 +1,115 @@ | |||
| //****************************** | |||
| // Phonemes for Kinyarwanda (rw), inherits "base2" | |||
| //****************************** | |||
| phoneme a | |||
| vowel starttype (a) endtype (a) | |||
| length 180 | |||
| formants vowel/a_2 | |||
| reduceto a/ 4 | |||
| beforepause a# | |||
| beforevowel NULL | |||
| endphoneme | |||
| phoneme a/ | |||
| vowel starttype (@) endtype (@) | |||
| length 180 | |||
| formants vowel/a# | |||
| beforepause a# | |||
| beforevowel NULL | |||
| endphoneme | |||
| phoneme e | |||
| vowel starttype (e) endtype (e) | |||
| length 170 | |||
| formants vowel/e | |||
| beforepause e# | |||
| beforevowel NULL | |||
| endphoneme | |||
| phoneme i | |||
| vowel starttype (i) endtype (i) | |||
| length 150 | |||
| formants vowel/i | |||
| beforepause i# | |||
| beforevowel NULL | |||
| endphoneme | |||
| phoneme o | |||
| vowel starttype (o) endtype (o) | |||
| length 170 | |||
| formants vowel/o | |||
| beforepause o# | |||
| beforevowel NULL | |||
| endphoneme | |||
| phoneme u | |||
| vowel starttype (u) endtype (u) | |||
| length 160 | |||
| formants vowel/u_bck | |||
| beforepause u# | |||
| beforevowel NULL | |||
| endphoneme | |||
| phoneme a# | |||
| vowel starttype (@) endtype (@) | |||
| length 100 | |||
| formants vowel/a# | |||
| beforevowel NULL | |||
| endphoneme | |||
| phoneme e# | |||
| vowel starttype (e) endtype (e) | |||
| length 100 | |||
| formants vowel/e | |||
| beforevowel NULL | |||
| endphoneme | |||
| phoneme i# | |||
| vowel starttype (i) endtype (i) | |||
| length 100 | |||
| formants vowel/i | |||
| linkout ; | |||
| beforevowel NULL | |||
| endphoneme | |||
| phoneme o# | |||
| vowel starttype (o) endtype (o) | |||
| length 170 | |||
| formants vowel/o | |||
| beforevowel NULL | |||
| endphoneme | |||
| phoneme u# | |||
| vowel starttype (u) endtype (u) | |||
| length 100 | |||
| formants vowel/u_bck | |||
| beforevowel NULL | |||
| endphoneme | |||
| phoneme : // Lengthen previous vowel by "length" | |||
| virtual | |||
| length 120 | |||
| endphoneme | |||
| phoneme + // high tone, use after a vowel | |||
| stress | |||
| tone 0 30 envelope/p_fall NULL | |||
| endphoneme | |||
| phoneme +2 // high tone, use after a vowel | |||
| stress | |||
| tone 0 30 envelope/i_risefall2 NULL | |||
| endphoneme | |||
| @@ -0,0 +1,129 @@ | |||
| phoneme a | |||
| vowel starttype (a) endtype (a) | |||
| length 190 | |||
| formants vowel/a | |||
| endphoneme | |||
| phoneme E | |||
| vowel starttype (e) endtype (e) | |||
| length 180 | |||
| formants vowel/e_mid2 | |||
| endphoneme | |||
| phoneme e | |||
| vowel starttype (e) endtype (e) | |||
| length 180 | |||
| formants vowel/e | |||
| endphoneme | |||
| phoneme i | |||
| vowel starttype (i) endtype (i) | |||
| length 160 | |||
| formants vowel/i | |||
| endphoneme | |||
| phoneme o | |||
| vowel starttype (o) endtype (o) | |||
| length 180 | |||
| formants vowel/o_2 | |||
| endphoneme | |||
| phoneme V | |||
| vowel starttype (a) endtype (a) | |||
| length 180 | |||
| formants vowel/aa_8 | |||
| endphoneme | |||
| phoneme Y | |||
| vowel starttype (@) endtype (@) | |||
| length 180 | |||
| formants vowel/y# | |||
| endphoneme | |||
| phoneme u | |||
| vowel starttype (u) endtype (u) | |||
| length 180 | |||
| formants vowel/u_bck | |||
| endphoneme | |||
| phoneme y | |||
| vowel starttype (i) endtype (u) | |||
| length 180 | |||
| formants vowel/u#_6 | |||
| endphoneme | |||
| phoneme u- | |||
| vowel starttype (u) endtype (u) | |||
| length 180 | |||
| formants vowel/u_unr | |||
| endphoneme | |||
| phoneme ji | |||
| vowel starttype (i) endtype (i) | |||
| length 220 | |||
| formants vdiph/yi_fr | |||
| endphoneme | |||
| phoneme p` | |||
| vls blb stop | |||
| vowelin f1=0 f2=1000 -50 -100 f3=-200 80 amp=31 | |||
| vowelout f1=0 f2=1000 -500 -350 f3=-300 80 rms=30 | |||
| lengthmod 2 | |||
| wave ustop/p_unasp%130 | |||
| endphoneme | |||
| phoneme t` // dental variant of /t/ | |||
| vls dnt stop | |||
| vowelin f1=0 f2=1600 -300 300 f3=-100 80 amp=31 | |||
| vowelout f1=0 f2=1600 -300 250 f3=-100 80 rms=20 | |||
| lengthmod 2 | |||
| wave ustop/t_dnt | |||
| switchvoicing d | |||
| endphoneme | |||
| phoneme c` | |||
| vls pal afr sibilant palatal | |||
| vowelin f1=0 f2=2700 400 600 f3=300 80 rate len=70 amp=31 | |||
| lengthmod 2 | |||
| wave ustop/ts_pzd2%120 | |||
| switchvoicing dZ; | |||
| endphoneme | |||
| phoneme k` | |||
| vls vel stop | |||
| vowelin f1=0 f2=2300 200 400 f3=-100 80 amp=31 | |||
| vowelout f1=0 f2=2300 300 400 f3=-100 80 rms=20 | |||
| lengthmod 2 | |||
| wave ustop/k_unasp%130 | |||
| endphoneme | |||
| phoneme s` | |||
| vls alv frc sibilant | |||
| vowelin f1=0 f2=1700 -300 300 f3=-100 80 amp=31 | |||
| vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20 | |||
| lengthmod 3 | |||
| wave ufric/s%120 | |||
| before j ufric/sh_pzd%120 | |||
| before i ufric/sh_pzd%120 | |||
| endphoneme | |||
| phoneme r // flap [**] | |||
| liquid alv | |||
| beforenotvowel l | |||
| vowelout f1=3 f2=1600 -300 300 f3=-300 80 rms=35 len=15 | |||
| vowelin f1=2 f2=1600 -300 300 f3=-100 80 len=20 | |||
| formants r3/@tap | |||
| after (e) r3/@tap2 | |||
| after (i) r3/@tap2 | |||
| lengthmod 3 | |||
| endphoneme | |||
| @@ -1278,5 +1278,5 @@ include ph_indonesian | |||
| phonemetable rw base2 | |||
| include ph_kinyarwanda | |||
| phonemetable ko base | |||
| phonemetable ko hi | |||
| include ph_korean | |||
| @@ -1,10 +1,10 @@ | |||
| # remove -fno-exceptions if it causes problems with stdio library on some platforms (ARM) | |||
| PREFIX=/ | |||
| BINDIR=$(PREFIX)/usr/bin | |||
| INCDIR=$(PREFIX)/usr/include/espeak | |||
| LIBDIR=$(PREFIX)/usr/lib | |||
| DATADIR=$(PREFIX)/usr/share/espeak-data | |||
| PREFIX=/usr | |||
| BINDIR=$(PREFIX)/bin | |||
| INCDIR=$(PREFIX)/include/espeak | |||
| LIBDIR=$(PREFIX)/lib | |||
| DATADIR=$(PREFIX)/share/espeak-data | |||
| RELEASE = 1.36 | |||
| BIN_NAME = speak | |||
| @@ -24,9 +24,9 @@ INSTALL = install | |||
| LN_SF = /bin/ln -sf | |||
| MKDIR = mkdir -p | |||
| #AUDIO = pulseaudio | |||
| AUDIO = portaudio | |||
| #AUDIO = pulseaudio | |||
| #AUDIO = sada | |||
| ifeq ($(AUDIO),pulseaudio) | |||
| WAVE=wave_pulse.cpp | |||
| @@ -38,9 +38,14 @@ WAVE=wave.cpp | |||
| LIB_AUDIO=-lportaudio | |||
| USE_AUDIO=-DUSE_PORTAUDIO | |||
| else | |||
| ifeq ($(AUDIO),sada) | |||
| WAVE=wave_sada.cpp | |||
| USE_AUDIO=-DUSE_SADA | |||
| else | |||
| WAVE=wave.cpp | |||
| endif | |||
| endif | |||
| endif | |||
| speak_SOURCES = speak.cpp compiledict.cpp dictionary.cpp intonation.cpp \ | |||
| readclause.cpp setlengths.cpp numbers.cpp synth_mbrola.cpp \ | |||
| @@ -1086,6 +1086,24 @@ void Translator::SetWordStress(char *output, unsigned int dictionary_flags, int | |||
| switch(langopts.stress_rule) | |||
| { | |||
| case 8: | |||
| // stress on first syllable, unless it is a light syllable | |||
| if(syllable_weight[1] > 0) | |||
| break; | |||
| // else drop through to case 1 | |||
| case 1: | |||
| // stress on second syllable | |||
| if((stressed_syllable == 0) && (vowel_count > 2)) | |||
| { | |||
| stressed_syllable = 2; | |||
| if(max_stress == 0) | |||
| { | |||
| vowel_stress[stressed_syllable] = 4; | |||
| } | |||
| max_stress = 4; | |||
| } | |||
| break; | |||
| case 2: | |||
| // a language with stress on penultimate vowel | |||
| @@ -908,6 +908,7 @@ void Translator::CalcPitches(int clause_type) | |||
| int count; | |||
| int n_primary; | |||
| int count_primary; | |||
| PHONEME_TAB *ph; | |||
| int ph_end=n_phoneme_list; | |||
| SYLLABLE syllable_tab2[N_PHONEME_LIST]; | |||
| @@ -1081,6 +1082,13 @@ void Translator::CalcPitches(int clause_type) | |||
| p->pitch2 = x; | |||
| } | |||
| if(p->tone_ph) | |||
| { | |||
| ph = phoneme_tab[p->tone_ph]; | |||
| x = (p->pitch1 + p->pitch2)/2; | |||
| p->pitch2 = x + ph->end_type; | |||
| p->pitch1 = x + ph->start_type; | |||
| } | |||
| if(syl->flags & SYL_EMPHASIS) | |||
| { | |||
| @@ -35,7 +35,7 @@ | |||
| #include "translate.h" | |||
| #include "wave.h" | |||
| const char *version_string = "1.36.07 25.Mar.08"; | |||
| const char *version_string = "1.36.12 10.Apr.08"; | |||
| const int version_phdata = 0x013400; | |||
| int option_device_number = -1; | |||
| @@ -47,6 +47,7 @@ | |||
| #define OFFSET_CYRILLIC 0x420 | |||
| #define OFFSET_DEVANAGARI 0x900 | |||
| #define OFFSET_TAMIL 0xb80 | |||
| #define OFFSET_KOREAN 0x1100 | |||
| static const unsigned int replace_cyrillic_latin[] = | |||
| @@ -456,8 +457,21 @@ SetLengthMods(tr,3); // all equal | |||
| break; | |||
| case L('k','o'): // Korean, TEST | |||
| { | |||
| static const char ko_ivowels[] = {0x63,0x64,0x67,0x68,0x6d,0x72,0x74,0x75,0}; // y and i vowels | |||
| static const char ko_voiced[] = {0x02,0x05,0x06,0xab,0xaf,0xb7,0xbc,0}; // voiced consonants, l,m,n,N | |||
| tr = new Translator(); | |||
| tr->letter_bits_offset = OFFSET_KOREAN; | |||
| memset(tr->letter_bits,0,sizeof(tr->letter_bits)); | |||
| SetLetterBitsRange(tr,LETTERGP_A,0x61,0x75); | |||
| SetLetterBits(tr,LETTERGP_Y,ko_ivowels); | |||
| SetLetterBits(tr,LETTERGP_G,ko_voiced); | |||
| tr->langopts.stress_rule = 8; // ?? 1st syllable if it is heavy, else 2nd syllable | |||
| tr->langopts.param[LOPT_UNPRONOUNCABLE] = 1; // disable check for unpronouncable words | |||
| tr->langopts.numbers = 0x0401; | |||
| } | |||
| break; | |||
| case L('k','u'): // Kurdish | |||
| @@ -684,7 +698,7 @@ SetLengthMods(tr,3); // all equal | |||
| SetupTranslator(tr,stress_lengths_ta,stress_amps_ta); | |||
| tr->langopts.length_mods0 = tr->langopts.length_mods; // don't lengthen vowels in the last syllable | |||
| tr->langopts.stress_rule = 1; | |||
| tr->langopts.stress_rule = 0; | |||
| tr->langopts.stress_flags = 0x10004; // use 'diminished' for unstressed final syllable | |||
| tr->letter_bits_offset = OFFSET_TAMIL; | |||
| tr->langopts.param[LOPT_WORD_MERGE] = 1; // don't break vowels betwen words | |||
| @@ -0,0 +1,576 @@ | |||
| /*************************************************************************** | |||
| * Copyright (C) 2008, Sun Microsystems, Inc. * | |||
| * eSpeak driver for Solaris Audio Device Architecture (SADA) * | |||
| * Written by Willie Walker, based on the eSpeak PulseAudio driver * | |||
| * from Gilles Casse * | |||
| * * | |||
| * 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, write to the * | |||
| * Free Software Foundation, Inc., * | |||
| * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * | |||
| ***************************************************************************/ | |||
| #include "speech.h" | |||
| #ifdef USE_ASYNC | |||
| // This source file is only used for asynchronious modes | |||
| #include <errno.h> | |||
| #include <string.h> | |||
| #include <stropts.h> | |||
| #include <assert.h> | |||
| #include <stdlib.h> | |||
| #include <unistd.h> | |||
| #include <fcntl.h> | |||
| #include <sys/audioio.h> | |||
| #include "wave.h" | |||
| #include "debug.h" | |||
| enum {ONE_BILLION=1000000000}; | |||
| #define SAMPLE_RATE 22050 | |||
| #define SAMPLE_SIZE 16 | |||
| #ifdef USE_SADA | |||
| static t_wave_callback* my_callback_is_output_enabled=NULL; | |||
| static const char *sun_audio_device = "/dev/audio"; | |||
| static int sun_audio_fd = -1; | |||
| // The total number of 16-bit samples sent to be played via the | |||
| // wave_write method. | |||
| // | |||
| static uint32_t total_samples_sent; | |||
| // The total number of samples sent to be played via the wave_write | |||
| // method, but which were never played because of a call to | |||
| // wave_close. | |||
| // | |||
| static uint32_t total_samples_skipped; | |||
| // The last known playing index after a call to wave_close. | |||
| // | |||
| static uint32_t last_play_position=0; | |||
| //> | |||
| // wave_init | |||
| // | |||
| // DESCRIPTION: | |||
| // | |||
| // initializes the audio subsytem. | |||
| // | |||
| // GLOBALS USED/MODIFIED: | |||
| // | |||
| // sun_audio_fd: modified to hold the file descriptor of the opened | |||
| // audio device. | |||
| // | |||
| //<wave_init | |||
| void wave_init() { | |||
| ENTER("wave_init"); | |||
| audio_info_t ainfo; | |||
| char *audio_device = NULL; | |||
| audio_device = getenv("AUDIODEV"); | |||
| if (audio_device != NULL) { | |||
| if ((sun_audio_fd = open(audio_device, O_WRONLY)) < 0) { | |||
| SHOW("wave_init() could not open: %s (%d)\n", | |||
| audio_device, sun_audio_fd); | |||
| } | |||
| } | |||
| if (sun_audio_fd < 0) { | |||
| if ((sun_audio_fd = open(sun_audio_device, O_WRONLY)) < 0) { | |||
| SHOW("wave_init() could not open: %s (%d)\n", | |||
| sun_audio_device, sun_audio_fd); | |||
| } | |||
| } | |||
| SHOW("wave_init() sun_audio_fd: %d\n", sun_audio_fd); | |||
| if (sun_audio_fd < 0) { | |||
| return; | |||
| } | |||
| ioctl(sun_audio_fd, AUDIO_GETINFO, &ainfo); | |||
| SHOW("wave_init() play buffer size: %d\n", ainfo.play.buffer_size); | |||
| ainfo.play.encoding = AUDIO_ENCODING_LINEAR; | |||
| ainfo.play.channels = 1; | |||
| ainfo.play.sample_rate = SAMPLE_RATE; | |||
| ainfo.play.precision = SAMPLE_SIZE; | |||
| if (ioctl(sun_audio_fd, AUDIO_SETINFO, &ainfo) == -1) { | |||
| SHOW("wave_init() failed to set audio params: %s\n", strerror(errno)); | |||
| close(sun_audio_fd); | |||
| return; | |||
| } | |||
| } | |||
| //> | |||
| // wave_open | |||
| // | |||
| // DESCRIPTION: | |||
| // | |||
| // opens the audio subsystem given a specific API (e.g., "alsa", | |||
| // "oss", ...). We ignore the_api and just return the sun_audio_fd we | |||
| // opened in wave_init. This return value will be passed in as the | |||
| // theHandler parameter in all other methods. | |||
| // | |||
| // PARAMETERS: | |||
| // | |||
| // the_api: "alsa", "oss" (ignored) | |||
| // | |||
| // GLOBALS USED/MODIFIED: | |||
| // | |||
| // sun_audio_fd: used as return value | |||
| // | |||
| // RETURNS: | |||
| // | |||
| // sun_audio_fd opened in wave_init, which is passed in as theHandler | |||
| // parameter in all other methods | |||
| // | |||
| //<wave_open | |||
| void* wave_open(const char* the_api) | |||
| { | |||
| ENTER("wave_open"); | |||
| return((void*) sun_audio_fd); | |||
| } | |||
| //> | |||
| // wave_write | |||
| // | |||
| // DESCRIPTION: | |||
| // | |||
| // Meant to be asynchronous, it supplies the wave sample to the lower | |||
| // audio layer and returns. The sample is played later on. [[[WDW - | |||
| // we purposely do not open the audio device as non-blocking because | |||
| // managing that would be a pain. So, we rely a lot upon fifo.cpp and | |||
| // event.cpp to not overload us, allowing us to get away with a | |||
| // blocking write. event.cpp:polling_thread in particular appears to | |||
| // use get_remaining_time to prevent flooding.]]] | |||
| // | |||
| // PARAMETERS: | |||
| // | |||
| // theHandler: the audio device file descriptor | |||
| // theMono16BitsWaveBuffer: the audio data | |||
| // theSize: the number of bytes (not 16-bit samples) | |||
| // | |||
| // GLOBALS USED/MODIFIED: | |||
| // | |||
| // total_samples_sent: modified based upon 16-bit samples sent | |||
| // | |||
| // RETURNS: | |||
| // | |||
| // the number of bytes (not 16-bit samples) sent | |||
| // | |||
| //<wave_write | |||
| size_t wave_write(void* theHandler, | |||
| char* theMono16BitsWaveBuffer, | |||
| size_t theSize) | |||
| { | |||
| size_t num; | |||
| ENTER("wave_write"); | |||
| if (my_callback_is_output_enabled && (0==my_callback_is_output_enabled())) { | |||
| SHOW_TIME("wave_write > my_callback_is_output_enabled: no!"); | |||
| return 0; | |||
| } | |||
| num = write((int) theHandler, theMono16BitsWaveBuffer, theSize); | |||
| // Keep track of the total number of samples sent -- we use this in | |||
| // wave_get_read_position and also use it to help calculate the | |||
| // total_samples_skipped in wave_close. | |||
| // | |||
| total_samples_sent += num / 2; | |||
| if (num < theSize) { | |||
| SHOW("ERROR: wave_write only wrote %d of %d bytes\n", num, theSize); | |||
| } else { | |||
| SHOW("wave_write wrote %d bytes\n", theSize); | |||
| } | |||
| SHOW_TIME("wave_write > LEAVE"); | |||
| return num; | |||
| } | |||
| //> | |||
| // wave_close | |||
| // | |||
| // DESCRIPTION: | |||
| // | |||
| // Does what SADA normally would call a flush, which means to cease | |||
| // all audio production in progress and throw any remaining audio | |||
| // away. [[[WDW - see comment in wave_flush.]]] | |||
| // | |||
| // PARAMETERS: | |||
| // | |||
| // theHandler: the audio device file descriptor | |||
| // | |||
| // GLOBALS USED/MODIFIED: | |||
| // | |||
| // last_play_position: modified to reflect play position the last time | |||
| // this method was called | |||
| // total_samples_sent: used to help calculate total_samples_skipped | |||
| // total_samples_skipped: modified to hold the total number of 16-bit | |||
| // samples sent to wave_write, but which were | |||
| // never played | |||
| // sun_audio_fd: used because some calls to wave_close seem to | |||
| // pass a NULL for theHandler for some odd reason | |||
| // | |||
| // RETURNS: | |||
| // | |||
| // The result of the ioctl call (non-0 means failure) | |||
| // | |||
| //<wave_close | |||
| int wave_close(void* theHandler) | |||
| { | |||
| int ret; | |||
| audio_info_t ainfo; | |||
| int audio_fd = (int) theHandler; | |||
| if (!audio_fd) { | |||
| audio_fd = sun_audio_fd; | |||
| } | |||
| ENTER("wave_close"); | |||
| // [[[WDW: maybe do a pause/resume ioctl???]]] | |||
| ret = ioctl(audio_fd, I_FLUSH, FLUSHRW); | |||
| ioctl(audio_fd, AUDIO_GETINFO, &ainfo); | |||
| // Calculate the number of samples that won't get | |||
| // played. We also keep track of the last_play_position | |||
| // because wave_close can be called multiple times | |||
| // before another call to wave_write. | |||
| // | |||
| if (last_play_position != ainfo.play.samples) { | |||
| last_play_position = ainfo.play.samples; | |||
| total_samples_skipped = total_samples_sent - last_play_position; | |||
| } | |||
| SHOW_TIME("wave_close > LEAVE"); | |||
| return ret; | |||
| } | |||
| //> | |||
| // wave_is_busy | |||
| // | |||
| // DESCRIPTION: | |||
| // | |||
| // Returns a non-0 value if audio is being played. | |||
| // | |||
| // PARAMETERS: | |||
| // | |||
| // theHandler: the audio device file descriptor | |||
| // | |||
| // GLOBALS USED/MODIFIED: | |||
| // | |||
| // sun_audio_fd: used because some calls to wave_is_busy seem to | |||
| // pass a NULL for theHandler for some odd reason | |||
| // | |||
| // RETURNS: | |||
| // | |||
| // A non-0 value if audio is being played | |||
| // | |||
| //<wave_is_busy | |||
| int wave_is_busy(void* theHandler) | |||
| { | |||
| audio_info_t ainfo; | |||
| int audio_fd = (int) theHandler; | |||
| if (!audio_fd) { | |||
| audio_fd = sun_audio_fd; | |||
| } | |||
| ENTER("wave_is_busy"); | |||
| ioctl(audio_fd, AUDIO_GETINFO, &ainfo); | |||
| SHOW("wave_is_busy: active=%d", ainfo.play.active); | |||
| SHOW_TIME("wave_is_busy > LEAVE"); | |||
| return ainfo.play.active; | |||
| } | |||
| //> | |||
| // wave_terminate | |||
| // | |||
| // DESCRIPTION: | |||
| // | |||
| // Used to end our session with eSpeak. | |||
| // | |||
| // GLOBALS USED/MODIFIED: | |||
| // | |||
| // sun_audio_fd: modified - closed and set to -1 | |||
| // | |||
| //<wave_terminate | |||
| void wave_terminate() | |||
| { | |||
| ENTER("wave_terminate"); | |||
| close(sun_audio_fd); | |||
| sun_audio_fd = -1; | |||
| SHOW_TIME("wave_terminate > LEAVE"); | |||
| } | |||
| //> | |||
| // wave_flush | |||
| // | |||
| // DESCRIPTION: | |||
| // | |||
| // Appears to want to tell the audio subsystem to make sure it plays | |||
| // the audio. In our case, the system is already doing this, so this | |||
| // is basically a no-op. [[[WDW - if you do a drain, you block, so | |||
| // don't do that. In addition the typical SADA notion of flush is | |||
| // currently handled by wave_close. I think this is most likely just | |||
| // terminology conflict between eSpeak and SADA.]]] | |||
| // | |||
| // PARAMETERS: | |||
| // | |||
| // theHandler: the audio device file descriptor | |||
| // | |||
| //<wave_flush | |||
| void wave_flush(void* theHandler) | |||
| { | |||
| ENTER("wave_flush"); | |||
| //ioctl((int) theHandler, AUDIO_DRAIN, 0); | |||
| SHOW_TIME("wave_flush > LEAVE"); | |||
| } | |||
| //> | |||
| // wave_set_callback_is_output_enabled | |||
| // | |||
| // DESCRIPTION: | |||
| // | |||
| // Sets the callback to call from wave_write before it sends data to | |||
| // be played. It helps wave_write determine if the data should be | |||
| // thrown away or not. | |||
| // | |||
| // PARAMETERS: | |||
| // | |||
| // cb: the callback to call from wave_write | |||
| // | |||
| //<wave_set_callback_is_output_enabled | |||
| void wave_set_callback_is_output_enabled(t_wave_callback* cb) | |||
| { | |||
| my_callback_is_output_enabled = cb; | |||
| } | |||
| //> | |||
| // wave_test_get_write_buffer | |||
| // | |||
| // DESCRIPTION: | |||
| // | |||
| // Unnecessary and is used for debug output from | |||
| // speak_lib.cpp:dispatch_audio. | |||
| // | |||
| // RETURNS: | |||
| // | |||
| // NULL | |||
| // | |||
| //<wave_test_get_write_buffer | |||
| void *wave_test_get_write_buffer() | |||
| { | |||
| return NULL; | |||
| } | |||
| //> | |||
| // wave_get_read_position | |||
| // | |||
| // DESCRIPTION: | |||
| // | |||
| // Concerns the sample which is currently played by the audio layer, | |||
| // where 'sample' is a small buffer of synthesized wave data, | |||
| // identified so that the user callback could be called when the | |||
| // 'sample' is really played. The identifier is returned by | |||
| // wave_get_write_position. This method is unused. | |||
| // | |||
| // PARAMETERS: | |||
| // | |||
| // theHandler: the audio device file descriptor | |||
| // | |||
| // RETURNS: | |||
| // | |||
| // The total number of 16-bit samples played by the audio system | |||
| // so far. | |||
| // | |||
| //<wave_get_read_position | |||
| uint32_t wave_get_read_position(void* theHandler) | |||
| { | |||
| audio_info_t ainfo; | |||
| ENTER("wave_get_read_position"); | |||
| ioctl((int) theHandler, AUDIO_GETINFO, &ainfo); | |||
| SHOW("wave_get_read_position: %d\n", ainfo.play.samples); | |||
| SHOW_TIME("wave_get_read_position > LEAVE"); | |||
| return ainfo.play.samples; | |||
| } | |||
| //> | |||
| // wave_get_write_position | |||
| // | |||
| // DESCRIPTION: | |||
| // | |||
| // Returns an identifier for a new sample, where 'sample' is a small | |||
| // buffer of synthesized wave data, identified so that the user | |||
| // callback could be called when the 'sample' is really played. This | |||
| // implementation views the audio as one long continuous stream of | |||
| // 16-bit samples. | |||
| // | |||
| // PARAMETERS: | |||
| // | |||
| // theHandler: the audio device file descriptor | |||
| // | |||
| // GLOBALS USED/MODIFIED: | |||
| // | |||
| // total_samples_sent: used as the return value | |||
| // | |||
| // RETURNS: | |||
| // | |||
| // total_samples_sent, which is the index for the end of this long | |||
| // continuous stream. [[[WDW: with a unit32_t managing 16-bit | |||
| // samples at 22050Hz, we have about 54 hours of play time before | |||
| // the index wraps back to 0. We don't handle that wrapping, so | |||
| // the behavior after 54 hours of play time is undefined.]]] | |||
| // | |||
| //<wave_get_write_position | |||
| uint32_t wave_get_write_position(void* theHandler) | |||
| { | |||
| ENTER("wave_get_write_position"); | |||
| SHOW("wave_get_write_position: %d\n", total_samples_sent); | |||
| SHOW_TIME("wave_get_write_position > LEAVE"); | |||
| return total_samples_sent; | |||
| } | |||
| //> | |||
| // wave_get_remaining_time | |||
| // | |||
| // DESCRIPTION: | |||
| // | |||
| // Returns the remaining time (in ms) before the sample is played. | |||
| // The sample in this case is a return value from a previous call to | |||
| // wave_get_write_position. | |||
| // | |||
| // PARAMETERS: | |||
| // | |||
| // sample: an index returned from wave_get_write_position representing | |||
| // an index into the long continuous stream of 16-bit samples | |||
| // time: a return value representing the delay in milliseconds until | |||
| // sample is played. A value of 0 means the sample is either | |||
| // currently being played or it has already been played. | |||
| // | |||
| // GLOBALS USED/MODIFIED: | |||
| // | |||
| // sun_audio_fd: used to determine total number of samples played by | |||
| // the audio system | |||
| // total_samples_skipped: used in remaining time calculation | |||
| // | |||
| // RETURNS: | |||
| // | |||
| // Time in milliseconds before the sample is played or 0 if the sample | |||
| // is currently playing or has already been played. | |||
| // | |||
| //<wave_get_remaining_time | |||
| int wave_get_remaining_time(uint32_t sample, uint32_t* time) | |||
| { | |||
| uint32_t a_time=0; | |||
| uint32_t actual_index; | |||
| audio_info_t ainfo; | |||
| ENTER("wave_get_remaining_time"); | |||
| if (!time) { | |||
| return(-1); | |||
| SHOW_TIME("wave_get_remaining_time > LEAVE"); | |||
| } | |||
| ioctl(sun_audio_fd, AUDIO_GETINFO, &ainfo); | |||
| // See if this sample has already been played or is currently | |||
| // playing. | |||
| // | |||
| actual_index = sample - total_samples_skipped; | |||
| if ((sample < total_samples_skipped) || | |||
| (actual_index <= ainfo.play.samples)) { | |||
| *time = 0; | |||
| } else { | |||
| a_time = ((actual_index - ainfo.play.samples) * 1000) / SAMPLE_RATE; | |||
| *time = (uint32_t) a_time; | |||
| } | |||
| SHOW("wave_get_remaining_time for %d: %d\n", sample, *time); | |||
| SHOW_TIME("wave_get_remaining_time > LEAVE"); | |||
| return 0; | |||
| } | |||
| #else | |||
| // notdef USE_SADA | |||
| void wave_init() {} | |||
| void* wave_open(const char* the_api) {return (void *)1;} | |||
| size_t wave_write(void* theHandler, char* theMono16BitsWaveBuffer, size_t theSize) {return theSize;} | |||
| int wave_close(void* theHandler) {return 0;} | |||
| int wave_is_busy(void* theHandler) {return 0;} | |||
| void wave_terminate() {} | |||
| uint32_t wave_get_read_position(void* theHandler) {return 0;} | |||
| uint32_t wave_get_write_position(void* theHandler) {return 0;} | |||
| void wave_flush(void* theHandler) {} | |||
| typedef int (t_wave_callback)(void); | |||
| void wave_set_callback_is_output_enabled(t_wave_callback* cb) {} | |||
| extern void* wave_test_get_write_buffer() {return NULL;} | |||
| int wave_get_remaining_time(uint32_t sample, uint32_t* time) | |||
| { | |||
| if (!time) return(-1); | |||
| *time = (uint32_t)0; | |||
| return 0; | |||
| } | |||
| #endif // of USE_PORTAUDIO | |||
| //> | |||
| //<clock_gettime2, add_time_in_ms | |||
| void clock_gettime2(struct timespec *ts) | |||
| { | |||
| struct timeval tv; | |||
| if (!ts) | |||
| { | |||
| return; | |||
| } | |||
| assert (gettimeofday(&tv, NULL) != -1); | |||
| ts->tv_sec = tv.tv_sec; | |||
| ts->tv_nsec = tv.tv_usec*1000; | |||
| } | |||
| void add_time_in_ms(struct timespec *ts, int time_in_ms) | |||
| { | |||
| if (!ts) | |||
| { | |||
| return; | |||
| } | |||
| uint64_t t_ns = (uint64_t)ts->tv_nsec + 1000000 * (uint64_t)time_in_ms; | |||
| while(t_ns >= ONE_BILLION) | |||
| { | |||
| 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; | |||
| } | |||
| ts->tv_nsec = (long int)t_ns; | |||
| } | |||
| #endif // USE_ASYNC | |||
| //> | |||