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 | |||
//> |