Tự động hóa đài 116

Tài liệu Tự động hóa đài 116: ... Ebook Tự động hóa đài 116

doc174 trang | Chia sẻ: huyen82 | Lượt xem: 1557 | Lượt tải: 0download
Tóm tắt tài liệu Tự động hóa đài 116, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Muïc luïc Muïc Luïc 1 Ñaët vaán ñeà 4 PHAÀN MOÄT : THÖÏC TRAÏNG VAØ GIAÛI PHAÙP CHO 116. 6 Thöïc traïng cuûa dòch vuï 116 6 Giaûi phaùp baùn töï ñoäng dòch vuï 116 10 Caùc chöùc naêng cuûa öùng duïng 12 Giao tieáp qua ñieän thoaïi 12 Truy tìm döõ lieäu treân maïng maùy tính 13 Phaùt aâm 13 Sô ñoà chöùc naêng cuûa chöông trình xöû lyù 13 Keát luaän 16 PHAÀN HAI : CÔ SÔÛ LYÙ THUYEÁT 17 CHÖÔNG 1 : GIAO TIEÁP QUA MAÏNG ÑIEÄN THOAÏI 18 Giôùi thieäu 19 Maïng ñieän thoaïi 19 1.Toång ñaøi ñieän thoaïi 19 Ñònh nghóa 19 Caùc lôùp toång ñaøi ñieän thoaïi 19 Phaân loaïi toång ñaøi 20 Toång ñaøi PABX 21 Maùy ñieän thoaïi 21 Nguyeân taéc caáu taïo maùy ñieän thoaïi 21 Chöùc naêng chung cuûa maùy ñieän thoaïi 22 Phaân loaïi caùc kieåu maùy ñieän thoaïi 23 Caùc kieåu maïch cuûa maùy ñieän thoaïi 23 Yeâu caàu veà maïch ñieän cuûa maùy ñieän thoaïi 24 Caùc thoâng soá cuûa maùy ñieän thoaïi 24 Tín hieäu giöõa thueâ bao vaø toång ñaøi 24 Dialogic Card 27 Moâ taû card Dialogic/4 27 Caùc moâ hình laäp trình cho card Dialogic/4 34 Giao dieän laäp trình öùng duïng (API) 43 CHÖÔNG 2 : TOÅNG QUAN VEÀ TRUY XUAÁT CÔ SÔÛ DÖÕ LIEÄU 49 TOÅNG QUAN VEÀ TRUY XUAÁT CÔ SÔÛ DÖÕ LIEÄU 50 Cô sôû döõ lieäu laø gì ? 50 Caùc moâ hình cô sôû döõ lieäu 50 Moâ hình CSDL phaúng 50 Moâ hình CSDL quan heä 50 Caùch truy xuaát CSDL 51 Choïn phöông phaùp truy xuaát CSDL 52 TRUY XUAÁT LIEÄU DUØNG ODBC 52 Giôùi thieäu veà ODBC 52 Kieán truùc cuûa ODBC 52 Caáu hình moät ODBC data source 56 Höôùng daãn goïi caùc haøm ODBC 57 Caùc böôùc öùng duïng caên baûn 58 CHÖÔNG 3. SÔ LÖÔÏC VEÀ TIEÁNG NOÙI VAØ CAÙC PHÖÔNG PHAÙP TOÅNG HÔÏP AÂM 60 SÔ LÖÔÏC VEÀ TIEÁNG NOÙI 60 Ñaëc tính chung cuûa tieáng noùi 60 Caùch thöùc toång hôïp tieáng noùi duøng trong Text-To-Speech 62 Taïi sao söû duïng Text-To-Speech 63 Nhöõng lyù do cho vieäc thöïc thi Text-To-Speech 63 Nhöõng öùng duïng tìm naêng uûa3 Text-To-Speech 64 Haïn cheá cuûa Text-To-Speech 65 SÔ LÖÔÏC VEÀ CAÁU TRUÙC TIEÁNG VIEÄT 66 Caùc ñaëc tính cô baûn cuûa Tieáng Vieät 66 Heä thoáng ngöõ aâm Tieáng Vieät 66 Khaùi nieäm 66 Caáu truùc aâm Tieáng Vieät 66 CAÙC PHÖÔNG PHAÙP, TIEÂU CHUAÅN TOÅNG HÔÏP TIEÁNG NOÙI TRONG HEÄ THOÁNG TIEÁNG VIEÄT 69 Nguyeân nhaân caàn phaûi toång hôïp tieáng noùi 69 Caùc tieâu chuaån caàn thoûa maõn khi toång hôïp tieáng noùi 69 Caùc phöông phaùp toång hôïp aâm cho Tieáng Vieät 70 Gheùp töøng töø ñôn 70 Gheùp aâm theo caùc aâm tieát cô baûn nhaát 71 Gheùp aâm töø hai aâm loaïi 1 71 Gheùp aâm töø hai aâm loaïi 2 75 SÔ LÖÔÏC VEÀ CAÙC DAÏNG FILE AÂM THANH DUØNG TRONG CARD DIALOGIC 76 Caáu truùc Wave file 76 Ñoïc RIFF files 80 PHAÀN BA : THIEÁT KEÁ HEÄ THOÁNG 85 CHÖÔNG 1. MODULE GIAO TIEÁP 87 Hoaït ñoäng giao tieáp 88 Choïn löïa moâ hình laäp trình 88 Maùy traïng thaùi 89 CHÖÔNG 2. MODULE TRUY XUAÁT DÖÕ LIEÄU 93 GIÔÙI THIEÄU CAÙC LÔÙP MFC ODBC 9 Giôùi thieäu lôùp Cdatabase 94 Giôùi thieäu lôùp CrecordSet 94 GIÔÙI THIEÄU VEÀ SQL 95 TRUY XUAÁT DATABASEE BAÈNG MFC ODBC 97 Neáu caùc quan heä cuûa Database ñaõ bieát tröôùc taïi thôøi ñieåm laäp trình 97 Laøm vieäc vôùi caùc Database khoâng ñöôïc xaùc ñònh tröôùc 100 SÔ LÖÔÏC VEÀ CSDL DUØNG TRONG ÑAØI 116, 102 HOAÏT ÑOÄNG CUÛA PHAÀN TRUY XUAÁT DÖÕ LIEÄU 103 CHÖÔNG 3. MODULE TOÅNG HÔÏP AÂM 105 Chöùc naêng 106 Choïn phöông phaùp toång hôïp aâm 106 Caùc böôùc chuaån bò 106 Toå chöùc löu tröõ döõ lieäu aâm thanh vaø hieän thöïc toång hôïp aâm 106 Chæ löu tröõ döõ lieäu aâm 106 Ñeå rieâng leû töøng file wave 109 Choïn phöông phaùp löu tröõ taïo aâm 109 VAÄN HAØNH ÑAÙNH GIAÙ HEÄ.THOÁNG 110 Giao dieän chöông trình 111 Vaän haønh chöông trình 112 Ñaùnh gía heä thoáng 113 Keát luaän 114 CHÖÔNG TRÌNH NGUOÀN 115 ÑAËT VAÁN ÑEÀ Trong thôøi ñaïi thoâng tin nhö hieän nay, vieäc trao ñoåi thoâng tin, tìm kieám thoâng tin ngaøy caøng nhieàu. Con ngöôøi coù theå trao ñoåi, thu thaäp thoâng tin qua thö töø, saùch baùo, ñaøi, tivi, vaø hieän nay moïi ngöôøi coù theå chuû ñoäng hôn qua maïng ñieän thoaïi, Internet. Caùc öùng duïng treân Internet laø raát ña daïng, goàm nhieàu loaïi khaùc nhau, coù theå bao goàm aâm thanh, hình aûnh tónh hay ñoäng.Tuy nhieân, ñeå söû duïng noù khoâng phaûi baát kyø nôi ñaâu, luùc naøo cuõng coù theå duøng ñöôïc.Taän duïng haï taàng cô sôû coù saün trong heä thoáng thoâng tin lieân laïc qua maïng ñieän thoaïi, chuùng ta coù theå phaùt trieån moät soá öùng duïng maø cho pheùp ngöôøi söû duïng coù theå khai thaùc thoâng tin chæ qua maùy ñieän thoaïi noái vôùi maïng ñieän thoaïi. Caùc loaïi dòch vuï trao ñoåi qua maïng ñieän thoaïi thöôøng ñöôïc thöïc hieän giöõa ngöôøi vaø ngöôøi nhö 1080, 116... Hieän nay, nhu caàu söû duïng caùc dòch vuï ñoù ngaøy caøng cao ñaët ra cho chuùng ta moät vaán ñeà : laøm sao ñaùp öùng ñöôïc nhu caàu ñoù maø. Coù hai caùch giaûi quyeát: Thöù nhaát : taêng cöôøng theâm ñieän thoaïi vaø ñieän thoaïi vieân nhaèm ñaûm baûo caùc cuoäc goïi cuûa khaùch haøng ñeán dòch vuï khoâng bò quaù taûi. Thöù hai : chuyeån sang höôùng töï ñoäng caùc dòch vuï thoâng tin ñoù döïa treân maùy tính. Caû hai caùch giaûi quyeát naøy ñeàu phaûi duøng laïi cô sôû haï taàng ñeå ñaûm baûo chi phí caûi taïo dòch vuï laø thaáp nhaát. Tuy nhieân, caùch thöù nhaát toán keùm chí phí hôn :bao goàm phí laép ñaët ñieän thoaïi, chi phí tuyeån ñieän thoaïi vieân, löông boång haøng thaùng cho ñieän thoaïi vieân. Trong khi caùch thöù hai chæ caàn moät maùy tính söû duïng cô sôû döõ lieäu thoâng tin coù saün, moät phaàn cöùng chuyeân duïng, vaø moät phaàn meàm quaûn lyù. Vieäc löïa choïn caùch giaûi quyeát naøo tuøy thuoâc vaøo tình hình cuï theå cô sô haï taàng cuûa töøng dòch vuï vaø höôùng phaùt trieån cuûa dòch vuï ñoù. Maët khaùc, baûn thaân ngöôøi laøm kyõ thuaät cuõng phaûi caân nhaéc veà hieäu quaû cuûa giaûi phaùp (chi phi xaây döïng, vaän haønh, baûo trì) vaø khaû naêng phaùt trieån cuûa giaûi phaùp theo söï môû roäng cuûa dòch vuï. Vaán ñeà lôùn ñaët ra ôû ñaây ñöôïc cuï theå hoùa vaøo dòch vuï 116 cuûa böu dieän thaønh phoá. Dòch vuï 116 coù chöùc naêng giaûi ñaùp soá ñieän thoaïi töø teân vaø ñòa chæ thueâ bao vaø ngöôïc laïi, töø teân vaø ñòa chæ thueâ bao, cho ngöôøi goïi bieát ñöôïc soá ñieän thoaïi cuûa chuû thueâ bao ñoù. Dòch vuï naøy hieän nay ñang quaù taûi vì soá cuoäc goïi yeâu caàu giaûi ñaùp thoâng tin ngaøy caøng nhieàu. PHAÀN MOÄT THÖÏC TRAÏNG VAØ GIAÛI PHAÙP CHO HEÄ THOÁNG 116 THÖÏC TRAÏNG CUÛA DÒCH VUÏ 116 : Hieän nay, moïi thoâng tin giaûi ñaùp cho ngöôøi goïi ñeàu ñöôïc thöïc hieän thoâng qua Ñieän thoaïi vieân. Moãi Ñieän thoaïi vieân coù moät maùy ñieän thoaïi vaø moät maùy tính, thoâng qua maùy ñieän thoaïi Ñieän thoaïi vieân coù theå giao tieáp vôùi ngöôøi goïi, thoâng qua maùy tính Ñieän thoaïi vieân coù theå truy xuaát döõ treân maïng tuøy theo yeâu caàu cuûa ngöôøi goïi. Ôû ñaây, Ñieän thoaïi vieân ñoùng vai troø trung gian trong vieäc chuyeån tieáp döõ lieäu töø maùy tính leân maïng ñieän thoaïi ñeán vôùi ngöôøi goïi. Caùc thaønh phaàn trong dòch vuï 116 : Database server: chöùa döõ lieäu vaø gôûi traû döõ lieäu khi coù yeâu caàu. Hub. Maùy tính: ñöôïc duøng bôûi Ñieän thoaïi vieân ñeå truy xuaát döõ lieäu. Maùy ñieän thoaïi: ñöôïc duøng bôûi Ñieän thoaïi vieân ñeå giao tieáp vôùi ngöôøi goïi. ACD (Automatically Call Distribution) : phaân phoái caùc cuoäc goïi töï ñoäng ñeán caùc Ñieän thoaïi vieân. Sô ñoà maïng 116 chöa baùn töï ñoäng. Ñeå caûi taïo dòch vuï, ta coù hai caùch giaûi quyeát ñaõ neâu trong phaàn ñaët vaán ñeà. Giaûi phaùp töï ñoäng hoùa dòch vuï 116 laø giaûi phaùp ñöôïc öu tieân leân haøng ñaàu vì tính khaû thi, vaø söï hieäu quaû cuûa noù veà maët kinh teá cuõng nhö veà maët kyõ thuaät. Vieäc töï ñoäng hoùa dòch vuï 116 thöïc chaát laø vieäc thöïc hieän quaù trình trao ñoåi giöõa ngöôøi vaø maùy. Ôû ñaây ngöôøi söû duïng chæ trao ñoåi thoâng qua maùy ñieän thoaïi. Do vieäc trao tröïc tieáp qua gioïng noùi vôùi con ngöôøi laø raát khoù khaên, khoâng theå thöïc hieän ñöôïc ôû ñaây. Vì vaäy thoâng tin maø ngöôøi söû duïng cung caáp cho maùy chæ qua caùc phím treân maùy ñieän thoaïi. Do soá löôïng phím treân maùy ñieän thoaïi coù giôùi haïn, thoâng tin cung caáp cho maùy chæ goùi goïn ôû vieäc nhaäp vaøo soá ñieän thoaïi cuøng moät soá toå quy ñònh tröôùc cho moät soá chöùc naêng naøo ñoù. Do vaäy, vieäc töï ñoäng hoùa dòch vuï 116 chæ döøng laïi ôû möùc ñoä baùn töï ñoäng. Maùy chæ nhaän bieát vaø chuyeån ñoåi thoâng tin töø soá ñieän thoaïi sang teân vaø ñòa chæ thueâ bao do ngöôøi goïi nhaäp vaøo; coøn vieäc chuyeån ñoåi ngöôïc laïi ñöôïc töï ñoäng keát noái sang Ñieän thoaïi vieân ñeå thöïc hieän. GIAÛI PHAÙP BAÙN TÖÏ ÑOÄNG DÒCH VUÏ 116 . Khi ñaõ ñöôïc baùn töï ñoäng, vai troø cuûa caùc Ñieän thoaïi vieân ñöôïc giaûm bôùt moät nöûa, chæ caùc cuoäc goïi yeâu caàu cho bieát soá ñieän thoaïi ñöôïc chuyeån ñeán Ñieän thoaïi vieân, caùc thao taùc thöïc hieän cuûa Ñieän thoaïi vieân y nhö laø chöa baùn töï ñoâng. Coøn caùc cuoäc goïi yeâu caàu veà ñòa chæ thì ñöôïc xöû lyù töï ñoäng, luùc naøy quaù trình trao ñoåi ñöôïc thöïc hieän giöõa ngöôøi vaø maùy. Noùi caùch khaùc, caùc thieát bò vaø chöông trình xöû lyù ôû ñaây ñoùng vai troø cuûa moät Ñieän thoaïi vieân. Ñeå thöïc hieän quaù trình chuyeån keát noái giöõa ngöôøi goïi vôùi chöông trình xöû lyù töï ñoäng vaø Ñieän thoaïi vieân coù hai caùch ñeå thöïc hieän. Thöù nhaát, quaù trình naøy do chöông trình xöû lyù töï ñoäng xöû lyù theo yeâu caàu cuûa ngöôøi goïi, nghóa laø sau khi giao tieáp vôùi chöông trình xöû lyù, neáu ngöôøi goïi coù nhu caàu trao ñoåi vôùi Ñieän thoaïi vieân thì chöông trình seõ keát noái vôùi Ñieän thoaïi vieân. Thöù hai, quaù trình naøy ñöôïc xaùc ñònh ngay töø ñaàu. Khi khaùch haøng goïi vaøo 116 thì seõ ñöôïc yeâu caàu choïn moät trong hai chöùc naêng cuûa ñaøi 116. Neáu coù yeâu caàu veà teân vaø ñòa chæ cuûa thueâ bao thì seõ ñöôïc chöông trình xöû lyù giaûi quyeát, neáu coù yeâu caàu veà soá ñieän thoaïi thì seõ chuyeån qua trao ñoåi vôùi Ñieän thoaïi vieân. Trong tröôøng hôïp thöù hai naøy chöông trình xöû lyù coi nhö nhaän caùc cuoäc goïi goïi vaøo moät soá ñieän thoaïi coá ñònh, vieäc chuyeån ñoåi cuoäc goïi nhö theá naøo chöông trình khoâng quan t aâm. Tuøy theo caùch ñöa chöùc naêng keát noái vôùi Ñieän thoaïi vieân vaøo trong hay ngoaøi chöông trình xöû lyù maø öùng duïng cuûa ta theâm hay bôùt chöùc naêng. Neáu ñöa ra ngoaøi thì chöông trình ñôn giaûn hôn vaø veà maët öùng duïng trong thöïc teá thì noù phuø hôïp hôn. Luùc naøy, coù theå xem ñaây laø moät dòch vuï coù moät chöùc naêng ñoäc laäp, chæ cung caáp thoâng tin veà teân vaø ñòa chæ cuûa caùc thueâ bao vaø coù theå gaùn cho dòch vuï naøy moät soá ñieän thoaïi naøo ñoù. Caùch thöïc hieän naøy phaân ñònh roõ chöùc naêng cuûa caùc dòch vuï coù theå giuùp cho ngöôøi goïi söû duïng deã daøng ñoàng thôøi quaûn lyù caùc dòch vuï ñöôïc deã daøng. Coøn neáu ñöa keát noái vaøo beân trong thì seõ goäp hai chöùc naêng laïi trong moät chöông trình, luùc naøy coù söï keát hôïp giöõa laøm baèng tay vaø laøm baèng maùy cho neân quaù trình quaûn lyù dòch vuï seõ gaëp nhieàu khoù khaên hôn. Tuøy theo caùch choïn maø chöông trình coù theâm chöùc naêng, coøn caùc chöùc naêng cô baûn thì vaãn khoâng ñoåi. Caùc thaønh phaàn trong dòch vuï 116 khi ñaõ ñöôïc baùn töï ñoäng: Caùc thaønh phaàn khi chöa baùn töï ñoäng. Maùy tính vaø moät Card chuyeân duïng ñeå xöû lyù töï ñoäng. Sô ñoà maïng 116 baùn töï ñoäng (xöû lyù keát noái beân ngoaøi) Sô ñoà 116 ñaõ baùn töï ñoäng (xöû lyù keát noái beân trong) Khi ñaõ ñöôïc baùn töï ñoäng, phaàn chöông trình xöû lyù baùn töï ñoäng hoaït ñoäng gioáng nhö moät Ñieän thoaïi vieân. Hoaït ñoäng cuûa Ñieän thoaïi vieân: Ñieän thoaïi vieân chôø caùc cuoäc goïi. Ñieän thoaïi vieân nhaác maùy ñieän thoaïi khi coù moät cuoäc goïi ñeán. Chaøo hoûi. Laéng nghe yeâu caàu cuûa ngöôøi goïi. Ñieän thoaïi vieân truy tìm döõ lieäu treân maïng thoâng qua maùy tính. Ñoïc keát quaû traû lôøi cho ngöôøi goïi. Quaù trình trao ñoåi laëp laïi töø böôùc 3 ñeán böôùc 6. Khi quaù trình trao ñoåi keát thuùc, Ñieän thoaïi vieân gaùc maùy vaø quay laïi böôùc ban ñaàu. Vì quaù hoaït ñoäng cuûa chöông trình xöû lyù gioáng nhö quaù trình hoaït ñoäng cuûa Ñieän thoaïi vieân, neân chöông trình xöû lyù phaûi coù caùc chöùc naêng ñeå thöïc hieän caùc thao taùc maø baûn thaân Ñieän thoaïi vieân thöïc hieän vaø Ñieän thoaïi vieân duøng ñeå thöïc hieän nhö giao tieáp, phaùt aâm, truy tìm döõ lieäu. Caùc Chöùc Naêng Cuûa Öùng Duïng: Ñeå thay theá ñöôïc Ñieän thoaïi vieân, chöông trình xöû lyù phaûi thöïc hieän ñöôïc 3 nhoùm chöùc naêng chính sau: Giao tieáp qua maïng ñieän thoaïi. Truy tìm döõ lieäu. Phaùt aâm. Söï keát hôïp cuûa 3 nhoùm chöùc naêng treân laïi vôùi nhau seõ taïo neân moät “Ñieän thoaïi vieân aûo”. Giao Tieáp Qua Ñieän Thoaïi Coù nhieäm vuï quaûn lyù caùc cuoäc goïi, xöû lyù caùc söï kieän khaùc nhau xaûy ra maïng ñieän thoaïi, gôûi/nhaän thoâng tin trao ñoåi giöõa ngöôøi goïi vaø chöông trình xöû lyù. Do maùy tính khoâng theå keát noái tröïc tieáp vôùi maïng ñieän thoaïi qua caùc coång song song hay noái tieáp maø phaûi qua Modem hay moät thieát bò trung gian naøo ñoù coù theå keát noái maùy tính vôùi maïng ñieän thoaïi. Vì vaäy, muoán giao tieáp tröïc tieáp vôùi maïng ñieän thoaïi ta phaûi duøng theâm moät boä phaän trung gian naøo ñoù. Coâng ty Dialogic coù saûn xuaát moät soá Card chuyeân duøng cho caùc öùng duïng trong heä thoáng Maùy tính ñieän thoaïi (Telephony Computer) raát phuø hôïp vôùi yeâu caàu cuûa öùng duïng naøy. Do vaäy, ôû ñaây ta seõ söû duïng moät trong caùc Card do coâng ty Dialogic saûn xuaát (Dialogic Card) ñeå laøm trung gian thöïc hieän quaù trình giao tieáp naøy. Nhö vaäy, Dialogic Card ñoùng vai troø heát söùc quan troïng trong öùng duïng naøy, caùc chöùc naêng maø Dialogic Card hoã trôï nhieàu hay ít seõ laøm cho quaù trình giao tieáp trong öùng duïng cuûa ta thuaän tieän hay khoù khaên. Vaø chöông trình giao tieáp seõ döïa vaøo caùc chöùc naêng cuûa noù, qua ñoù thöïc hieän quaù trình giao tieáp. Truy Tìm Döõ Lieäu Treân Maïng Maùy Tính: Toaøn boä thoâng tin veà caùc thueâ bao ñöôïc chöùa trong moät cô sôû döõ lieäu vaø ñöôïc ñaët treân moät maùy chuû (Database Server). Taát caû caùc thoâng tin maø chöông trình xöû lyù caàn ñeàu naèm treân Databae Server. Ñeå ñaùp öùng yeâu caàu cuûa ngöôøi goïi, Chöông trình xöû lyù döïa vaøo caùc thoâng tin maø ngöôøi goïi cung caáp, tìm kieám thoâng tin treân Database Server. Nhö vaäy, Chöông trình xöû lyù ñoùng vai troø cuûa moät Client giao tieáp vôùi Database Server thöïc hieän quaù trình gôûi/nhaän döõ lieäu ñeå laáy thoâng tin caàn thieát. Vaø thoâng tin laáy ñöôïc ôû ñaây laø ôû daïng chöõ (text). Phaùt Aâm: Vì ñaây laø moät quaù trình giao tieáp giöõa ngöôøi vaø maùy qua maïng ñieän thoaïi, con ngöôøi chæ coù theå tieáp nhaän thoâng tin baèng aâm thanh, cuï theà theo ôû ñaây laø tieáng Vieät. Do ñoù, moät khi ñaõ coù ñöôïc thoâng tin ôû daïng chöõ (text) trong quaù trình tìm kieám thoâng tin ôû treân, caàn phaûi chuyeån ñoåi sang daïng aâm thanh töông öùng ñeå cho ngöôøi goïi hieåu ñöôïc. Toùm laïi, chöùc naêng chính ôû ñaây laø laøm sao chuyeån töø daïng chöõ vieát sang daïng tieáng noùi töông öùng vôùi chöõ vieát ñoù (Text to Speech). SÔ ÑOÀ CHÖÙC NAÊNG CUÛA CHÖÔNG TRÌNH XÖÛ LYÙ: Sô ñoà bao goàm 3 khoái chính : “giao tieáp” , “tìm kieám noäi dung” vaø “tìm kieám döõ lieäu aâm”. Moãi khoái mang moät chöùc naêng rieâng, ñoäc laäp vôùi caùc khoái khaùc. Ba khoái naøy mang ba chöùc naêng nhö ñaõ phaân tích ôû treân, trong ñoù khoái “giao tieáp” goïi hai khoái coøn laïi ñeå thöïc hieän caùc yeâu caàu. Tuøy theo chöùc naêng keát noái qua Ñieän thoaïi vieân ñöôïc ñöa vaøo beân trong hay beân ngoaøi chöông trình xöû lyù maø quaù trình hoaït ñoäng cuûa chöông trình coù söï thay ñoåi. Hoaït ñoäng cuûa Chöông trình xöû lyù theo sô ñoà chöùc naêng khi söï keát noái ñöôïc ñöa vaøo beân trong: Khoái “giao tieáp” thöïc hieän chöùc naêng giao tieáp giöõa ngöôøi vaø maùy. K hi coù cuoäc goïi vaøo, khoái naøy phaùt ra yeâu caàu choïn loaïi thoâng tin naøo caàn laáy, khi ngöôøi goïi choïn moät trong hai, chöông trình kieåm tra söï choïn löïa. Neáu laø yeâu caàu tìm soá ñieän thoaïi, Chöông trình xöû lyù töï ñoäng chuyeån cuoäc goïi ñeán Ñieän thoaïi vieân, Chöông trình xöû lyù chæ giaùm saùt cuoäc goïi, neáu vaøo thôøi ñieåm naøy ngöôøi goïi coù yeâu caàu veà ñòa chæ, thì Chöông trình xöû lyù ngaét cuoäc goïi naøy vaø chuyeån sang cheá ñoä xöû lyù töï ñoäng. Neáu laø yeâu caàu tìm ñòa chæ, Chöông trình xöû lyù yeâu caàu ngöôøi goïi nhaäp soá ñieän thoaïi qua caùc phím treân maùy ñieän thoaïi, khi ngöôøi goïi nhaäp xong, noù laáy soá ñieän thoaïi naøy gôûi cho khoái “tìm kieám”. Khi khoái “tìm kieám” nhaän ñöôïc soá ñieän thoaïi, noù laäp töùc tìm kieám caùc thoâng tin coù lieân quan ñeán chuû thueâ bao cuûa soá ñieän thoaïi naøy, noù thieát laäp caàu noái ñeán Database Server ñeå nhaän döõ lieäu veà. Moät khi ñaõ coù chuoãi thoâng tin naøy noù lieàn gôûi ngay cho khoái “tìm kieám döõ lieäu aâm” vaø tieáp chôø soá ñieän thoaïi khaùc do khoái “giao tieáp” gôûi ñeán. Moät khi coù ñöôïc chuoãi thoâng tin do “tìm kieám” gôûi ñeán, qua thö vieän aâm coù saün, khoái naøy seõ chuyeån noäi dung cuûa thoâng tin naøy sang daïng aâm vôùi moät cô cheá naøo ñoù. Sau ñoù khoái “tìm kieám döõ lieäu aâm” seõ chuyeån toaøn boä thoâng tin daïng aâm naøy cho khoái “giao tieáp”. Cuoái cuøng, khi ñaõ coù döõ lieäu aâm, khoái “giao tieáp” seõ phaùt noù leân maïng ñieän thoaïi ñeán vôùi nguôøi nghe, keát thuùc moät chu trình xöû lyù. Beân caïnh caùc khoái chính naøy, coøn coù caùc khoái phuï khaùc phuïc vuï cho 3 khoái chính naøy. Caùc khoái con naøo hoã trôï cho khoái chính naøo thì ta boû luoân vaøo khoái chính ñoù vaø cuoái cuøng chæ taïo neân 3 nhoùm chính. Baûng Phaàn 1 III (sô ñoà khoái chöùc naêng xöû lyù keát noái beân trong) Hoaït ñoäng cuûa Chöông trình xöû lyù theo sô ñoà chöùc naêng khi söï keát noái ñöôïc ñöa ra beân ngoaøi: ôû ñaây chæ coù khoái “giao tieáp” laø thay ñoåi. Tuy nhieân caùc chöùc naêng cuûa noù khoâng coù gì thay ñoåi ngoaøi tröø vieäc phaùt ra thoâng baùo yeâu caàu khaùch haøng coù trao ñoåi vôùi Ñieän thoaïi vieân hay khoâng vaø thöïc hieän keát noái neáu coù. Baûng Phaàn 1 III (xöû lyù beân ngoaøi) KEÁT LUAÄN Töø quaù trình phaân tích Chöông trình xöû lyù ôû möùc toaøn cuïc nhö treân, ta phaân chia toaøn boä chöông trình thaønh 3 Module chính : Giao tieáp qua maïng ñieän thoaïi, Truy xuaát döõ lieäu qua maïng cuïc boä vaø Phaùt aâm. Giao tieáp qua maïng ñieän thoaïi : thöïc hieän toaøn boä quaù trình giao tieáp vôùi ngöôøi goïi treân maïng ñieän thoaïi; nhaän yeâu caàu cuûa ngöôøi goïi vaø thoâng baùo keát quaû cho ngöôøi goïi; coù hoaëc khoâng töï ñoäng chuyeån cuoäc goïi ñeán Ñieän thoaïi vieân khi caàn thieát vaø traû veà cho quaù trình xöû lyù töï ñoäng khi coù yeâu caàu. Truy xuaát döõ lieäu qua maïng cuc boä: thöïc hieän quaù trình tìm kieám thoâng tin coù lieân quan ñeán chuû thueâ bao cuûa soá ñieän thoaïi töø soá ñieän thoaïi ñoù ñaët treân Database Server thoâng qua moät maïng cuïc boä. Phaùt aâm: chuyeån ñoåi döõ lieäu töø daïng chöõ (Tieáng vieät) sang daïng aâm(Tieáng vieät öùng vôùi caùc chöõ ñoù). Trong 3 module treân, module “Giao tieáp qua maïng ñieän thoaïi” nhaän yeâu caàu töø ngöôøi goïi vaø seõ goïi 2 module coøn laïi ñeå cuoái cuøng coù ñöôïc döõ lieäu daïng aâm vaø phaùt leân maïng ñieän thoaïi, traû lôøi cho ngöôøi goïi. Moät trong nhöõng ñieàu thuaän tieän trong vieäc phaân chia caùc module treân laø tính ñoäc laäp cuûa caùc module. Moãi module seõ thöïc hieän moät chöùc naêng rieâng bieät coù theå hieän thöïc moät caùch ñoäc laäp vôùi nhau. Moãi module seõ coù moät ñaàu vaøo vaø moät ñaàu ra, trong ñoù module chính laø “Giao tieáp qua maïng ñieän thoaïi” seõ goïi hai module coøn laïi ñeå thöïc hieän quaù trình xöû lyù PHAÀN HAI CÔ SÔÛ LYÙ THUYEÁT GIAO TIEÁP QUA MAÏNG ÑIEÄN THOAÏI CHÖÔNG 1 GIÔÙI THIEÄU: Ôû chöông tröôùc, ta ñaõ phaân tích chöông trình ra caùc module khaùc nhau, trong chöông naøy ta tìm hieåu caùc noäi dung coù lieân quan ñeán module thöù nhaát – “Giao tieáp qua maïng ñieän thoaïi”. Moät trong caùc thaønh phaàn phaàn cöùng quan troïng coù lieân quan laø Dialogic Card. Loaïi Card bao goàm nhieàu loaïi, moãi loaïi coù caùc chöùc naêng khaùc nhau, coù theå hoã trôï cho nhieàu loaïi öùng duïng khaùc nhau, nhöng noùi chung bao goàm moät soá ñaëc ñieåm nhö sau: keát noái tröïc tieáp ñeán ñöôøng daây ñieän thoaïi, töï ñoäng traû lôøi caùc cuoäc goïi ñeán, goïi caùc cuoäc goïi ñi…Noù coù theå caøi ñaët treân maùy PC XT/AT (ISA/PCI bus), chaïy treân moâi tröôøng MS-DOS, Windows NT/ 95, OS/2 vaø UNIX. Moãi loaïi Card bao goàm moät soá keânh khaùc nhau vaø moãi keânh ñöôïc keát noái vôùi 1 line ñieän thoaïi nhaát ñònh. Trong chöông naøy ta tìm hieåu hoï D/4xxx goàm 4 keânh (coù theå môû roäng cho nhieàu keânh baèng caùch söû duïng nhieàu board), hoaït ñoäng ñoàng thôøi cho 4 line ñieän thoaïi treân maïng ñieän thoaïi analog, caøi ñaët treân maùy PC chaïy treân heä ñieàu haønh Windows NT. MAÏNG ÑIEÄN THOAÏI : Moät maïng ñieän thoaïi laø moät maïng bao goàm caùc loaïi toång ñaøi ñieän thoaïi (CO – Central Office) khaùc nhau vaø caùc thueâ bao noái keát vôùi nhau. Toång Ñaøi Ñieän Thoaïi : Ñònh nghóa: Toång ñaøi ñieän thoaïi laø moät heä thoáng chuyeån maïch, noù coù nhieäm vuï keát noái caùc cuoäc lieân laïc töø thieát bò ñaàu cuoái chuû goïi (calling side) ñeán thieát bò ñaàu cuoái ñöôïc goïi (called side). Caùc lôùp toång ñaøi ñieän thoaïi: Ngöôøi goïi coù theå goïi ñeán caùc maùy ñieän thoaïi treân caùc khu vöïc khaùc nhau, do ñoù caàn coù heä thoáng chuyeån maïch töông öùng vôùi caùc khu vöïc khaùc nhau ñeå giaûm bôùt chi phí. Cho neân ngöôøi ta laäp neân caùc toång ñaøi öùng vôùi caùc lôùp khaùc nhau 5, 4, 3, 2, 1 ñaët töông öùng ôû caùc trung taâm khaùc nhau trung taâm chuyeån tieáp ñaàu cuoái, trung taâm ñöôøng daøi, trung taâm caáp moät, trung taâm vuøng, trung taâm mieàn. Trung taâm chuyeån tieáp ñaàu cuoái laø nôi caùc thueâ bao noái keát tröïc tieáp ñeán qua moät sôïi daây xoaén ñoâi thöôøng ñöôïc goïi laø ñöôøng daây thueâ bao. Khi moät thueâ bao goïi cho moät thueâ bao khaùc. Neáu thueâ bao ñöôïc goïi cuøng keát noái trong cuøng moät trung taâm chuyeån tieáp ñaàu cuoái thì trung taâm naøy töï ñoäng keát noái caùc maùy naøy laïi vôùi nhau. Neáu thueâ bao ñöôïc goïi khoâng ôû trung taâm naøy thì noù seõ nhôø caùc trung taâm khaùc ôû caùc möùc cao hôn chuyeån maïch giuùp. Caùc trung taâm chuyeån tieáp ôû caùc möùc ñoä khaùc nhau seõ keát noái caùc thueâ bao ôû caùc vuøng xa gaàn khaùc nhau. Ngoaøi ra ngöôøi ta coøn duøng caùc trung keá ñeå giaûm taûi khi löu löôïng cuoäc goïi leân cao. Phaân loaïi toång ñaøi: Coù hai tieâu chaån ñeå phaân loaïi toång ñaøi : theo coâng ngheä cheá taïo vaø theo caáu truùc maïng ñieän thoaïi. Theo coâng ngheä cheá taïo, ta coù toång ñaøi nhaân coâng vaø toång ñaøi töï ñoäng. Trong toång ñaøi nhaân coâng, coâng vieäc keát noái ñöôïc thöïc hieän bôûi Ñieän thoaïi vieân. Trong toång ñaøi töï ñoäng, vieäc chuyeån maïch ñöôïc thöïc hieän moät caùch töï ñoäng. Duø laø nhaân coâng hay töï ñoäng, hai loaïi toång ñaøi naøy ñeàu phaûi thöïc hieän caùc chöùc naêng nhö sau: Nhaän bieát nhu caàu goïi cuûa thueâ bao goïi, ñoàng thôøi ñònh vò ñöôïc thueâ bao goïi. Tröïc tieáp rung chuoâng cho thueâ bao ñöôïc goïi. Trong tröôøng hôïp thueâ bao ñöôïc goïi baän, phaùt tín hieäu traû lôøi cho thueâ bao goïi bieát. Khi thueâ bao ñöôïc goïi nhaác maùy, cho pheùp hai thueâ bao thoâng thoaïi, vaø thöïc hieän coâng vieäc giaùm saùt. Neáu moät trong hai thueâ bao gaùc maùy, caét thoâng thoaïi, baùo cho thueâ bao coøn laïi bieát cuoäc ñaøm thoaïi ñaõ chaám döùt. Theo caáu truùc maïng ñieän thoaïi, ta coù theå phaân theo 5 loaïi nhö sau: Toång ñaøi cô quan PABX (Private Automatic Branch Exchange): ñöôïc söû duïng trong caùc cô quan, khaùch saïn vaø chæ söû duïng caùc trung keá C.O line. Toång ñaøi noâng thoân RE (Rural Exchange): ñöôïc söû duïng ôû caùc xaõ, khu daân cö ñoâng, chôï… vaø coù theå söû duïng caùc loaïi trung keá. Toång ñaøi noäi haït LE (Local Exchange): Ñöôïc ñaët ôû trung taâm huyeän tænh vaø söû duïng taát caû caùc loaïi trung keá. Toång ñaøi ñöôøng daøi TE (Toll Exchange): Duøng ñeå keát noái caùc toång ñaøi noäi haït ôû caùc tænh vôùi nhau, chuyeån maïch caùc cuoäc goïi ñöôøng daøi trong nöôùc khoâng coù maïch thueâ bao. Toång ñaøi cöûa ngoõ quoác teá (GateWay Exchange): Toång ñaøi naøy ñöôïc duøng choïn höôùng vaø chuyeån maïch cuoäc goïi vaøo maïng quoác teá. Ñeå noái caùc maïng quoác gia vôùi nhau. Toång Ñaøi PABX : PABX laø loaïi toång ñaøi chuyeån maïch töï ñoäng coù ñaëc tính cô baûn cuûa moät toång ñaøi ñieän thoaïi laø khaû naêng xöû lyù noái keát ñieän ñaøm. Freeman ñöa ra 8 chöùc naêng cho vieäc xöû lyù moät cuoäc goïi ñieän thoaïi: Noái keát (interconnection) Ñieàu khieån (control) Phuïc vuï (attending) Kieåm tra baän (busy testing) Baùo ñoäng (alarming) Nhaän thoâng tin (information receiving) Truyeàn thoâng tin (information transmitting) Giaùm saùt (supervisory) Maùy Ñieän Thoaïi : Nguyeân taéc caáu taïo maùy ñieän thoaïi : Maùy ñieän thoaïi laø thieát bò ñaàu cuoái cuûa heä thoáng ñieän thoaïi, noù ñöôïc laép ñaët taïi ñôn vò thueâ bao ñeå hai ngöôøi ôû xa lieân laïc vôùi nhau. Hieän nay tuy coù nhieàu kieåu loaïi ñiey76än thoaïi nhöng moãi loaïi ñeàu phaûi coù nhöõng phaàn chính nhö sau: Phaàn chuyeån ñoåi maïch ñieän: Phaàn naøy goàm heä thoáng laù mía tieáp ñieåm vaø caùc cô kieän phuï coù nhieäm vuï ñoùng môû maïch ñieän khi coù yeâu caàu goïi. Phaàn thu phaùt tín hieäu goïi: Phaàn chính laø maïch gôûi soá vaø chuoâng. Chuoâng coù nhieäm vuï bieán doøng tín hieäu goïi thaønh tín hieäu goïi. Phaàn thu phaùt thoaïi: Goàm hai boä phaän chính laø oáng noùi vaø oáng nghe. OÁÁng noùi coù nhieäm vuï bieán ñoåi nhöõng tín hieäu aâm thanh thaønh tín hieäu ñieän vaø oáng nghe thì bieán ñoåi tín hieäu ñieän thaønh tín hieäu aâm thanh. Caû hai ñöôïc laép ñaët chung trong moät toå hôïp. Chöùc naêng chung cuûa maùy ñieän thoaïi : Ñoái vôùi moät maùy ñieän thoaïi, töø loaïi nhaân coâng coå ñieån ñeán loaïi töï ñoäng ñieän töû hieän ñaïi ñeàu phaûi thöïc hieän ñöôïc caùc chöùc naêng cô baûn sau: Baùo hieäu cho ngöôøi söû duïng ñieän thoaïi bieát laø heä thoáng toång ñaøi ñaõ saün saøng hay chöa saün saøng tieáp nhaän cuoäc goïi. Chöùc naêng naøy theå hieän ôû choã phaûi baùo cho ngöôøi söû duïng ñieän thoaïi baèng aâm hieäu môøi quay soá hay aâm hieäu baùo baän. Phaûi gôûi ñöôïc maõ soá cuûa thueâ bao bò goïi vaøo toång ñaøi. Ñieàu naøy ñöôïc thöïc hieän baèng caùch quay soá hay nhaán phím. Chæ daãn cho ngöôøi söû duïng bieát tình traïng dieãn bieán keát noái baèng caùc aâm hieäu hoài aâm chuoâng hoaëc baùo baän. Baùo hieäu cho ngöôøi söû duïng bieát thueâ bao ñang bò goïi, thöôøng laø baèng tieáng chuoâng. Chuyeån ñoåi tieáng noùi thaønh tín hieäu ñieän truyeàn ñi ñeán ñoái phöông vaø chuyeån tín hieäu ñieän töø ñoái phöông ñeán thaønh tieáng noùi. Coù khaû naêng baùo cho toång ñaøi khi thueâ bao gaùc maùy. Choáng tieáng goïi laïi, tieáng keng, click khi phaùt xung quay soá. Ngoaøi ra ngöôøi ta coøn chuù yù ñeán tính naêng töï ñoäng ñieàu chænh möùc aâm thanh nghe, noùi. töï ñoäng ñieàu chænh nguoàn nuoâi, phoái hôïp trôû khaùng vôùi ñöôøng daây. Chöùc naêng naøy tröôùc kia chöa ñöôïc chuù yù laém, vì vaäy trong thöïc teá thöôøng xaûy ra tình traïng neáu ñöôøng daây thueâ bao ngaén, maùy noùi nghe lôùn vaø ngöôïc laïi. Maùy aán phím ñöôïc cheá taïo caùc boä phaän nghe noùi maø heä soá khueách ñaïi coù theå thay ñoåi tyû leä nghòch vôùi chieàu daøi ñöôøng daây. Ngoaøi caùc chöùc naêng cô baûn keå treân, ngöôøi ta coøn cheá taïo nhöõng maùy ñieän thoaïi coù khaû naêng thöïc hieän ñöôïc moät soá chöùc naêng khaùc nhö: Goïi baèng soá ruùt goïn. Nhôù soá thueâ bao ñaëc bieät. Goïi laïi töï ñoäng: khi goïi moät thueâ bao naøo ñoù maø thueâ bao naøy bò baän, ta coù theå ñaët maùy trong khi ñoù soá cuûa thueâ bao vöøa goïi ñaõ ñöôïc löu tröõ trong boä nhôù cuûa maùy ñieän thoaïi. Sau ñoù ta aán moät nuùt töông öùng laø soá ñieän thoaïi vöøa goïi naøy cuõng ñöôïc töï ñoäng phaùt ñi, khi thueâ bao roãi thì maùy töï ñoäng reo chuoâng caû hai phía…. Phaân loaïi caùc kieåu maùy ñieän thoaïi : Phaân loaïi theo phöông phaùp tieáp daây: Maùy ñieän thoaïi nhaân coâng: Lieân laïc qua toång ñaøi nhaân coâng, goàm coù hai loaïi: Maùy ñieän thoaïi töø thaïch: nguoàn cung caáp ñeå ñaøm thoaïi vaø ñeå goïi chuoâng ñeàu ñöôïc trang bò taïi töøng maùy leõ, nguoàn ñaøm thoaïi thöôøng duøng pin, nguoàn goïi chuoâng laø maùy phaùt ñieän magneùto. Maùy ñieän thoaïi coäng ñieän: Nguoàn cung caáp ñeå ñaøm thoaïi vaø ñeå goïi chuoâng ñeàu ñaët taïi toång ñaøi, söû duïng nguoàn moät chieàu 24V Maùy ñieän thoaïi töï ñoäng: Lieân laïc vôùi nhau qua toång ñaøi töï ñoäng baèng caùch quay soá hoaëc aán phím gôûi soá. Nguoàn cung caáp ñeå ñaøm thoaïi laø nguoàn moät chieàu 48V hoaëc 60V. Nguoàn ñeå goïi chuoâng 90V - 110VAC, taàn soá 16Hz - 25Hz. Phaân loaïi theo tính naêng söû duïng: Maùy ñeå baøn. Maùy treo töôøng. Maùy ñi ñöôøng. Maùy duøng trong haàm moû, taøu bieån…. Caùc kieåu maïch cuûa maùy ñieän thoaïi : Do nhöõng yeâu caàu kyõ thuaät vaø chaát löôïng ñaøm thoaïi neân maïch ñieän cuûa caùc loaïi maùy ñieän thoaïi thöôøng coù nhöõng daïng sau: Maïch ñieän töû kieåu hôû maïch: daïng maïch ñieän naøy ôû traïng thaùi khoâng laøm vieäc phaàn thu phaùt thoaïi hôû maïch coøn phaàn thu tín hieäu noái thoâng vôùi ñöôøng daây. Maïch ñieän töû kieåu ngaén maïch: daïng maïch ñieän naøy ôû traïng thaùi khoâng laøm vieäc phaàn thu phaùt thoaïi bò ngaén maïch coøn phaàn thu tín hieäu goïi ñöôïc ñaáu saún leân ñöôøng daây. Yeâu caàu veà maïch ñieän cuûa maùy ñieän thoaïi : Baát cöù loaïi maùy ñieän thoaïi naøo veà maïch ñieän nguyeân lyù cuõng phaûi thoûa maõn ba yeâu caàu sau: Khi maùy ñieän thoaïi khoâng laøm vieäc phaûi ôû tình traïng saün saøng tieáp nhaän cuoäc goïi. Nghóa laø boä phaän thu phaùt tín hieäu goïi ñöôïc noái saün leân ñöôøng daây, coøn boä phaän thu phaùt tín hieäu thoaïi phaûi taùch rôøi ñeå traùnh tieâu hao naêng löôïng. Khi thu tín hieäu goïi boä phaän thu phaùt tín hieäu goïi laïi phaûi taùch ra khoûi ñöôøng daây ñieän, luùc ñoù treân ñöôøng daây chæ coøn coù doøng tín hieäu goïi. Khi thu phaùt tín hieäu ñaøm thoaïi boä phaän thu phaùt tín hieäu goïi laïi phaûi taùch ra khoûi ñöôøng daây ñieän, luùc ñoù treân ñöôøng daây chæ coøn coù doøn._.g tín hieäu thoaïi. Caùc thoâng soá cuûa maùy ñieän thoaïi: Thoâng soá Caùc giaù trò maãu Giaù trò söû duïng Doøng ñieän laøm vieäc 20 ÷ 80 mA 20 ÷ 120mA Nguoàn toång ñaøi -48 ÷ - 60 V - 47 ÷ -105V Ñieän trôû voøng 0 ÷ 1300 W 0 ÷ 1600 W Suy hao 8dB 17dB Meùo daïng Toång coäng 50 dB Doøng chuoâng 90 Vrms /20 Hz 75 ÷ 90 Vrms /16 ÷25Hz Thanh aùp oáng noùi 70 – 90 dB < 15dB Nhieãu Tín hieäu giöõa thueâ bao vaø toång ñaøi : Goàm caùc aâm hieäu vaø caùc tín hieäu môøi quay soá. Caùc aâm hieäu laø caùc tín hieäu aâm thanh maø toång ñaøi gôûi tôùi caùc thueâ bao ñeå thoâng baùo, bao goàm caùc tín hieäu sau: AÂm hieäu môøi quay soá (Dial Tone): aâm hieäu naøy baùo cho thueâ bao bieát toång ñaøi saún saøng nhaän soá quay töø thueâ bao. AÂm hieäu baùo baän (Busy Tone): aâm hieäu naøy ñöôïc toång ñaøi gôûi tôùi baùo cho thueâ bao goïi bieát thueâ bao bò goïi ñang baän, trung keá baän, heát thôøi gian quay soáv.v… Hoài aâm chuoâng (Ringback Tone): toång ñaøi baùo cho thueâ bao bieát chuoâng thueâ bao ñoái phöông ñang keâu. Caùc thoâng baùo tieáng noùi: Ngoaøi caùc aâm hieäu neâu treân, trong toång ñaøi ñieän thoaïi coøn duøng caùc caâu thoâng baùo baèng tieáng noùi ñöôïc ghi saún. Quay soá: Quay soá baèng xung thaäp phaân: Caùc soá quay cuûa thueâ bao ñöôïc truyeàn ñeán toång ñaøi baèng caùch ngaét doøng ñöôøng daây theo tæ soá thôøi gian qui ñònh taïo thaønh chuoãi xung quay soá. Soá quay soá laø soá xung treân ñöôøng daây neân phöông phaùp naøy ñöôïc goïi laø phöông phaùp quay soá baèng xung thaäp phaân. Quay soá baèng tín hieäu ña taàn (DTMF ÷ Dual Tone Multi Frequency): Khi söû duïng DTMF ñeå quay soá, caùc soá ñöôïc choïn bôûi caùc coâng taéc baèng moät ma traän nuùt baám, vaø moãi caëp taàn soá rieâng ñöôïc phaùt ra ñoàng thôøi vôùi moãi soá. Kyõ thuaät gôûi soá baèng xung löôõng aâm ña taàn söû duïng hai nhoùm, moãi nhoùm coù boán taàn soá. Trong moãi nhoùm taàn soá seõ taïo ñöôïc 16 toå hôïp. Baûng nuùt nhaán: 697Hz 1 2 3 A 770Hz 4 5 6 B 852Hz 7 8 9 C 941Hz * 0 # D 1029Hz 1336Hz 1477Hz 1633Hz Ta thaáy trong baûng nuùt nhaán coù 16 nuùt, trong ñoù chæ söû duïng 12 nuùt 0 – 9 vaø hai daáu (*) vaø (#).Caùc nuùt ñöôïc xeáp thaønh boán haøng vaø ba coät, coät thöù tö goàm 4 nuùt duøng döï phoøng cho caùc chöùc naêng ñaëc bieät veà sau. Moãi haøng coù moät taàn soá thuoäc nhoùm taàn soá thaáp vaø moãi coät coù moät taàn soá cao. Khi ta nhaán moät nuùt, seõ coù hai taàn soá ñöôïc phaùt ra. Thí duï: khi nhaán soá 8 seõ phaùt ra hai taàn soá 852Hz vaø 1336Hz. Taàn soá phaùt coù theå bieán ñoäng trong khoaûng 1,5% vaø ñoä nhaïy boä thu bieán ñoäng trong khoaûng 2%. Hình treân trình baøy phöông phaùp phaân caëp taàn soá naøy. Moãi caëp taàn soá (Tone) xuaát hieän toái thieåu 40ms. Thôøi gian toái thieåu giöõa caùc soá laø 60ms. Söï quay soá baèng DTMF coù theå nhanh hôn gaáp 10 laàn so vôùi quay baèng xung thaäp phaân. Taàn soá DTMF ñaõ ñöôïc choïn kyõ ñeå ôû toång ñaøi coù laãn vôùi nhöõng aâm hieäu khaùc coù theå xuaát hieän treân ñöôøng daây. Boä thu coù nhöõng maïch loïc raát toát ñeå chæ tieáp nhaän caùc taàn soá DTMF vaø coù maïch ño thôøi gian ñeå ñaûm baûo aâm hieäu xuaát hieän trong khoaûng thôøi gian ít nhaát laø 50ms 1% tröôùc khi nhaän laïi tín hieäu DTMF. Sau khi ñöôïc noái thoâng ñeán ngöôøi goïi, boä thu ñaõ ñöôïc taùch khoûi ñöôøng daây vaø thueâ bao coù theå duøng baèng nuùt aán ñeå chænh tín hieäu DTMF ñeán ngöôøi bò goïi nhö laø maïch truyeàn ñöa soá lieäu toác ñoä thaáp. Yeâu caàu ñoái vôùi boä phaùt aâm hieäu DTMF: Ñieän aùp nguoàn nuoâi moät chieàu vaø maïch voøng phaûi ñöôïc giöõ ôû möùc oån ñònh duø maùy ôû xa hay ôû gaàn toång ñaøi. AÂm hieäu phaûi coù möùc ñieän qui ñònh. Boä phaùt aâm hieäu DTMF phaûi hoaø hôïp toång trôû toát vôùi ñöôøng daây. Maùy caàn moät boä oån aùp vaø doøng ñeå hoaït ñoäng toát vôùi moïi cöï ly maéc töø maùy ñeán toång ñaøi. Aâm hieäu môøi quay soá: Laø tín hieäu aâm thanh baùo cho ngöôøi goïi bieát toång ñaøi ñaõ saún saøng vaø ngöôøi goïi coù theå quay soá. Aâm hieäu môøi quay soá laø tín hieäu hình Sin coù taàn soá f = 425 ÷25Hz phaùt lieân tuïc cho ñeán khi baét ñaàu nhaán soá thöù nhaát. Trong tröôøng hôïp ngöôøi goïi nhaác maùy nhöng khoâng quay soá, sau 15 giaây toång ñaøi seõ ngaét aâm hieäu môøi quay soá vaø phaùt aâm hieäu baùo baän veà phía thueâ bao. AÂm hieäu baùo baän naøy seõ toàn taïi trong 60 giaây, sau ñoù tín hieäu môøi quay soá seõ ñöôïc phaùt trôû laïi 15 giaây nöõa, neáu maùy vaãn ôû traïng thaùi cuõ, toång ñaøi seõ hieåu raèng maùy bò boû ra ngoaøi vaø töï ñoäng ngaét maïch, chôø ñeán khi maùy ñöôïc ñaët trôû laïi, söï ngaét maïch naøy môùi chaám döùt. AÂm hieäu baùo baän: Laø tín hieäu aâm thanh baùo cho ngöôøi goïi bieát thueâ bao bò goïi ñang baän, cuoäc ñaøm thoaïi khoâng tieán haønh ñöôïc. Neáu caùc ñöôøng keát noái thoâng thoaïi (link) ñeàu bò baän thì toång ñaøi seõ caáp aâm hieäu baùo baän cho thueâ bao coù taàn soá f = 425 ÷ 25Hz, ngaét nhòp 0.5 giaây coù vaø 0.5 giaây khoâng. Neáu thueâ bao bò goïi ñang baän hoaëc maùy bò boû ra ngoaøi, toång ñaøi seõ cung caáp aâm hieäu baùo baän ñeán thueâ bao goïi. AÂm hieäu hoài aâm chuoâng (Ringback tone): Khi toång ñaøi caáp chuoâng cho thueâ bao bò goïi thì ñoàng thôøi cung caáp cho thueâ bao goïi aâm hieäu hoài aâm chuoâng ñeå baùo cho thueâ bao goïi bieát ñaõ keát noái vôùi thueâ bao goïi bieát ñaõ keát noái vôùi thueâ bao ñoái phöông, chôø ñoái phöông ñaøm thoaïi. AÂm hieäu naøy coù taàn soá 25Hz ñieàu cheá taàn soá 425Hz, cuøng vôùi chu kyø doøng chuoâng (2s coù, 4s khoâng). Tín hieäu chuoâng (Ringing tone): Laø tín hieäu chuoâng veà phía maùy bò goïi. Ñieän aùp tín hieäu chuoâng khoaûng 90VAC, taàn soá 25Hz, doøng chuoâng 20mA. Dialogic Card. Nhö ñaõ noùi trong phaàn giôùi thieäu, Dialogic Card bao goàm nhieàu loaïi khaùc nhau thuoäc caùc hoï(family) khaùc nhau, moãi hoï coù caùc caáu truùc, caùc chöùc naêng, ñaëc ñieåm khaùc nhau. Trong ñeà taøi naøy, ta duøng Card Dialogic/4 ñeå hieän thöïc chöông trình. Tuy nhieân, Card naøy coù nhieàu haïn cheá neân coù nhöõng yeâu caàu khoâng thöïc hieän ñöôïc, neân beân caïnh giôùi thieäu Dialogic/4 trong phaàn naøy coøn trình baøy moät soá ñaëc ñieåm cuûa caùc hoï khaùc caàn thieát cho yeâu caàu cuûa ñeà taøi ñeå coù theå môû roäng sau naøy. Moâ taû Card Dialogic/4. Caùc ñaëc ñieåm Moãi Dialogic/4 goàm 4 maïch giao tieáp ñöôøng daây ñieän thoaïi (telephone line interface circuits) cho pheùp keát noái tröïc tieáp ñeán caùc ñöôøng daây coù doøng khôûi ñoäng analog (analog loop start lines). Moãi Card goàm moät boä xöû lyù keùp (dual÷processor) goàm moät DSP (Digital Signal Processor) vaø moät con vi xöû lyù (microprocessor) , xöû lyù taát caû caùc tín hieäu ñieän thoaïi vaø thöïc hieän caùc nhieäm vuï xöû lyù caùc tín hieäu audio/voice vaø DTMF. Phaàn meàm ñöôïc naïp trong quaù trình khôûi ñoäng cho DSP giuùp cho vieäc maõ hoùa aâm thanh (voice) ôû daïng 24/32 Kb/s ADPCM hay 48/64 Kb/s PCM. Taàn soá laáy maãu vaø phöông phaùp maõ hoùa coù theå choïn cho töøng keânh khaùc nhau, moãi keânh coù theå ghi hay phaùt ra aâm thanh moät caùch ñoäc laäp cuõng nhö kieåm tra caùc traïng thaùi cuûa cuûa caùc ñöôøng daây ñieän thoaïi. Caùc ñaëc ñieåm chính cuûa Dialogic/4: Keát noái tröïc tieáp vôùi daây ñieän thoaïi. Töï ñoäng traû lôøi caùc cuoäc goïi. Kieåm tra touch÷tone. Traû lôøi caùc thoâng ñieäp tieáng noùi (voice messages) ñeán ngöôøi goïi. Soá hoùa, neùn vaø ghi tín hieäu tieáng noùi (voice signal). Goïi caùc cuoäc goïi vaø töï ñoäng baùo caùo keát quaû. Moâ taû chöùc naêng caùc thaønh phaàn : Dialogic/4 söû duïng boä xöû lyù keùp keát hôïp khaû naêng xöû lyù tín hieäu cuûa DSP vôùi chöùc naêng di chuyeån döõ lieäu vaø ra quyeát ñònh (decision÷making) cuûa con vi xöû lyù 80C188. Boä xöû lyù keùp naøy giaûm thieåu söï xöû lyù cuûa maùy tính cho pheùp phaùt trieån caùc chöông trình öùng duïng höõu hieäu hôn. Kieán truùc naøy xöû lyù caùc söï kieän thôøi gian thöïc, quaûn lyù doøng döõ lieäu ñeán caùc maùy PC ñeå cho thôøi gian ñaùp heä thoáng nhanh hôn, ruùt giaûm caùc yeâu caàu xöû lyù treân maùy PC, xöû lyù caùc tín hieäu ñieän thoaïi vaø DTMF vaø giuùp cho DSP thöïc hieän vieäc xöû lyù caùc tín hieäu cuûa caùc cuoäc goïi vaøo. Moãi “line interface” treân Dialogic/4 nhaän caùc thoâng tin veà tín hieäu ñieän thoaïi cuõng nhö tieáng noùi töø maïng ñieän thoaïi. Caùc tín hieäu ñieän thoaïi goïi vaøo (Inbound) seõ ñöôïc kieåm tra bôûi “line interface” vaø thoâng qua “control bus” ñöôïc chuyeån ñeán “control processor”. “control processor” ñaùp öùng caùc tín hieäu naøy vaø thoâng baùo öùng duïng cuûa traïng thaùi tín hieäu ñieän thoaïi naøy vaø ra leänh cho “line interface” truyeàn tín hieäu ra ngoaøi (outbound signaling) ñeán maïng ñieän thoaïi. Tín hieäu aâm thanh töø maïng ñöôïc gôûi thoâng qua caùc boä loïc, ñöôïc kieåm tra bôûi “line inteface”, roài ñöa ñeán maïch CODEC (Coder/ Decoder). CODEC loïc, laáy maãu vaø soá hoùa caùc tín hieäu analog naøy, sau ñoù göûi caùc tín hieäu ñaõ soá hoùa naøy ñeán DSP. Döïa treân firmware ñaõ ñöôïc naïp leân DSP RAM, DSP thöïc hieän quaù trình phaân tích caùc tín hieäu nhö sau vaø xöû lyù nhöõng döõ lieäu nhaäp naøy: Töï ñoäng buø theâm cho söï bieán ñoåi möùc cuûa tín hieäu audio vaøo. Aùp duïng giaûi thuaät ADPCM (Adaptive Differential Pulse Code Modulation) hay PCM (Pulse Code Modulation) ñeå neùn caùc aâm thanh ñaõ ñöôïc soá hoùa vaø löu vaøo ñóa. Kieåm tra söï hieän dieän cuûa caùc daïng soùng DTMF, MF, hay moät daïng soùng ñöôïc ñònh nghóa bôûi chöông trình öùng duïng. Kieåm tra khoaûng laëng ñeå xaùc ñònh ñöôøng daây laø im laëng hay ngöôøi goïi khoâng ñaùp öùng. Ñoái vôùi döõ lieäu ñöa ra ngoaøi, DSP thöïc hieän nhöõng taùc vuï sau: Giaûi neùn caùc döõ lieäu aâm ñaõ ñöôïc löu vaø neùn ñeå phaùt aâm (play). Ñieàu chænh aâm löôïng vaø toác ñoä phaùt aâm theo yeâu caàu cuûa ngöôøi söû duïng hay chöông trình. Taïo ra caùc daïng soùng DTMF, MF hay moät soùng naøo ñoù theo yeâu caàu. Söï keát hôïp cuûa boä xöû lyù keùp cuõng thöïc hieän vieäc goïi(dial) caùc cuoäc goïi vaø giaùm saùt quaù trình goïi: Truyeàn tín hieäu off÷hook (tín hieäu töông öùng khi ta nhaát maùy ñieän thoaïi) leân maïng ñieän thoaïi. Quay soá. Kieåm tra vaø baùo caùo keát quaû: ñöôøng daây baän hay ñuïng ñoä; chaáp nhaän, chuoâng reo, khoâng traû lôøi Ñeå ñaùp öùng laïi caùc yeâu caàu cuoäc goïi, khi phaùt ra moät file ñaõ ñöôïc löu tröõ, “control microprocessor” nhaän caùc thoâng tin tieáng noùi töø PC vaø gôûi noù ñeán DSP ñeå chuyeån file thaønh aâm thanh daïng soá. DSP gôûi aâm thanh ñaõ soá hoùa naøy ñeán CODEC ñeå chuyeån sang daïng analog vaø roài ñöa ñeán “line interface” truyeàn leân maïng ñieän thoaïi. “Microprocessor” ñieàu khieån taát caû caùc hoaït ñoäng cuûa Dialogic/4 thoâng qua local bus, thoâng dòch vaø thöïc thi leänh töø PC. Giao tieáp giöõa “microprocessor” vaø PC thoâng qua “shared RAM” maø hoaït ñoäng nhö laø input/output buffer gia taêng hieäu quaû cuûa vieäc truyeàn file. “shared RAM” naøy giao tieáp vôùi PC thoâng qua bus AT/XT. Taát caû caùc hoaït ñoäng laø Interrupt÷driven ñeå ñaùp öùng caùc yeâu caàu cuûa heä thoáng thôøi gian thöïc. Taát caû caùc board treân PC ñeàu duøng chung moät interrupt. Khi heä thoáng khôûi ñoäng firmware seõ ñöôïc naïp töø PC leân code/data RAM vaø DSP RAM. SÔ ÑOÀ KHOÁI CHÖÙC NAÊNG CUÛA DIALOGIC/4 Code/Data DRAM 80C188 Control Processor Shared RAM PC XT/AT BUS DSP DSP RAM codec Line interface IRQ Control Bus 1 of 4 shown CO/ PBX Kieán truùc Bus Thoâng tin di chuyeån treân Card thoâng qua bus cuûa noù. Coù hai loaïi bus PEB (PCM Expansion Bus) vaø SCbus (Signal Computing bus). PEB coù 32 khe thôøi gian (time slot), coøn SCbus goàm 1024 khe thôøi gian, moãi khe thôøi gian töông öùng vôùi moät ñöôøng truyeàn döõ lieäu khi döõ lieäu ñöôïc phaùt leân bus cho caùc keânh khaùc nhaän. Theo kieán truùc naøy, moãi keânh goàm hai thaønh phaàn analog vaø voice (hay digital vaø voice), trong ñoù moãi thaønh phaàn goàm hai ñöôøng truyeàn vaø nhaän (TX vaø RX). Ñoái vôùi Card giao tieáp qua maïng analog, thaønh phaàn analog laø moät interface noái keát tröïc tieáp vôùi maïng, coøn thaønh phaàn voice nhaän caùc tín hieäu töø thaønh phaàn analog. Chöùc naêng cuûa thaønh phaàn analog laø nhaän caùc tín hieäu tröïc tieáp töø maïng ñieän thoaïi, sau ñoù truyeàn cho thaønh phaàn voice nhaän bieát caùc tín hieäu naøy laø gì vaø quyeát ñònh xöû lyù noù. Söï keát hôïp cuûa hai thaønh phaàn naøy töông öùng nhö söï keát hôïp cuûa maùy ñieän thoaïi vaø ngöôøi söû duïng maùy ñoù, maùy ñieän thoaïi tröïc tieáp nhaän bieát caùc tín hieäu treân maïng vaø thoâng baùo cho ngöôøi söû duïng bieát, ngöôøi söû duïng nhaän bieát vaø xöû lyù noù. Hai thaønh phaàn analog vaø voice thuoäc cuøng moät keânh, ñöôøng TX cuûa analog coù theå noái vôùi RX cuûa voice vaø ngöôïc laïi TX cuûa voice coù theà keát noái vôùi RX cuûa analog, söï keát noái naøy thoâng qua bus vaø taïo neân söï trao ñoåi thoâng tin hai chieàu (full duplex) giöõa hai thaønh phaàn naøy trong cuøng moät keânh. Tuy nhieân, kieán truùc PEB khoâng coù nhöõng lôïi ñieåm maø SCbus coù ñöôïc. PEB chæ cho pheùp keát noái hai ñöôøng truyeàn vaø nhaän cuûa hai thaønh phaàn analog vaø voice, trong khi ñoù SCbus coù khaû naêng noái keát hai thaønh phaàn baát kyø laïi vôùi nhau. Ñieàu naøy coù nghóa laø vôùi kieán truùc SCbus hai keânh coù theå thoâng nhau, do ñoù coù theå cho hai ngöôøi goïi ñaøm thoaïi vôùi nhau thoâng qua hai keânh ñoù. Coøn ñoái vôùi PEB, ñeå laøm ñöôïc ñieàu naøy caàn coù theâm moät board chuyeån maïch nöõa (nhö DMX board÷ Digital Matric Switch board). Trong yeâu caàu cuûa ñeà taøi naøy, khi khaùch haøng coù yeâu caàu chuyeån ñoåi töø ñòa chæ sang soá ñieän thoaïi thì caàn phaûi keát noái qua Ñieän thoaïi vieân, cuõng coù nghóa laø coù cuoäc hoäi thoaïi giöõa hai ngöôøi, vì theá neáu chæ duøng Card coù kieán truùc PEB thì khoâng theå thöïc hieän ñöôïc yeâu caàu naøy. Moät keânh treân board veà maët luaän lyù coù theå xem nhö goàm hai thaønh phaàn analog vaø voice. Moãi thaønh phaàn coù moät ñöôøng truyeàn (TX) vaø moät ñöôøng nhaän (RX) , sau ñaây laø sô ñoà keát noái cuûa caùc ñöôøng truyeàn/nhaän naøy ñoái vôùi SCbus khi caùc keânh ñöôïc khôûi ñoäng vaø sau khi noái hai keânh laïi vôùi nhau. SÔ ÑOÀ KIEÁN TRUÙC BUS LUÙC KHÔÛI ÑOÄNG Scbus /1024 time slots Telephoe network Analog Device Voice Device signaling Analog chan 3 Voice chan 3 TX TX RX RX Loop start Switch handler Analog Device Voice Device signaling Analog chan 5 Voice chan 5 TX TX RX RX Loop start Switch handler SÔ ÑOÀ KIEÁN TRUÙC BUS SAU KHI NOÁI KEÁT Scbus /1024 time slots Telephoe network Analog Device Voice Device signaling Analog chan 3 Voice chan 3 TX TX RX RX Loop start Switch handler Analog Device Voice Device signaling Analog chan 5 Voice chan 5 TX TX RX RX Loop start Switch handler Caùc moâ hình laäp trình cho Card Dialogic/4 (Dialogic Card) : Ôû treân ta ñaõ giôùi thieäu veà kieán truùc phaàn cöùng cuûa card, ñeå card coù theå hoaït ñoäng ñöôïc, taát nhieân caàn coù Driver cho noù. Vaø ñeå coù theå vieát ñöôïc caùc chöông trình öùng duïng, ngöôøi ta cung caáp cho ngöôøi laäp trình caùc thö vieän giao dieän laäp trình öùng duïng (API – Application Programing Interface). Moät trong caùc ñaëc ñieåm quan troïng cuûa Card laø coù nhieàu keânh hoaït ñoäng rieâng bieät vaø ñoàng thôøi, cho neân caàn coù moät moâ hình hoaït ñoäng toát ñaûm baûo cho caùc keânh hoaït ñoäng ñoäc laäp nhau. Vaø thoâng qua SRL (Standard Runtime Library) API, ngöôøi ta cung caáp cho chuùng ta 3 moâ hình laäp trình cô baûn : ñoàng boä (Synchronous), baát ñoàng boä (Asynchronous) vaø baát ñoàng boä môû roäng (Extended Asynchronous). Trong kieåu baát ñoàng boä laïi coù nhieàu kieåu khaùc nhau. Moâ hình laäp trình Ñoàng boä (Synchronous) Baát ñoàng boä (Asynchronous) Baát ñoàng boä môû roäng (Extended Asynchronous) Window Callback Polled SRL Callback Tröôùc khi noùi veà caùc moâ hình laäp trình, ta giôùi thieäu sô löôïc veà moät soá SRL API. Giôùi thieäu SRL : SRL laø moät thö vieän chöùa caùc haøm vaø caáu truùc döõ lieäu hoã trôï cho vieäc phaùt trieån caùc öùng duïng. Chöùc naêng chính cuûa SRL laø cung caáp moät giao dieän chung cho vieäc xöû lyù caùc söï kieän vaø caùc chöùc naêng khaùc cho taát caû caùc loaïi card. Noù bao goàm moät soá nhoùm sau: Haøm quaûn lyù söï kieän (Event management C functions): cung caáp moät interface ñeå quaûn lyù caùc söï kieän treân caùc thieát bò Haøm thuoäc tính chuaån (Standard attribute C functions): traû veà caùc thoâng tin chung veà caùc thieát bò nhö teân, kieåu, loãi. Quaûn lyù ngöõ caûnh öùng duïng (Application context management): cho pheùp öùng duïng thieát laäp hay laáy thoâng soá do ngöôøi söû duïng ñònh nghóa Caáu truùc döõ lieäu chöùa baûng thoâng soá ngaét (A termination parameter table data structure). Laäp trình ñoàng boä, baát ñoàng boä,baát ñoàng boä môû roäng theo SRL: Trong laäp trình ñoàng boä, moãi haøm seõ ngöng (block) söï thöïc thi cuûa thread cho ñeán khi haøm thöïc hieän xong. Quaù trình hoaït ñoäng ôû moâ hình naøy seõ dieãn ra tuaàn töï theo moät luoàng nhaát ñònh. Trong laäp trình baát ñoàng boä, thread maø ñang goïi moät haøm seõ tieáp tuïc thöïc thi trong khi haøm ñoù ñang ñöôïc thöïc hieän. Vaø khi thöïc hieän xong, öùng duïng seõ nhaän ñöôïc moät söï kieän thoâng baùo laø ñaõ thöïc thi xong. Trong caùch laäp trình naøy, ta caàn taïo ra maùy traïng thaùi (state÷machine) goàm nhieàu traïng thaùi khaùc nhau chuyeån ñoåi nhau theo caùc söï kieän. Coøn trong laäp trình baát ñoàng boä môû roäng maø thöïc chaát laø söï bieán ñoåi cuûa laäp trình baát ñoàng boä baèng caùch taïo ra nhieàu thread vaø trong moãi thread ñoù thöïc hieän y nhö trong laäp trình baát ñoàng boä. Moâ hình laäp trình ñoàng boä Ñaây laø moâ hình ñôn giaûn nhaát, ta chæ ñôn giaûn vieát code cho moät keânh, roài sau ñoù tuøy theo ta coù bao nhieâu keânh maø taïo taïo ra baáy nhieâu thread cho moãi keânh chaïy treân code naøy. Thread 1 Thread 2 Thread 3 Thread 4 Keânh 1 Keânh 2 Keânh 3 Keânh 4 Process event dx_getevt() Theo moâ hình naøy, moãi thread seõ kieåm soaùt moät keânh, thread seõ nhaän caùc söï kieän (event) xaûy ra treân keânh ñoù vaø kieåm tra ñoù laø loaïi söï kieän gì , roài tieán haønh xöû lyù noù. Öu ñieåm cuûa moâ hình ñoàng boä: Ñaây laø moâ hình deã laäp trình vaø baûo trì nhaát, cho pheùp xaây döïng chöông trình nhanh choùng. Nhöôïc ñieåm cuûa moâ hình ñoàng boä: Bôûi vì thread chính trong process taïo ra caùc thread rieâng bieät cho moãi keânh, neân chieám giöõ nhieàu taøi nguyeân cuûa heä thoáng, ñieàu naøy coù theå giôùi haïn soá keânh söû duïng, khoù môû roäng cho nhieàu keânh. Caùc taùc vuï ñoàng boä seõ ngöng (block) quaù trình thöïc thi cuûa thread, neân thread seõ khoâng thöïc hieän ñöôïc caùc quaù trình xöû lyù khaùc. Caùc söï kieän xaûy ra maø khoâng bieát tröôùc seõ khoâng ñöôïc tieáp nhaän cho ñeán khi naøo thread thöïc hieän laïi quaù trình laáy caùc söï kieän (dx_getevt()). Ta söû duïng moâ hình naøy cho caùc luoàng ñieàu khieån ñôn giaûn vôùi moãi taùc vuï taïi moãi keânh cho töøng thôøi ñieåm, soá keânh khoâng quùa nhieàu, khoâng caàn quaûn lyù taøi nguyeân hieäu quaû. Moâ hình laäp trình baát ñoàng boä: Moâ hình naøy cho pheùp nhieàu keânh ñöôïc xöû lyù treân cuøng moät thread, vieäc söû duïng taøi nguyeân hieäu quaû hôn baèng caùch cho pheùp thread tieáp tuïc xöû lyù trong khi Driver thöïc hieän caùc haøm baát ñoàng boä maø thread ñoù ñaõ goïi. Öu ñieåm cuûa moâ hình baát ñoàng boä: Vì chæ söû duïng moät thread cho nhieàu keânh, neân tieâu toán ít taøi nguyeân heä thoáng hôn moâ hình ñoàng boä. Cho pheùp chæ söû duïng moät thread cho taát caû caùc keânh khaùc nhau thuoäc nhieàu loaïi khaùc nhau. Nhöôïc ñieåm cuûa moâ hình baát ñoàng boä: Moâ hình yeâu caàu xaây döïng moät maùy traïng thaùi (state machine) trong ñoù goàm nhieàu traïng thaùi khaùc nhau vaø quaù trình chuyeån ñoåi giöõa caùc traïng thaùi khi nhaän ñöôïc caùc söï kieän khaùc nhau, quaù trình naøy thöôøng laø phöùc taïp hôn nhieàu so vôùi xaây döïng chöông trình theo moâ hình ñoàng boä. Do thread hoaït ñoäng döïa treân caùc söï kieän maø noù nhaän ñöôïc, do ñoù ngöôøi ta cung caáp moät soá haøm ñeå xaùc ñònh keânh naøo sinh ra söï kieän ñoù vaø laáy caùc thoâng tin coù lieân quan: sr_getevtdev( ) : laáy handle cuûa keânh maø sinh ra söï kieän môùi nhaùt. sr_getevttype( ): laáy kieåu cuûa söï kieän hieän thôøi. sr_getevtdatap( ): traû veà moät con troû troû ñeán vuøng döõ lieäu cuûa söï kieän hieän thôøi. sr_getevtlen( ): laáy soá byte cuûa döõ lieäu ñöôïc troû bôûi sr_getevtdatap( ). Moät söï kieän môùi nhaát seõ laáy sau khi goïi haøm sr_waitevt(). Sau khi ñaõ xöû lyù moät söï kieän, chöông trình seõ goïi moät haøm baát ñoàng boä naøo ñoù tuøy thuoäc vaøo söï kieän ñaõ xaûy ra vaø traïng thaùi cuoái cuøng cuûa keânh coù söï kieän ñoù. Trong moâ hình baát ñoàng boä naøy, ngöôøi ta phaân chia ra laøm ba moâ hình con : Window callback, Polled,SRL callback; moãi moâ hình ñeàu xöû lyù caùc söï kieän gioáng nhau, nhöng veà caùch laáy caùc söï kieän thì khaùc nhau. Moâ hình baát ñoàng boä theo kieåu Window Callback Moâ hình naøy söû duïng “Window Message Loop” ñeå thoâng baùo cho chöông trình öùng duïng caùc söï kieän do caùc keânh sinh ra. Khi moät söï kieän xaûy ra, moät message ñaõ ñöôïc ñònh nghóa bôûi öùng duïng seõ ñöôïc ñöa leân haøng ñôïi message cuûa window (Window Message Queue). Khi message naøy ñöôïc truy caäp, öùng duïng seõ hoûi Driver cuûa Card ñeå bieát ñöôïc söï kieän naøy vaø xöû lyù. Do moãi message ñöôïc laáy trong Window Message Loop, neân ta khoâng caàn voøng laëp ñeå ñôïi caùc söï kieän xaûy ra. MO HÌNH WINDOW CALLBACK: User Message Keânh 1 a Keânh 2 Keânh 3 Keânh 4 sr_NotifyEventt() Window Message Queue Window Message Window Message_1 Window Message_2 User Message { sr_waitevt(0); sr_getevt(); kieåm tra söï kieän . } Window Message_n Laáy Message Main thread E V E N T Moâ hình naøy söû duïng haøm sr_NotifyEvent() ñeå gôûi thoâng baùo laø coù söï kieän ñeán moät cöûa soå xaùc ñònh tröôùc, khi coù moät söï kieän xaûy ra: Moät message ñaõ ñònh nghóa tröôùc ñöôïc gôûi tôùi window. Goïi haøm sr_waitevt(0) ñeå laáy söï kieän. Goïi haøm sr_getevtdev() vaø sr_getevttype() ñeå laáy keânh sinh ra söï kieän ñoù vaø kieåu cuûa noù. Goïi haøm baát ñoàng boä phuø hôïp ñeå xöû lyù. Öu ñieåm cuûa Window Callback: Keát hôïp chaët cheõ vôùi heä thoáng message trong windows. Phuïc vuï taát caû caùc söï kieän cho taát caû caùc keânh trong voøng laëp message cuûa window. Yeáu ñieåm cuûa Window Callback: Vì voøng laëp message xöû lyù taát caû caùc quaù trình neân caàn phaûi quan taâm nhieàu ñeán vieäc söû duïng caùc haøm trong window vaø khoâng goïi nhieàu haøm blocking maø coù theå maát nhieàu thôøi gian. Moâ hình baát ñoàng boä theo kieåu Polled Döôùi taùc ñoäng beän ngoaøi hay söï keát thuùc cuûa moät haøm naøo ñoù, moät söï kieän ñöôïc sinh ra, öùng duïng seõ hoûi driver cho nhöõng söï kieän nhö theá, vaø sau khi xaùc ñònh ñöôïc loaïi söï kieän gì vaø nguyeân nhaân cuûa noù, öùng duïng tieáp tuïc xöû lyù. Moâ hình naøy seõ nhaän tröïc tieáp caùc söï kieän xaûy ra vaø tuøy theo noäi dung cuûa noù noù maø ra quyeát ñònh xöû lyù. MO HÌNH POLLED EVENT Keânh 1 Keânh 2 Keânh 3 Keânh 4 kieåm tra söï kieän: sr_waitevt(0); sr_getevtdev() sr_getevttype(); . goïi haøm xöû lyù Main thread Haøm sr_waitevt() seõ ñôïi caùc söï kieän xaûy ra treân taát caû caùc keânh, khi söï kieän xaûy ra sr_waitevt() seõ unblock vaø öùng duïng tieáp tuïc kieåm tra söï kieän naøy ñeå ra quyeát ñònh xöû lyù. Trong moâ hình naøy ta caàn coù voøng laëp ñeå laáy caùc söï kieän. Moâ hình naøy laø ñieån hình cho moâ hình baát ñoàng boä, do ñoù noù coù nhöõng öu ñieåm vaø nhöôïc ñieåm noùi chung cuûa moâ hình baát ñoàng boä. Moâ hình baát ñoàng boä theo kieåu SRL Callback: Moâ hình naøy söû duïng cuøng kieåu söï kieän nhö caùc moâ hình baát ñoàng boä treân. Tuy nhieân, moät handler ( moät haøm xaùc ñònh tröôùc ) seõ xöû lyù söï kieän naøy khi chuùng xaûy ra. Thread chính cuûa öùng duïng seõ laëp voøng kieåm tra caùc event coù theå xaûy ra. Trong suoát quaù trình xaùc ñònh naøy, neáu coù event naøo thì moät handler thích hôïp seõ ñöôïc goïi. Caùc handler naøy ñöôïc xaùc ñònh trong phaàn khôûi ñoäng cuûa öùng duïng öùng vôùi moãi event ñöôïc sinh ra; khi moät handler keát thuùc, thread seõ quay veà phuïc vuï quaù trình laëp voøng nhaän caùc event khaùc. Sô ñoà cuûa moâ hình naøy: EVENT Keânh 1 Keânh 2 Keânh 3 Keânh 4 Handler_Event_1() Handler_Event_2() Handler_Event_3() Handler_Event_n() Main thread sr_waitevt() Goïi caùc handler töông öùng Theo moâ hình naøy, moãi handler seõ phuïc vuï moät event hay moät nhoùm event naøo ñoù. Söï raøng buoät naøy coù ñöôïc thoâng qua goïi haøm sr_enbhdlr( ),coøn ñeå huûy boû ta duøng haøm sr_dishdlr( ). Trong khi thieát laäp moái quan heä naøy, moät handler coù theå phuïc cho caùc tröôøng hôïp sau: Moät event cho moät keânh nhaát ñònh. Baát cöù event naøo trong moät keânh nhaát ñònh. Moät nhoùm event treân moät nhoùm keânh naøo ñoù. Öu ñieåm cuûa moâ hình SRL Callback: Do söû duïng moät thread neân yeâu caàu taøi nguyeân heä thoáng ôû möùc thaáp. Vì caùc handler hoaït ñoäng treân thread töï ñoäng sinh ra khi goi haøm sr_enbhdlr( ) (Dialogic thread) hay do ngöôøi laäp trình aùp ñaët(non÷Dialogic thread) , neáu trong non÷Dialogic thread bò block bôûi moät haøm khoâng coù trong Dialogic API, thì caùc handler vaãn phuïc vuï ñöôïc caùc event xaûy ra. Yeáu ñieåm cuûa moâ hình SRL Callback: Caàn phaûi taïo ra moät caùch naøo ñoù ñeå caùc handler coù theå truyeàn caùc event ñeán caùc thread khaùc. Moâ hình baát ñoàng boä môû roäng: Moâ hình naøy veà cô baûn laø gioáng nhö moâ hình baát ñoàng boä, ngoaïi tröø raèng öùng duïng coù theå ñieàu khieån caùc nhoùm keânh vôùi caùc thread rieâng bieät, ñeå söû duïng haøm naøy ta duøng haøm môû roäng sr_waitevtEx( ). Moâ hình naøy ñöôïc choïn khi caàn coù moät maùy traïng thaùi vaø ñôïi söï kieän xaûy ra treân moät soá keânh. Sô ñoà cuûa moâ hình: EVENT Keânh 1 Keânh 2 Keânh 3 Keânh 4 kieåm tra söï kieän: sr_waitevtEx( ); sr_getevtdev() sr_getevttype(); . goïi haøm xöû lyù Thread_1 kieåm tra söï kieän: sr_waitevtEx( ); sr_getevtdev() sr_getevttype(); . goïi haøm xöû lyù EVENT Thread_2 NHOÙM_1 NHOÙM_2 Öu ñieåm cuûa moâ hình naøy: Moâ hình naøy söû duïng moät vaøi thread cho taát caû caùc keânh, neân taøi nguyeân heä thoáng maø noù yeâu caàu khoâng cao. Coù theå nhoùm moät soá keânh coù lieân quan laïi vôùi nhau deå cuøng chaïy treân cuøng moät thread, coøn caùc keânh khaùc chaïy treân caùc thread khaùc laøm taêng ñoä meàm deûo moái quan heä giöõa caùc keânh. Yeáu ñieåm cuûa moâ hình naøy: Caàn phaûi xaây döïng maùy traïng thaùi (state machine) phöùc taïp hôn nhieàu so vôùi moâ hình ñoàng boä cuõng nhö baát ñoàng boä. Keát luaän veà caùc moâ hình laäp trình treân: Trong caùc moâ hình treân : ñoàng boä, baát ñoàng boä vaø baát ñoàng boä môû roäng, ñoä phöùc taïp khi laäp trình caøng taêng nhöng buø laïi nhöõng lôïi ñieåm do noù ñem laïi cao hôn. Moät ñaëc ñieåm quan troïng trong moâ hình ñoàng boä laø söû duïng caùc haøm ñoàng boä. Maø moät haøm ñoàng boä chæ traû veà khi noù thöïc hieän xong; do ñoù thread goïi noù seõ bò block cho ñeán khi haøm ñoù traû veà( ví duï nhö haøm dx_play(file wave) seõ traû veà khi chôi xong file aâm thanh ñoù). Do vaäy ta phaûi duøng nhieàu thread khaùc nhau phuïc vuï cho caùc keânh khaùc nhau ñeå caùc keânh coù theå hoaït ñoäng ñoàng thôøi. Ñieàu naøy daãn ñeán vieäc tieâu toán nhieàu taøi nguyeân heä thoáng. Trong moâ hình baát ñoàng boä, ta söû duïng caùc haøm baát ñoàng boä, caùc haøm naøy coù ñaëc ñieåm laø sau khi kieåm tra caùc thoâng soá , neáu ñuùng thì noù giao cho driver thöïc hieän vaø traû veà ngay, tieáp tuïc thöïc hieän caùc phaùt bieåu döôùi noù. Do vaäy thread goïi caùc haøm naøy khoâng bò block, caùc söï kieän xaûy ra treân caùc keânh ñeàu ñöôïc kieåm tra kòp thôøi. Cho neân moät thread coù theå phuïc vuï cho nhieàu keânh ñoàng thôøi neân yeâu caàu ít taøi nguyeân heä thoáng hôn, nhöng laïi ñoøi hoûi quaûn lyù caùc keânh phöùc taïp hôn. Trong moâ hình naøy laïi bao goàm caùc moâ hình khaùc nhau : Window Callback, Polled, SRL Callback; caùc moâ hình naøy ñeàu mang ñaëc tính chung cuûa moâ hình baát ñoàng boä, chæ khaùc nhau ôû caùch thöùc nhaän caùc söï kieän (event) töø caùc keânh, coøn vaán ñeà xöû lyù caùc söï kieän laø nhö nhau. Ñoái vôùi moâ hình baát ñoàng boä môû roäng, nhö teân goïi cuûa noù laø söï môû roäng cuûa moâ hình baát ñoàng boä baèng caùch duøng moät vaøi thread, moãi moät thread phuïc vuï cho moät nhoùm keânh naøo ñoù. Luùc naøy moãi thread hoaït ñoäng töông töï nhö thread trong moâ hình baát ñoàng boä. Moâ hình naøy cho pheùp keát hôïp chaët cheõ hôn nhöõng keânh coù quan heä, raøng buoät nhau vaø taùch rôøi nhöõng keânh khoâng coù lieân quan vôùi nhau. Giao dieän laäp trình öùng duïng (API) : Ñeå vieát chöông trình öùng duïng deã daøng, ngöôøi ta cung caáp cho chuùng ta moät thö vieän caùc haøm ñeå laäp trình. Chöông trình öùng duïng seõ goïi caùc haøm naøy vaø thoâng qua driver cuûa thieát bò seõ ñieàu khieån ñöôïc thieát bò phaàn cöùng cuûa Card. Moâ hình hoaït ñoäng cuûa chöông trình öùng duïng thoâng qua caùc haøm thö vieän nhö sau: Chöông trình öùng duïng Caùc haøm thö vieän khaùc Globalcall API Call control libraries ANAPI ICAPI ISDN Device driver OS Firmware Network interface Firmware Network interface PSTN Maïng ñieän thoaïi chuyeån maïch coââng coäng. SÔ ÑOÀ GIAO TIEÁP GIÖÕA API & DRIVER Nhö ñaõ xeùt veà caáu truùc phaàn cöùng cuûa Card, moãi keânh goàm hai thaønh phaàn analog vaø voice, thaønh phaàn analog noái keát tröïc tieáp vôùi maïng, coøn thaønh phaàn voice nhaän caùc tín hieäu töø thaønh phaàn analog ñeå xöû lyù, ñoàng._.6068151_A464_11D3_BB76_C25F7B96BE09__INCLUDED_) #define AFX_DLGCSYSDISPLAY1_H__56068151_A464_11D3_BB76_C25F7B96BE09__INCLUDED_ #include "\LVTNPHU\DlgcSys.h" // Added by ClassView #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 // DlgcSysDisplay1.h : header file // ///////////////////////////////////////////////////////// // // CDlgcSysDisplay dialog class CDlgcSys; class CDlgcSysDisplay : public CDialog { // Construction public: afx_msg LRESULT OnAdjustSpeedVolume(WPARAM wParam,LPARAM lParam); CDlgcSys* m_genDlgcSys; // CDlgcSys* m_genDlgcSys; afx_msg LRESULT OnDlgcInfoDisplayProcess(WPARAM nChanNum,LPARAM nState); afx_msg LRESULT OnDlgcNotifyEventProcess(WPARAM wParam,LPARAM lParam); CDlgcSysDisplay(CWnd* pParent = NULL); // standard constructor // Dialog Data //{{AFX_DATA(CDlgcSysDisplay) enum { IDD = IDD_DLGC_SYS }; CStatic m_wndChan4State; CStatic m_wndChan4Picture; CStatic m_wndChan4Info; CStatic m_wndChan3State; CStatic m_wndChan3Picture; CStatic m_wndChan3Info; CStatic m_wndChan2State; CStatic m_wndChan2Picture; CStatic m_wndChan2Info; CStatic m_wndChan1State; CStatic m_wndChan1Picture; CStatic m_wndChan1Info; CString m_strChan1Info; CString m_strChan1State; CString m_strChan2Info; CString m_strChan2State; CString m_strChan3Info; CString m_strChan3State; CString m_strChan4Info; CString m_strChan4State; //}}AFX_DATA // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CDlgcSysDisplay) public: virtual BOOL DestroyWindow(); protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support virtual void PostNcDestroy(); //}}AFX_VIRTUAL // Implementation protected: int m_nDlgcInit; // Generated message map functions //{{AFX_MSG(CDlgcSysDisplay) virtual BOOL OnInitDialog(); virtual void OnCancel(); afx_msg void OnDestroy(); //}}AFX_MSG DECLARE_MESSAGE_MAP() private: }; //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_DLGCSYSDISPLAY1_H__56068151_A464_11D3_BB76_C25F7B96BE09__INCLUDED_) ///////////////////////////////////// // DlgcSysDisplay1.cpp : implementation file // #include "stdafx.h" #include "LVTN.h" #include "DlgcSysDisplay1.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////// HWND hWnd; // Handle to Dialogic Dialog's Windows window ///////////////////////////////////////////////////////// // // CDlgcSysDisplay dialog //CDlgcSys* m_genDlgcSys; CDlgcSysDisplay::CDlgcSysDisplay(CWnd* pParent /*=NULL*/) : CDialog(CDlgcSysDisplay::IDD, pParent) { //{{AFX_DATA_INIT(CDlgcSysDisplay) m_strChan1Info = _T(""); m_strChan1State = _T(""); m_strChan2Info = _T(""); m_strChan2State = _T(""); m_strChan3Info = _T(""); m_strChan3State = _T(""); m_strChan4Info = _T(""); m_strChan4State = _T(""); //}}AFX_DATA_INIT m_genDlgcSys = ::new CDlgcSys; //Initialize CDlgcSys Object } void CDlgcSysDisplay::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDlgcSysDisplay) DDX_Control(pDX, IDC_CHAN4_STATE, m_wndChan4State); DDX_Control(pDX, IDC_CHAN4_PICTURE, m_wndChan4Picture); DDX_Control(pDX, IDC_CHAN4_INFO, m_wndChan4Info); DDX_Control(pDX, IDC_CHAN3_STATE, m_wndChan3State); DDX_Control(pDX, IDC_CHAN3_PICTURE, m_wndChan3Picture); DDX_Control(pDX, IDC_CHAN3_INFO, m_wndChan3Info); DDX_Control(pDX, IDC_CHAN2_STATE, m_wndChan2State); DDX_Control(pDX, IDC_CHAN2_PICTURE, m_wndChan2Picture); DDX_Control(pDX, IDC_CHAN2_INFO, m_wndChan2Info); DDX_Control(pDX, IDC_CHAN1_STATE, m_wndChan1State); DDX_Control(pDX, IDC_CHAN1_PICTURE, m_wndChan1Picture); DDX_Control(pDX, IDC_CHAN1_INFO, m_wndChan1Info); DDX_Text(pDX, IDC_CHAN1_INFO, m_strChan1Info); DDX_Text(pDX, IDC_CHAN1_STATE, m_strChan1State); DDX_Text(pDX, IDC_CHAN2_INFO, m_strChan2Info); DDX_Text(pDX, IDC_CHAN2_STATE, m_strChan2State); DDX_Text(pDX, IDC_CHAN3_INFO, m_strChan3Info); DDX_Text(pDX, IDC_CHAN3_STATE, m_strChan3State); DDX_Text(pDX, IDC_CHAN4_INFO, m_strChan4Info); DDX_Text(pDX, IDC_CHAN4_STATE, m_strChan4State); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CDlgcSysDisplay, CDialog) //{{AFX_MSG_MAP(CDlgcSysDisplay) ON_WM_DESTROY() //}}AFX_MSG_MAP ON_MESSAGE(WM_USER_NOTIFYEVENT,OnDlgcNotifyEventProcess) ON_MESSAGE(WM_USER_DLGCINFODISPLAY,OnDlgcInfoDisplayProcess) ON_MESSAGE(WM_USER_ADJSV,OnAdjustSpeedVolume) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////int nUpdateTestStart = 0; // Enable TestStart menu item ///////////////////////////////////////////////////////// // // CDlgcSysDisplay message handlers ///////////////////////////////////////////////////////// BOOL CDlgcSysDisplay::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here //::SendMessage(m_hWnd,WM_USER_NOTIFYEVENT,nCheck++,0); nUpdateTestStart = 1; // Gray TestStart menu item hWnd = m_hWnd; // Handle to DlgcSys Dilaog(global) m_genDlgcSys->DlgcNotifyEvent(SR_NOTIFY_ON); // Post Notify Event message to Message queue if ((m_nDlgcInit = m_genDlgcSys->DlgcInit()) != 0) // Initialize Dialogic System ::ShowWindow(hWnd,SW_SHOW); else { nUpdateTestStart = 0; // Enable TestStart menu item ::PostMessage(hWnd,WM_NCDESTROY,0,0); } return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CDlgcSysDisplay::OnCancel() { // TODO: Add extra cleanup here //::delete m_genDlgcSys; //AfxMessageBox("stop"); DestroyWindow(); nUpdateTestStart = 0; // Enable TestStart menu item //AfxMessageBox("stop oncancel"); //CDialog::OnCancel(); } void CDlgcSysDisplay::PostNcDestroy() { // TODO: Add your specialized code here and/or call the base class //AfxMessageBox("stop PostNcDestroy2"); m_genDlgcSys->DlgcNotifyEvent(SR_NOTIFY_OFF); // Disable NotifyEvent if (m_nDlgcInit != 0) m_genDlgcSys->DlgcQuit(); // Quit Dlcg System delete m_genDlgcSys; //AfxMessageBox("stop PostNcDestroy1"); CDialog::PostNcDestroy(); //AfxMessageBox("stop PostNcDestroy3"); } /////////////////////////////////////////////////////////// BOOL CDlgcSysDisplay::DestroyWindow() { // TODO: Add your specialized code here and/or call the base class return CDialog::DestroyWindow(); } void CDlgcSysDisplay::OnDestroy() { CDialog::OnDestroy(); } /////////////////////////////////////////////////////////// Handler to NotifyEvent Message /////////////////////////////////////////////////////////LRESULT CDlgcSysDisplay::OnDlgcNotifyEventProcess(WPARAM wParam, LPARAM lParam) { //AfxMessageBox("successfully"); //return 1; m_genDlgcSys->DlgcNotifyEventProcess(); // Handle to all events return 1; } /////////////////////////////////////////////////////////// Handler to Dialogic Infomation Display Message /////////////////////////////////////////////////////////LRESULT CDlgcSysDisplay::OnDlgcInfoDisplayProcess(WPARAM nChanNum, LPARAM nState) { HBITMAP hBitmap; HINSTANCE hInstance = AfxGetInstanceHandle(); switch (nState) { case ST_ONHOOK: case ST_WTRING: hBitmap = LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_ONHOOK)); switch (nChanNum) { case 1: m_strChan1Info = "Ready to accept incoming calls"; m_strChan1State = "WAITING INCOMING CALLS"; m_wndChan1Picture.SetBitmap(hBitmap); break; case 2: m_strChan2Info = "Ready to accept incoming calls"; m_strChan2State = "WAITING INCOMING CALLS"; m_wndChan2Picture.SetBitmap(hBitmap); break; case 3: m_strChan3Info = "Ready to accept incoming calls"; m_strChan3State = "WAITING INCOMING CALLS"; m_wndChan3Picture.SetBitmap(hBitmap); break; case 4: m_strChan4Info = "Ready to accept incoming calls"; m_strChan4State = "WAITING INCOMING CALLS"; m_wndChan4Picture.SetBitmap(hBitmap); break; default: break; } UpdateData(FALSE); break; case ST_INTRO: case ST_PLAY: case ST_GOODBYE: case ST_INVALID: hBitmap = LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_OFFHOOK)); switch (nChanNum) { case 1: m_strChan1Info = "Playing Introduction Message"; m_strChan1State = "INTRO - PLAY - GOODBYE - NVALID"; m_wndChan1Picture.SetBitmap(hBitmap); break; case 2: m_strChan2Info = "Playing Introduction Message"; m_strChan2State = "INTRO - PLAY - GOODBYE - NVALID"; m_wndChan2Picture.SetBitmap(hBitmap); break; case 3: m_strChan3Info = "Playing Introduction Message"; m_strChan3State = "INTRO - PLAY - GOODBYE -INVALID"; m_wndChan3Picture.SetBitmap(hBitmap); break; case 4: m_strChan4Info = "Playing Introduction Message"; m_strChan4State = "INTRO - PLAY - GOODBYE - NVALID"; m_wndChan4Picture.SetBitmap(hBitmap); break; default: break; } UpdateData(FALSE); break; case ST_MAXDTMF: hBitmap = LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_OFFHOOK)); switch (nChanNum) { case 1: m_strChan1Info = "Getting digits"; m_strChan1State = "GETDIT"; m_wndChan1Picture.SetBitmap(hBitmap); break; case 2: m_strChan2Info = "Getting digits"; m_strChan2State = "GETDIG"; m_wndChan2Picture.SetBitmap(hBitmap); break; case 3: m_strChan3Info = "Getting digits"; m_strChan3State = "GETDIG"; m_wndChan3Picture.SetBitmap(hBitmap); break; case 4: m_strChan4Info = "Getting digits"; m_strChan4State = "GETDIG"; m_wndChan4Picture.SetBitmap(hBitmap); break; default: break; } UpdateData(FALSE); break; case ST_OFFHOOK: hBitmap = LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_OFFHOOK)); switch (nChanNum) { case 1: m_strChan1Info = "Getting digits or Dialing"; m_strChan1State = "OFFHOOK"; m_wndChan1Picture.SetBitmap(hBitmap); break; case 2: m_strChan2Info = "Getting digits or Dialing"; m_strChan2State = "OFFHOOK"; m_wndChan2Picture.SetBitmap(hBitmap); break; case 3: m_strChan3Info = "Getting digits or Dialing"; m_strChan3State = "OFFHOOK"; m_wndChan3Picture.SetBitmap(hBitmap); break; case 4: m_strChan4Info = "Getting digits or Dialing"; m_strChan4State = "OFFHOOK"; m_wndChan4Picture.SetBitmap(hBitmap); break; default: break; } UpdateData(FALSE); break; default: break; } return 1; } ///////////////////////////////////////////////////////// // LRESULT CDlgcSysDisplay::OnAdjustSpeedVolume(WPARAM wParam, LPARAM lParam) { dx_adjsv(m_genDlgcSys->m_dxinfo[wParam]. chdev,SV_VOLUMETBL,SV_ABSPOS,lParam); return 0; } ///////////////////////////////////// // #if !defined(AFX_SETVOLUME_H__9F549D42_A899_11D3_BB86_FD1655A8020E__INCLUDED_) #define AFX_SETVOLUME_H__9F549D42_A899_11D3_BB86_FD1655A8020E__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 // SetVolume.h : header file // ///////////////////////////////////////////////////////////CSetVolume dialog class CSetVolume : public CDialog { // Construction public: CSetVolume(CWnd* pParent = NULL); // standard constructor // Dialog Data //{{AFX_DATA(CSetVolume) enum { IDD = IDD_SET_VOLUME }; CStatic m_wndTemp; CSliderCtrl m_wndVolume; CComboBox m_wndChannel; CString m_strChannel; int m_nVolume; CString m_strTemp; //}}AFX_DATA // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CSetVolume) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: // Generated message map functions //{{AFX_MSG(CSetVolume) virtual BOOL OnInitDialog(); afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); afx_msg void OnCloseupChannelCombo(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_SETVOLUME_H__9F549D42_A899_11D3_BB86_FD1655A8020E__INCLUDED_) // SetVolume.cpp : implementation file // #include "stdafx.h" #include "LVTN.h" #include "SetVolume.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////// extern HWND hWnd; int nVolume[4] = {0,0,0,0}; ///////////////////////////////////////////////////////////////////////////// // CSetVolume dialog CSetVolume::CSetVolume(CWnd* pParent /*=NULL*/) : CDialog(CSetVolume::IDD, pParent) { //{{AFX_DATA_INIT(CSetVolume) m_strChannel = _T("dxxxC1B1"); //m_nVolume = nVolume; m_strTemp = _T(""); //}}AFX_DATA_INIT } void CSetVolume::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CSetVolume) DDX_Control(pDX, IDC_TEMP, m_wndTemp); DDX_Control(pDX, IDC_VOLUME_SLIDER, m_wndVolume); DDX_Control(pDX, IDC_CHANNEL_COMBO, m_wndChannel); DDX_CBString(pDX, IDC_CHANNEL_COMBO, m_strChannel); DDX_Slider(pDX, IDC_VOLUME_SLIDER, m_nVolume); DDX_Text(pDX, IDC_TEMP, m_strTemp); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CSetVolume, CDialog) //{{AFX_MSG_MAP(CSetVolume) ON_WM_HSCROLL() ON_CBN_CLOSEUP(IDC_CHANNEL_COMBO, OnCloseupChannelCombo) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CSetVolume message handlers BOOL CSetVolume::OnInitDialog() { CDialog::OnInitDialog(); m_wndVolume.SetRange( -10, 10,TRUE ); m_wndVolume.SetTic(10); m_wndVolume.SetTicFreq(2); m_wndChannel.SetCurSel(0); m_wndVolume.SetPos(nVolume[0]); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CSetVolume::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: Add your message handler code here and/or call default int nTempPos; int nChannel; CDialog::OnHScroll(nSBCode, nPos, pScrollBar); switch (nSBCode) { case TB_THUMBTRACK: nTempPos = (int)nPos; //m_strTemp = temp; //m_nVolume = nPos; break; case TB_PAGEUP: case TB_PAGEDOWN: default: nTempPos = ((CSliderCtrl*)pScrollBar)->GetPos(); //strTemp = temp; //nVolume = nPos; break; } //m_wndTemp.SetWindowText(temp); nChannel = m_wndChannel.GetCurSel(); nVolume[nChannel] = nTempPos; ::PostMessage(hWnd,WM_USER_ADJSV,++nChannel,nTempPos); } void CSetVolume::OnCloseupChannelCombo() { int nChannel; nChannel = m_wndChannel.GetCurSel(); m_wndVolume.SetPos(nVolume[nChannel]); } ///////////////////////////////////// #include "LVTNSet.h" #if !defined(AFX_DATAACCESS_H__9192CD51_A39C_11D3_BB72_D69E1BF65909__INCLUDED_) #define AFX_DATAACCESS_H__9192CD51_A39C_11D3_BB72_D69E1BF65909__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 class CDataAccess { public: void MakeSpeak(CString channelnum); CLVTNSet* m_pSet; CString FirstWord; CString XuLyWord(CString string); CString XuLy(CString digit,CString channelnum); void TachTu(CString string); BOOL Searching(CString col,CString digit); CString NumToString(CString string); CString HnumToString(CString string); CString HangNghin(int Num); CString HangTram(int Num); CString HangChuc(int Num); CString ExtractFirstWord(CString string); CString Duyet(CString string); CString DonVi(int Num); char* CStringToCharPtr(CString string); CDataAccess(); virtual ~CDataAccess(); }; #endif // !defined(AFX_DATAACCESS_H__9192CD51_A39C_11D3_BB72_D69E1BF65909__INCLUDED_) //////////////////////////////////////////// // // DataAccess.cpp: implementation of the CDataAccess class. // ///////////////////////////////////////////////////////// #include "stdafx.h" #include "LVTN.h" #include "DataAccess.h" #include "LVTNSet.h" //#include "LVTNView.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif #define SIZE_DELAY 50 typedef struct { char Word[10];//ten cua tu long DataSize;//chieu dai data wave cua tu }INDEX_FIND; extern void* pSet; CStringArray chuoi; CString Ketqua; ///////////////////////////////////////////////////////// // // Construction/Destruction ///////////////////////////////////////////////////////// CDataAccess::CDataAccess() { m_pSet = (CLVTNSet*)pSet; } CDataAccess::~CDataAccess() { } /////////////////////////////////////////////////////////////ham chuyen mot doi tuong CString thanh con tro char ///////////////////////////////////////////////////////// char* CDataAccess::CStringToCharPtr(CString string) { LPTSTR lpsz = new TCHAR[string.GetLength() + 1]; _tcscpy(lpsz,string); return lpsz; } /////////////////////////////////////////////////////////////Ham doi don vi ra chuoi phat am ///////////////////////////////////////////////////////// CString CDataAccess::DonVi(int Num) { CString temp; switch(Num) { case 0 : temp = "";break; case 1 : temp = " mèt";break; case 2 : temp = " hai";break; case 3 : temp = " ba";break; case 4 : temp = " bçn";break; case 5 : temp = " nŸm";break; case 6 : temp = " sÀu";break; case 7 : temp = " b¶y";break; case 8 : temp = " tÀm";break; case 9 : temp = " chÛn";break; } return temp ; } /////////////////////////////////////////////////////////////ham xu ly chuoi lan cuoi ///////////////////////////////////////////////////////// CString CDataAccess::Duyet(CString string) { CString temp = string; CString so = "0123456789"; CString word,tam; CString ketqua =""; int vitri; temp.TrimRight(); temp += " "; while(temp.GetLength() != 0) { word = ExtractFirstWord(temp); if(word.FindOneOf(so) != -1) { tam = XuLyWord(word); if((vitri = tam.Find("Q ")) != -1) { tam.Delete(vitri,2); tam.Insert(vitri,"quËn "); } if((vitri = tam.Find("P ")) != -1) { tam.Delete(vitri,2); tam.Insert(vitri,"ph§éng "); } ketqua += tam; } else ketqua += word + " "; word = word + " "; temp.Delete(0,word.GetLength()); } return ketqua; } /////////////////////////////////////////////////////////////ham lay tu day tien cua chuoi ///////////////////////////////////////////////////////// CString CDataAccess::ExtractFirstWord(CString string) { int vitri; TCHAR space=' '; vitri=string.Find(space); return string.Left(vitri); } /////////////////////////////////////////////////////////////ham chuyen ham chuc sang chuoi ///////////////////////////////////////////////////////// CString CDataAccess::HangChuc(int Num) { CString temp; switch(Num) { case 1 : temp = " m§¥Ø";break; case 2 : temp = " hai m§¥i";break; case 3 : temp = " ba m§¥i";break; case 4 : temp = " bçn m§¥i";break; case 5 : temp = " nŸm m§¥i";break; case 6 : temp = " sÀu m§¥i";break; case 7 : temp = " b¶y m§¥i";break; case 8 : temp = " tÀm m§¥i";break; case 9 : temp = " chÛn m§¥i";break; } return temp ; } ///////////////////////////////////////////////////////// CString CDataAccess::HangTram(int Num) { CString temp; switch(Num) { //case 0 : temp = "";break; case 1 : temp = " mèt";break; case 2 : temp = " hai";break; case 3 : temp = " ba";break; case 4 : temp = " bçn";break; case 5 : temp = " nŸm";break; case 6 : temp = " sÀu";break; case 7 : temp = " b¶y";break; case 8 : temp = " tÀm";break; case 9 : temp = " chÛn";break; } return temp + " trŸm"; } ///////////////////////////////////////////////////////// CString CDataAccess::HangNghin(int Num) { CString temp; switch(Num) { //case 0 : temp = "";break; case 1 : temp = " mèt";break; case 2 : temp = " hai";break; case 3 : temp = " ba";break; case 4 : temp = " bçn";break; case 5 : temp = " nŸm";break; case 6 : temp = " sÀu";break; case 7 : temp = " b¶y";break; case 8 : temp = " tÀm";break; case 9 : temp = " chÛn";break; } return temp + " nghØn"; } //////////////////////////////////////////////////////////////////////////////// //chuyen so nha day du sang chuoi //////////////////////////////////////////////////////////////////////////////// CString CDataAccess::HnumToString(CString string) { CString temp,Ketqua="",word; LPCTSTR phancach="/"; int vitri; temp=string; while((vitri=temp.Find(phancach)) > -1) { word=temp.Mid(0,vitri); temp.Delete(0,vitri+1); Ketqua += XuLyWord(word) + "tr£n"; } Ketqua += XuLyWord(temp); return Ketqua; } //////////////////////////////////////////////////////////////////////////////// //ham chuyen so sang chuoi //////////////////////////////////////////////////////////////////////////////// CString CDataAccess::NumToString(CString string) { CString ketqua = ""; int hang_nghin,hang_tram,hang_chuc,donvi,num; num = atoi(string); hang_nghin = num / 1000; hang_tram = (num % 1000) / 100; hang_chuc = ((num % 1000) % 100) / 10; donvi = ((num % 1000) % 100) % 10; if (hang_nghin > 0) ketqua = HangNghin(hang_nghin); if (hang_tram > 0) ketqua += HangTram(hang_tram); if ((hang_tram ==0)&&(hang_nghin>0)) ketqua += " kh¤ng trŸm"; if ((donvi != 0) && (hang_chuc == 0)&&((hang_nghin != 0)||(hang_tram != 0))) ketqua += " lÍ" + DonVi(donvi); if(hang_chuc > 0) ketqua += HangChuc(hang_chuc); if ((hang_chuc > 0) && (donvi > 0)) { if((hang_chuc ==1) && (donvi == 1)) ketqua += " mèt"; else if (donvi == 1) ketqua += " mçt"; else if (donvi == 5) ketqua += " lèm"; else ketqua += DonVi(donvi); } if((donvi > 0)&&(hang_tram==0)&&(hang_chuc==0)&&(hang_nghin==0)) ketqua = DonVi(donvi); return ketqua; } ///////////////////////////////////////////////////////////ham tim kiem trong bang tra ve gia tri TRUE neu tim thay ///////////////////////////////////////////////////////// BOOL CDataAccess::Searching(CString col, CString digit) { CString str = col + " = '" + digit + "'"; m_pSet->Close(); m_pSet->m_strFilter = str; m_pSet->Open(); int recCount = m_pSet->GetRecordCount(); if (recCount==0) { m_pSet->Close(); m_pSet->m_strFilter = ""; m_pSet->Open(); return FALSE; } else { Ketqua=m_pSet->m_sdtm + "\n" + m_pSet->m_tcqv +"\n" + m_pSet->m_diachiv ; FirstWord=ExtractFirstWord(m_pSet->m_diachiv); // UpdateData(FALSE); return TRUE; } } /////////////////////////////////////////////////////////// //tra ve day cac file wav can mo de phat am // ///////////////////////////////////////////////////////// void CDataAccess::TachTu(CString string) { CString temp = string; CString word; int i=0; while(temp !="") { word = ExtractFirstWord(temp); chuoi.Add(word + ".wav"); word += " "; temp.Delete(0,word.GetLength()); } } /////////////////////////////////////////////////////////// //ham chinh cua phan du lieu nhan vao chuoi so, tra ve chuoi can phat am va mang cac file can mo ///////////////////////////////////////////////////////// CString CDataAccess::XuLy(CString digit,CString channelnum) { CString filename; if(!digit.IsEmpty()) { BOOL find; find = Searching("sdtm",digit); if(find == TRUE) { CString temp; m_pSet->m_tcqv.TrimRight(); Ketqua = m_pSet->m_tcqv; Ketqua += " dia chi "; temp = m_pSet->m_diachiv; if(FirstWord.FindOneOf("0123456789") != -1) { temp.Replace(FirstWord + " ",""); Ketqua += HnumToString(FirstWord); } Ketqua += temp; Ketqua = Duyet(Ketqua); Ketqua.MakeLower(); TachTu(Ketqua); //MakeSpeak(channelnum); filename = "speakout" + channelnum + ".wav"; } else { chuoi.RemoveAll(); filename = "error.wav"; } } return filename; /* BOOL find; find = Searching("sdtm",digit); if(find == TRUE) { CString temp; temp = m_pSet->m_diachiv; temp.Replace(FirstWord + " ",""); m_pSet->m_tcqv.TrimRight(); Ketqua = m_pSet->m_tcqv; Ketqua += " dia chi"; Ketqua += HnumToString(FirstWord); Ketqua += temp; Ketqua = Duyet(Ketqua); Ketqua.MakeLower(); TachTu(Ketqua); } */ } /////////////////////////////////////////////////////////// //tach mot chuoi gom co so ky tu thanh phat am ///////////////////////////////////////////////////////// CString CDataAccess::XuLyWord(CString string) { CString Ketqua = ""; CString num; CString temp, space = " "; int i,j,len,so_kytu = 0,vitri,lensub; BOOL flag; temp = string; i = 0; j = 0; len = temp.GetLength(); if(::isdigit(temp.GetAt(i))) flag = TRUE; else if(::isalpha(temp.GetAt(i))) flag = FALSE; while (i < len) { if (flag==TRUE) { while ((flag==TRUE) &&(i<len)) { if(::isdigit(temp.GetAt(i))) { i++; so_kytu += 1; } else flag = FALSE; } num = temp.Mid(j,so_kytu); Ketqua += NumToString(num) + space; j = i; so_kytu = 0; } //end if flag if(!flag) { while((!flag)&&(i<len)) { if(::isalpha(temp.GetAt(i))) { i++; so_kytu += 1; } else flag = TRUE; } num = temp.Mid(j,so_kytu); if((vitri = num.Find("ter")) > -1) { num.Insert(vitri,space); //num.Insert(vitri +4 ,space); } else if ((vitri = num.Find("bis")) > -1) { num.Insert(vitri,space); //num.Insert(vitri +4 ,space); } else { vitri = 1; lensub = num.GetLength(); while((vitri ) < lensub) { lensub = num.Insert(vitri,space); vitri += 2; } } Ketqua += num + space; j = i; }//end if !flag } return Ketqua; } ///////////////////////////////////////////////////////// void CDataAccess::MakeSpeak(CString channelnum) { int chiso;//chiso so duyet mang ten file int arraylen;//chieu dai cua mang int vitri; long sumdata,datasize,dem; arraylen = chuoi.GetUpperBound();//lay chieu dai cua mang chua file FILE* fileheader;//handle cua file header FILE* speakfile; FILE* filedata;//handle cua file chua du lieu am FILE* fileindex;//handle cua file chua thong tin tim kiem FILE* filebosung;//handle cua file bosung khoang lang CString datafile,indexfile;//ten cua cac file data va index char header[44];//chieu dai cua header char byte[1]; char temp[10]; char bosung[SIZE_DELAY]; CString word; CString outputfile = "speakout"+ channelnum + ".wav"; INDEX_FIND Infor; fileheader = fopen("header.wav","rb");//mo file header fread(header,sizeof(char),44,fileheader);//doc header fclose(fileheader); speakfile = fopen(outputfile,"wb");//mo file speakout.wav fwrite(header,sizeof(char),44,speakfile);//ghi header filebosung = fopen("bosung.wav","rb");//ghi phan am thanh lang vao cuoi file speakout.wav fread(bosung,sizeof(char),SIZE_DELAY,filebosung); for(chiso=0;chiso<=arraylen;chiso++)//ghi datawave vao file { sumdata = 0; word = chuoi.GetAt(chiso); vitri = word.Find(".wav"); word = word.Left(vitri); strcpy(temp,CStringToCharPtr(word)); datafile = "Amthanh\\DataWave." + word.Left(1); indexfile = "AmThanh\\Index." + word.Left(1); BOOL found = FALSE; filedata = fopen(datafile,"rb"); fileindex = fopen(indexfile,"rb"); while(!feof(fileindex) && (found==FALSE)) { fread(&Infor,sizeof(Infor),1,fileindex); if(strcmp(Infor.Word,temp)==0) { found=TRUE; datasize = Infor.DataSize; } else sumdata += Infor.DataSize; } fclose(fileindex); if(sumdata==0) fseek(filedata,0,SEEK_SET); else fseek(filedata,sumdata -1 ,SEEK_SET); dem = 1; while(dem <= datasize) { dem++; fread(byte,sizeof(char),1,filedata); fwrite(byte,sizeof(char),1,speakfile); } fclose(filedata); fwrite(bosung,sizeof(char),SIZE_DELAY,speakfile); }//end for fseek(filebosung,44,SEEK_SET); while(!feof(filebosung)) { fread(byte,sizeof(char),1,filebosung); fwrite(byte,sizeof(char),1,speakfile); } fclose(filebosung); fclose(speakfile); /* int chiso;//chiso so duyet mang ten file int arraylen;//chieu dai cua mang int vitri; long sumdata,datasize,dem; arraylen = chuoi.GetUpperBound();//lay chieu dai cua mang chua file FILE* fileheader;//handle cua file header FILE* speakfile; FILE* filedata;//handle cua file chua du lieu am FILE* fileindex;//handle cua file chua thong tin tim kiem FILE* filebosung;//handle cua file bosung khoang lang CString datafile,indexfile;//ten cua cac file data va index char header[44];//chieu dai cua header char byte[1]; char temp[10]; char bosung[50]; CString word; INDEX_FIND Infor; fileheader = fopen("header.wav","rb");//mo file header fread(header,sizeof(char),44,fileheader);//doc header fclose(fileheader); speakfile = fopen("speakout.wav","wb");//mo file speakout.wav fwrite(header,sizeof(char),44,speakfile);//ghi header filebosung = fopen("bosung.wav","rb");//ghi phan am thanh lang vao cuoi file speakout.wav fread(bosung,sizeof(char),SIZE_DELAY,filebosung); for(chiso=0;chiso<=arraylen;chiso++)//ghi datawave vao file { sumdata = 0; word = chuoi.GetAt(chiso); vitri = word.Find(".wav"); word = word.Left(vitri); strcpy(temp,CStringToCharPtr(word)); datafile = "T\\DataWave." + word.Left(1); indexfile = "T\\Index." + word.Left(1); BOOL found = FALSE; filedata = fopen(datafile,"rb"); fileindex = fopen(indexfile,"rb"); while(!feof(fileindex) && (found==FALSE)) { fread(&Infor,sizeof(Infor),1,fileindex); if(strcmp(Infor.Word,temp)==0) { found=TRUE; datasize = Infor.DataSize; } else sumdata += Infor.DataSize; } fclose(fileindex); if(sumdata==0) fseek(filedata,0,SEEK_SET); else fseek(filedata,sumdata -1 ,SEEK_SET); dem = 1; while(dem <= datasize) { dem++; fread(byte,sizeof(char),1,filedata); fwrite(byte,sizeof(char),1,speakfile); } fclose(filedata); fwrite(bosung,sizeof(char),SIZE_DELAY,speakfile); }//end for fseek(filebosung,44,SEEK_SET); while(!feof(filebosung)) { fread(byte,sizeof(char),1,filebosung); fwrite(byte,sizeof(char),1,speakfile); } fclose(filebosung); fclose(speakfile); */ } ._.

Các file đính kèm theo tài liệu này:

  • docLVTN.DOC