MỤC LỤC
TSP thực chất là một thư viện liên kết động hỗ trợ việc điều khiển các thiết bị truyền thông thông qua một tập các hàm dịch vụ. Ứng dụng TAPI sử dụng các lệnh được chuẩn hóa , và TSP điều khiển các lệnh đặc trưng mà cần phải được trao đổi với thiết bị.
- TSP và MSP sẽ làm nhiệm vụ cung cấp những thông tin về các trạng thái, chức năng của thiết bị khi có yêu cầu. Kết quả của việc lập trình theo mô hình này là ứng dụng vẫn có thể hoạt động khi thay thế thiết bị mới mà không cần thực hiện những thay đổi mã nguồn.
- Những kết nối giữa TSP và MSP được diễn ra bằng cách sử dụng một kết nối ảo thông qua TAPI DLL và TAPISVR. Nó cho phép một ứng dụng nhận biết những thay đổi của các kiểu phương tiện và điều chỉnh các luồng trên phương tiện như âm lượng của tiếng nói được truyền.
Điều này tạo khả năng cho thiết bị hệ thống điện thoại có thể được cài đặt trên một máy Server mà các máy Client trong mạng có thể truy cập được. Ngoài ra , chức năng khác biệt chính là khả năng hỗ trợ MSP (Media Service Providers) nhằm cung cấp cách thức truy cập các luồng phương tiện trong một cuộc gọi và có thể hỗ trợ hệ thống điện thoại theo giao thức internet (IP).
-Để tìm ra quy luật biến đổi phổ tín hiệu này đòi hỏi ta phải có máy phân tích phổ và đi vào lĩnh vực xử lý tiếng nói, ta mới có thể quan sát và phân tích mẫu sóng âm tại từng thời điểm nhằm tìm ra quy luật. Đây là một giao tiếp rất mạnh thực hiện công việc giao tiếp giữa ứng dụng và thiết bị âm thanh để thu hoặc phát rất nhiều loại file âm thanh như : phát các bản nhạc từ CD Audio, các file Wave, Midi, Video, vv.
Sau khi có được tổng số các line, ta duyệt qua từng line để tìm line thích hợp bằng cách kết hợp gọi 2 hàm lineNegotiateAPIVersion() và lineGetDevCaps(). Ứng với mỗi line, hàm lineNegotiateAPIVersion() sẽ trả về con số phiên bản (version) API mà tương thích với phiên bản của TAPI hiện đang sử dụng. Mọi sự kiện liên quan đến TAPI (ví dụ chuông reo, phát/nhận các mã DTMF, .. ) được gửi đến hàm lineCallBack() đều phải được đăng ký sau khi mở line.
Nếu số tiếng chuông reo bằng với một con số mà ta quy định trước đó thì ta sẽ gọi hàm lineAnswer() với handle vừa nhận được để kết nối với cuộc gọi đến. Khi người gọi chọn yêu cầu “kết cầu thúc cuộc gọi” từ menu hoặc người gọi gác máy bất kỳ lúc nào, ta phải gọi hàm lineDrop() để hủy cuộc gọi hiện tại.
Mỗi khi có người gọi tới muốn nghe một kết quả nào đó thì hệ thống sẽ yêu cầu người gọi cung cấp một số thông số cần thiết như : mã số học sinh, tên tháng hoặc tên học kỳ muốn biết, vv. Vì mỗi lần truy vấn, hệ thống chỉ truy vấn trên một học sinh và được giới hạn bởi một tháng hoặc một học kỳ nào đó nên tốc độ truy vấn khá nhanh, người gọi có thể nhận được kết quả ngay mà không phải chờ lâu. -Ở phần ngày sinh, để người sử dụng khụng phải lỳng tỳng trong việc gừ ngày tháng theo kiểu của Mỹ (tháng/ngày/năm) , em đã viết thêm một hàm chuyển từ kiểu ngày/tháng/năm sang kiểu tháng/ngày/năm để lưu vào cơ sở dữ liệu.
-Ứng với mỗi học sinh được thêm vào bảng HOCSINH thì mã số của học sinh đó cùng với mã lớp và mã năm học sẽ được cập nhật vào trong bảng HS_LOP để biết học sinh đó thuộc lớp nào ở năm học nào. Ngoài ra, nhằm tạo sự linh động cho người dùng, chương trình còn cho phép thêm mới một số loại dữ liệu sau : năm học, lớp, lý do nghỉ học, lý do vi phạm nội quy, môn học, loại kiểm tra.
Với số lượng lớn các file .wav như vậy, công việc sao chép hoặc di chuyển sẽ gặp nhiều khó khăn và mất thời gian, Ngoài ra dung lượng đĩa để lưu trữ sẽ bị lãng phí rất nhiều vì cơ chế cấp phát dung lượng đĩa theo cluster. Ta sẽ điều khiển toàn bộ quá trình này, từ việc cấp phát bộ nhớ , định vị khối dữ liệu tiếng nói trong file *.sam cho đến việc chọn thiết bị âm thanh và phát tiếng nói đi, hoặc thu tiếng nói vào vùng đệm và lưu vào file *.sam. Sau khi có ID của thiết bị xuất âm thanh và vùng đệm dữ liệu tiếng nói đã sẵn sàng, ta lần lượt gọi các hàm waveOutOpen(), waveOutPrepareHeader(), waveOutWrite() để bắt đầu phát đi cùng với một vài thông số của header đã nêu ở phần 2.
Mặc dù các từ tiếng Việt cũng như các lời chào và tạm biệt đã được thu âm sẵn trước khi tới tay người sử dụng, chương trình thông báo kết quả học tập vẫn kèm thêm một chương trình thu âm nhằm cho phép người dùng thu âm lại nếu cần. -Khi ngừng thu, chương trình sẽ kiểm tra từ được nhập vào đã có chưa, nếu có thì sẽ xóa phần dữ liệu tiếng nói cũ và ghi lại dữ liệu mới vào cuối file *.sam tương ứng, đồng thời cập nhật lại 2 giá trị FileOffset và DataSize trong bảng chỉ mục.
Ngoài ra, ở các mục như : năm học, lớp, lý do nghỉ học, lý do vi phạm nội quy, môn học, loại kiểm tra, người dùng có thể nhấn vào nút bên cạnh để thêm, sửa hoặc xóa tùy thích. Trong quá trình nghiên cứu, tìm hiểu, em đã có dịp ôn lại rất nhiều kiến thức đã học như : phân tích thiết kế hệ thống thông tin quản lý, cài đặt, kết nối và truy xuất cơ sở dữ liệu, tạo và xử lý file âm thanh và các kỹ thuật lập trình trong Visual Basic. Song song đó, em cũng được biết thêm nhiều điều mới như các kiến thức liên quan đến lập trình giao tiếp giữa điện thoại và máy tính (TAPI), lập trình giao tiếp với multimedia.
Từ những kiến thức thu thập được , em đã hiểu được phần nào về hoạt động của các hộp thư thoại ( voice mail) và các hệ thống trả lời tự động (answering machine) mà hiện nay được sử dụng rất nhiều. Tuy đề tài đã được khép lại nhưng vẫn còn nhiều vấn đề cần được nghiên cứu và phát triển thêm nhằm mở rộng chương trình như : sử dụng telephony card để trả lời nhiều cuộc gọi ở cùng thời điểm, mở rộng cơ sở dữ liệu và tăng cường chức năng bảo mật, xử lý nhiều hơn tiếng nói được thu vào nhằm cho chất lượng cao hơn, vv.
Public Function LineCallBack(ByVal dwDevice As Long, ByVal dwMsg As Long, ByVal dwCallbackInstance As Long, ByVal dwParam1 As Long, ByVal. dwParam2 As Long, ByVal dwParam3 As Long) As Long On Error GoTo Thoat. Private Sub LineCallStateProc(ByVal dwDevice As Long, ByVal. hCallbackInstance As Long, ByVal dwParam1 As Long, ByVal dwParam2 As Long, ByVal dwParam3 As Long). Private Sub LineDevStateProc(ByVal dwDevice As Long, ByVal. hCallbackInstance As Long, ByVal dwParam1 As Long, ByVal dwParam2 As Long, ByVal dwParam3 As Long).
Case STATUS_VIPHAM Call Receive_Thang(Phim) Case STATUS_KQKIEMTRA Call Receive_Thang(Phim) Case STATUS_KQTHI Call Receive_HocKy(Phim) Case STATUS_KQTHANG Call Receive_Thang(Phim) Case STATUS_KQHOCKY Call Receive_HocKy(Phim) Case STATUS_KQNAMHOC Case STATUS_HOCSINH Case STATUS_NAMHOC Call Receive_NamHoc(Phim). Case STATUS_KQTHANG: Call Get_KQThang(Thang) Case STATUS_KQKIEMTRA: Call Get_KQKiemTra(Thang) Case STATUS_NGHIHOC: Call Get_NghiHoc(Thang) Case STATUS_VIPHAM: Call Get_ViPham(Thang) End Select.
If (cmdMove.Tag <> vbNullString) And (cmdMove.Tag <>. frmMain.DBcboLop.BoundText) Then RecHT = rsHS.AbsolutePosition. Nạp kết quả cuối học kỳ : 'Chon cac ket qua cua hoc sinh hien tai Private Function Load_KQ() As Boolean Dim SQL As String. Nạp kết quả cuối năm học : 'Chon cac ket qua cua hoc sinh hien tai Private Function Load_KQ() As Boolean Dim SQL As String.
Nạp kết quả cuối tháng : 'Chon cac ket qua cua hoc sinh hien tai Private Function Load_KQ() As Boolean Dim SQL As String. Nạp kết quả kiểm tra : 'Chon cac ket qua cua hoc sinh hien tai Private Function Load_KQ() As Boolean Dim SQL As String.
Thu âm thanh : 'Bat dau thu am thanh Public Sub Start_Record() Dim BufferSize As Long Dim Loi As Long. BufferSize = MaxTime * pWaveFormat.nSamplesPerSec '=Tong so sample = Tong so byte bo nho can cap phat. Private Sub waveInProc(ByVal hwi As Long, ByVal uMsg As Long, ByVal dwInstance As Long, ByRef dwParam1 As Long, ByVal dwParam2 As Long) Select Case uMsg.
Private Sub Remove_Voice(OldFileOffset As Long, OldDataSize As Long) Dim FileNum_R, FileNum_W As Long. Public Sub waveOutProc(ByVal hwo As Long, ByVal uMsg As Long, ByVal dwInstance As Long, ByRef hdr As WAVEHDR, ByVal dwParam2 As Long) If uMsg = MM_WOM_DONE Then.