Luận văn tốt nghiệp: Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
Bạn đang xem 20 trang mẫu của tài liệu "Luận văn tốt nghiệp: Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- luan_van_tot_nghiep_xay_dung_ung_dung_truyen_thong_am_thanh.pdf
Nội dung text: Luận văn tốt nghiệp: Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 1 LUẬN VĂN TỐT NGHIỆP KHOA CƠNG NGHỆ THƠNG TIN ĐỀ TÀI Xây dựng ứng dụng truyền thơng âm thanh trên mạng cục bộ Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 2 LỜI NĨI ĐẦU Trong những năm gần đây, mạng máy tính ngày càng trở nên phổ biến. Việc liên kết các máy tính trên mơi trường mạng cũng như liên kết các mạng lại với nhau đem lại cho chúng ta nhiều lợi ích trong cơng việc cũng như trong việc học tập nghiên cứu, giải trí. Chúng ta cĩ thể sử dụng các tài nguyên sẵn cĩ được chia xẻ như file server, printer, máy fax, mơi trường mạng cịn là một mơi trường thơng tin nhanh chĩng và tiện lợi nhờ vào các cơ chế truyền thơng trên mạng như : e-mail, www Bên cạnh đĩ, tốc độ phát triển của máy tính PC cũng rất nhanh chĩng. Các kỹ thuật hiện đại đã giúp tạo ra các máy PC với tốc độ tính tốn nhanh hơn, bộ nhớ lớn hơn và khả năng xử lý của nĩ cũng ngày càng đa dạng hơn trong khi giá thành ngày càng rẻ hơn. Một trong những khả năng ưu việt của máy PC hiện nay là hỗ trợ multimedia. Các máy PC ngày nay giao tiếp với con người khơng chỉ bằng text mà cịn kết hợp tất cả các phương tiện khác như tiếng nĩi, hình ảnh. Việc đưa kỹ thuật multimedia vào các ứng dụng truyền thơng trên mạng giúp chúng ta tạo ra nhiều ứng dụng phong phú hơn. Chẳng hạn hộp thư điện tử ngày nay cĩ thể khơng chỉ là văn bản mà cịn bao gồm tiếng nĩi, hình ảnh. Các trang web trở nên sinh động hơn hẳn khi kèm theo kỹ thuật multimedia. Bên cạnh đĩ, chúng ta cĩ thể thiết kế các ứng dụng tiện ích như Video conference, voice mail Thơng qua chương trình này, người sử dụng cĩ thể trao đổi thơng tin với nhau bằng tiếng nĩi. Chương trình này đã được hiện thực rất nhiều trong các lĩnh vực thơng tin như điện thoại, viễn thơng, máy tính . . . Tuy nhiên nĩ chưa được áp dụng và phát triển rọng rãi như trên các lĩnh vực thơng tin khác do sự hạn chế của thiết bị. Ngày nay, khi cơng nghệ thơng tin đã phát triển thì việc hiện thực chương trình này là hồn tồn cĩ thể. Ứng dụng trong nhiều lĩnh vực khác nhau như : •Việc dạy học từ xa. •Việc chẩn đốn, chữa bệnh từ xa. •Hội thảo, thảo luận theo nhĩm. •Cơng cụ trao đổi thơng tin bằng hình ảnh và âm thanh. Mục tiêu của đồ án tốt nghiệp là tìm hiểu các mơ hình và cơng nghệ truyền âm thanh trên mạng máy tính, trên cơ sở đĩ xây dựng ứng dụng truyền thơng âm thanh thoại trên mạng cục bộ. Đồ án sẽ xây dựng thử nghiệm một hệ thống cho phép trao đổi thơng tin bằng tiếng nĩi thoại, tương tác điểm – điểm trên mạng LAN. Đồ án được trình bày gồm 5 chương với bố cục như sau : Chương I : Tìm hiểu các mơ hình điện thoại qua mạng, Từ đĩ đưa ra mơ hình sẽ thực thi trong đồ án này. Chương II: Giới thiệu chung về các giao thức truyền thơng trên mạng Internet và vào khảo sát cụ thể các giao thức này. Chương III : Giới thiệu các chuẩn mã hố và nén âm thanh. Chương IV : Tìm hiều mơi trường lập trình SDK Windows và ứng dụng trên mạng. Chương V : Thiết kế chương trình truyền tiếng nĩi qua mạng LAN thơng qua sự trợ giúp của cơng cụ SDK. Đánh giá và các kết quả thử nghiệm. Phần kết luận : Nêu những kết quả của đề tài và hướng nghiên cứu hướng phát triển tiếp theo. Việc nghiên cứu lý thuyết một cách hệ thống và xây dựng chương trình phần mềm địi hỏi phải đầu tư nhiều thời gian. Với thời gian cĩ hạn cho nên bài luận văn Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 3 này của em khơng tránh khỏi những thiếu sĩt, em rất mong được sự chỉ dẫn thêm của thầy cơ và các bạn. Nhân đây, em xin chân thành cám ơn đến PGS - TS Nguyễn Thị Hồng Lan, người trực tiếp hướng dẫn em hồn thành cuốn luận văn này. Em xin chân thành cám ơn các thầy cơ trong khoa Cơng nghệ thơng tin Trường ĐH Bách Khoa HN, Trường ĐH Thủy Sản và tồn thể các bạn đã giúp đỡ em hồn thành cuốn luận văn này. Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 4 CHƯƠNG I TÌM HIỂU MƠ HÌNH ĐIỆN THOẠI QUA MẠNG I.1 CÁC MƠ HÌNH ĐIỆN THOẠI I.1.1 MÁY TÍNH ĐẾN MÁY TÍNH Trong mơ hình này cả hai thuê bao đều sử dụng máy tính được nối vào mạng IP như một thiết bị đầu cuối. Tiếng nĩi được mã hố sau đĩ là nén và quá trình nhận dữ liệu hồn tốn giống nhưng với quy trình ngược lại là giải nén, giải mã bằng phần mềm. Trong mơ hình này địi hỏi cả hai thuê bao cần phải cĩ soundcard, microphone, loa và phần mềm giống nhau.[1] Máy tính IP Máy tính Hình I.1 : Mơ hình PC - PC I.1.2 MÁY TÍNH ĐẾN ĐIỆN THOẠI HOẶC ĐIỆN THOẠI ĐẾN MÁY TÍNH Trong mơ hình này, một thuê bao sử dụng máy tính nối mạng với mạng cịn thuê bao kia sử dụng điện thoại trong mạng PSTN/ISDN/GSM/TDM. Sử dụng một gateway để chuyển tiếng nĩi trên mạng IP thành tiếng nĩi trên mạng PSTN và trao đổi thơng tin giữa hai mạng trên. Như vậy, ở đây máy tính phải đầy đủ các thiết bị như Soundcard, loa, microphone và phần mềm thơng qua server của mạng IP để cĩ thể kết nối với mạng PSTN thơng qua Geteway. Máy tính IP PSTN Điện thoại Gateway Hình I.2 : Mơ hình Máy tính – Điện thoại I.1.3 ĐIỆN THOẠI ĐẾN ĐIỆN THOẠI Trong mơ hình này, cả hai thuê bao đều sử dụng điện thoại bình thường và mạng IP được sử dụng trong trường hợp cuộc gọi đường dài. Gateway được sử dụng ở cả hai đầu để chuyển đổi dữ liệu giữa các mạng với nhau.[1] Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 5 i i ạ ạ PSTN IP PSTN n tho n tho ệ ệ i i Đ Gateway Gateway Đ Hình I.3 : Mơ hình Điện thoại – Điện thoại I.2 YÊU CẦU ỨNG DỤNG TRUYỀN ÂM THANH TRÊN MẠNG LAN Trong phần này sẽ phân tích các yêu cầu xây dựng ứng dụng truyền âm thanh trên mạng LAN : Từ ba mơ hình trên em nhận thấy mơ hình 2 và 3 địi hỏi quá trình nghiên cứu và thiết bị phức tạp, địi hỏi phải đầu tư cơng nghệ mới cĩ thể thực hiện được. Nên trong đồ án này chỉ cĩ thể thức hiện theo mơ hình 1 là PC – PC, nĩ đơn giản hơn và khơng cần đầu tư thiết bị mới, cĩ thể tận dụng các thiết bị cĩ sẵn và điều quan trọng cĩ thể thử nghiệm hồn chỉnh trong phạm vi đồ án. Vấn đề đặt ra là với một hệ thống mạng LAN, WAN cùng với tài nguyên sẵn cĩ của nĩ xây dựng một chương trình truyền tiếng nĩi với thời gian thực cho phép từ máy này sang máy khác (point to point) với một số các yêu cầu thích hợp giống như việc xử lý và truyền tiếng nĩi trong thơng tin liên lạc (điện thoại hữu tuyến). Chương trình sử dụng giao thức TCP/IP là một giao thức phổ biến và tin cậy hiện nay để kết nối và truyền tiếng nĩi. Do sử dụng giao thức TCP là giao thức cĩ liên kết nên dẫn đến độ trễ rất lớn nhưng với ứng dụng trong mạng LAN thì vẫn cĩ thể chấp nhận được. Ngay khi tiếng nĩi được thu và cĩ thể qua một số các xử lý như mã hố tiếng nĩi hoặc nén trên một máy, tiếng nĩi được truyền tới máy cần kết nối và qua các xử lý ngược so với lúc thu như giải nén và giải mã để được phát ra loa. Chương trình cho phép kết nối hai máy và tạo một mơ hình điện thoại trên máy tính như điện thoại hữu tuyến thơng thường. Bất kỳ máy nào trong mạng cũng cĩ thể ở chế độ chờ hay chế độ chạy nền (background) gọi máy là P-SERVER; máy ở chế độ gọi (active) gọi là P- CLIENT. Như vậy một máy trong mạng cĩ thể là P-SERVER hoặc P-CLIENT. Trên mơi trường mạng, khi chúng ta muốn nĩi chuyện một người trên một máy nào đĩ, chúng ta sẽ tiến hành việc gọi liên kết. Việc gọi liên kết được tiến hành bằng việc xác định địa chỉ IP của máy mà chúng ta cần liên kết. Sau đĩ chúng ta sẽ chờ việc xác lập liên kết. Ở máy được gọi sẽ cĩ thơng báo cho người sử dụng biết rằng cĩ một người khác muốn nĩi chuyện. Tùy theo người đĩ quyết định cĩ chấp nhận hay khơng. Nếu chấp nhận thì liên kết sẽ được xác lập và hai bên sẽ cĩ thể tiến hành trao đổi thơng tin với nhau. Trong quá trình trao đổi thơng tin, các máy sẽ truyền tiếng nĩi của người sử dụng đồng thời nhận dữ liệu âm thanh của máy liên kết. Khi nĩi chuyện xong, liên kết sẽ bị hủy bỏ và chương trình kết thúc. Nếu máy được gọi khơng cĩ người trả lời thì sau thời gian chờ vượt quá giới hạn thì liên kết cũng sẽ bị huỷ bỏ. Vì dữ liệu truyền nhận trong chương trình là dữ liệu dạng liên tục của âm thanh cho nên cĩ các yêu cầu đặt ra như sau: Bảo đảm tính mạch lạc của dữ liệu. Tiếng nĩi trong quá trình thơng tin phải rõ ràng, liền lạc, khơng bị ngắt quãng. Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 6 Các yêu cầu trên đặt ra các nhiệm vụ mà chúng ta phải giải quyết trong việc xây dựng chương trình. Đối với dữ liệu là âm thanh, chúng ta phải xem xét các thơng số trong quá trình lấy mẫu ở đầu vào. Các thơng số đặc trưng như : tần số lấy mẫu, số bit biểu diễn cho một điểm lấy mẫu, kênh lấy mẫu được sử dụng 1 kênh (mono) hay hai kênh (stereo). Do đĩ chúng ta phải tổ chức kích thước buffer âm thanh sao cho phù hợp với việc truyền nhận đạt tốc độ cao. Một vấn đề khác được đặt ra với dữ liệu âm thanh là việc nhận và phát ở đầu ra, chúng ta phải quan tâm đến việc xử lý và loại bỏ các tín hiệu nhiễu giúp cho âm thanh được rõ ràng, trung thực. Do việc truyền nhận dữ liệu là trên mơi trường mạng nên chúng ta phải quan tâm đến tốc độ, lưu lượng trao đổi dữ liệu, thời gian truyền nhận để đưa ra cách giải quyết cho phù hợp. Ngồi các vấn đề chính ở trên, một số yêu cầu khác đặt ra cho ứng dụng như : cơ chế tạo lập liên kết, việc chọn lựa các dạng format dữ liệu, định các thơng số thời gian. Tất cả các nhiệm vụ thực thi đều phải được thực hiện thơng qua giao diện dễ dàng cho người sử dụng.[3] Trường hợp mở rộng hệ thống cho mạng Internet cần một kết nối giữa server mạng với tổng đài mạng PABX, yêu cầu này địi hỏi phức tạp hơn và cần cĩ các trang thiết bị để thử nghiệm. Bởi vậy trong đồ án này em chỉ nghiên cứu cách thức truyền tiếng nĩi trên mạng nội bộ. Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 7 CHƯƠNG II KHẢO SÁT CÁC GIAO THỨC TRUYỀN THƠNG II.1 KHÁI NIỆM CƠ BẢN GIAO THỨC TCP/IP Trong hệ thống mạng Internet, mỗi máy cĩ một tên và một địa chỉ IP (Internet Protocol). Tên hay địa chỉ IP đều xác định duy nhất một máy trong hệ thống mạng Internet. Giữa tên máy và địa chỉ IP đều cĩ thể chuyển đổi thơng qua các hàm. Địa chỉ IP đều được biểu diễn bằng một số 32 bits. Mỗi giao diện mạng trong một nút nếu cĩ hỗ trợ một ngăn xếp IP đều được gán một địa chỉ IP. Địa chỉ IP gồm 2 phần : chỉ số mạng(netid) và chỉ số của máy chủ (hostid). Những bits quan trọng nhất được dùng để xác định số lượng bits dùng cho netid và hostid. Cĩ 5 lớp địa chỉ được xác định là A,B,C,D và E. Trong đĩ, lớp A,B,C chứa địa chỉ cĩ thể gián được. Lớp D dành riêng cho kỹ thuật Multicasting và được sử dụng trong các giao thức đặc biệt để truyền thơng điệp đến một nhĩm nút được chọn lọc. Lớp E dành riêng cho những ứng dụng trong tương lai.[5] Hình II.1 Các lớp đại chỉ IP Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 8 Hình II.2 TCI/IP và mơ hình OSI Netid nhận dạng cho từng mạng riêng biệt. Các kiểu lớp địa chỉ IP cho thấy số lượng mạng và số lượng nút của mỗi lớp khác nhau. Bảng dưới cho thấy số lượng mạng và số lượng nút cĩ thể của mỗi lớp địa chỉ : Lớp địa chỉ Số lượng mạng Số lượng nút A 127 16.777.241 B 16.383 65.534 C 2.097.151 254 Mạng lớp A dùng cho mạng diện rộng. Trường netid cĩ 7 bits nên cĩ thể cĩ 127 mạng. Mạng lớp B là mạng cĩ kích thước trung bình và thích hợp cho các tổ chức cĩ quy mơ lớp và vừa. Mạng lớp C dùng trong cơ quan nhỏ, trong đĩ mỗi mạng chỉ cĩ khơng hơn 254 nút. Con số 32 bits biểu thị 4 chữ số thập phân tương ứng giá trị 4 byte tạo thành địa chỉ IP. Những số thập phân cách nhau bởi dấu chấm (.). Một ví dụ về tên máy và địa chỉ IP của máy : Hostname : viethung IP Address : 192.168.0.55 II.1.1 KHÁI NIỆM SOCKET Socket là một đơn vị cấu trúc truyền thơng 2 chiều. Chúng cĩ thể đọc hay ghi lên nĩ. Tuy nhiên mỗi socket là một thành phần của một mối nào đĩ giữa các máy trên mạng máy tính và các thao tác đọc ghi chính là các thao tác trao đổi dữ liệu giữa các ứng dụng trên nhiều máy khác nhau. Socket là điểm kết nối cuối cùng cho phép những ứng dụng gắn vào mạng. Khái niệm socket được cung cấp bởi một thư viện chứa tất cả các hàm yêu cầu cho bất kỳ chương trình mạng nào. Khi một ứng dụng yêu cầu các dịch vụ mạng, nĩ gọi quá trình tự tập hợp các thư viện để quản lý hoạt động mạng. Hai loại socket cĩ sẵn stream và datagram.[5] Những socket stream dùng cho TCP (Transmission Control Protocol), những socket datagram dùng UDP (User Datagram Protocol). Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 9 Máy A Máy B Port Mối nối Port TCI/IP Interface Hình II.3 Các socket và port trong mối nối TCP/IP Số hiệu cổng Mơ tả 0 Reserved 2 Management Entry 5 Remote Job Entry 7 Echo 9 Discard 11 Systat 13 Daytime 15 Netstat 17 Quoted(quote of the day) 20 FTP data 21 FTP control 23 Telnet 25 SMTP 37 Time 42 Host name server 49 Login host protocol 53 Domain name server 80 World wide web HTTP 102 ISO-TSAP 103 x.4000 104 X.4000 sending server 111 Sun RPC 139 NetBIOS session source 160-223 Reserved Ghi chú : Trị số của cổng trong các ứng dụng : - Các ứng dụng chuẩn : 0 – 999 - Các ứng dụng khơng chuẩn : 1000 – 64000 II.1.2 GIAO THỨC IP Internet protocol (IP) là một dạng giao thức truyền tin được thiết kế cho mạng chuyển mạng gĩi. Vai trị của IP tương đương với vai trị của tầng mạng trong mơ hình OSI. Giao thức IP đảm nhiệm việc chuyển những gĩi mạch dữ liệu (datagram) từ Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 10 địa chỉ nguồn đến địa chỉ đích. Địa chỉ IP cĩ địa chỉ cố định (4 byte) dùng để xác định duy nhất các trạm làm việc đang tham gia vào việc truyền, nhận dữ liệu. Trong trường hợp mạng truyền tin chỉ cĩ thể truyền những gĩi dữ liệu cĩ kích thức nhỏ, giao thức IP cũng đảm nhiệm chức năng chia nhỏ các gĩi dữ liệu cĩ kích thước lớn trước khi truyền và gộp chúng lại chúng sau khi nhận được.[5] Giao thức IP được thiết kế với chức năng chuyển 1 gĩi các bit, gọi là internet datagram từ địa chỉ nguồn đến địa chỉ đích. Đây là một giao thức theo kiểu khơng liên kết, nghĩa là khơng cĩ giai đoạn thiết lập liên kết trước khi truyền dữ liệu, nĩ cũng khơng cĩ các cơ chế bảo đảm thơng tin tới đích an tồn, khơng cĩ cơ chế điều khiển luồng dữ liệu. Trên thực tế việc thơng báo về lỗi đường truyền cĩ thể được thực hiện nhờ một giao thức khác cĩ tên ICMP( Internet Control Message Protocol). Địa chỉ IP như đã nĩi ở trên, là một chuỗi bit cĩ độ dài 4 byte, được phân chia làm 5 lớp và các bit đầu tiên được dùng làm định danh lớp địa chỉ. II.2 GIAO THỨC TCP Giao thức TCP là giao thức dùng cho tầng ngay trên tầng IP. Đối với mơ hình OSI, ta cĩ thể thấy tầng TCP cĩ vai trị tương ứng với các tầng giao vận và tầng phiên . Khác với IP, TCP là giao thức cĩ liên kết (connection oriented), nghĩa là nhất thiết phải cĩ giai đoạn thiết lập liên kết giữ các cặp thực thể TCP trước khi chúng cĩ trao đổi dữ liệu với nhau. Giao thức TCP cung cấp một khả năng truyền dữ liệu một cách an tồn giữa các thực thể trên mạng. Nĩ cung cấp các chức năng nhằm kiểm tra tính chính xác của dữ liệu khi gửi đến và gửi lại dữ liệu khi cĩ lỗi xảy ra.[5] Đơn vị dữ liệu cơ bản của TCP gọi là segment. Trong segment cĩ một cặp tham số là số hiệu cổng của trạm nguồn và số hiệu cổng của trạm đích. Mỗi một tiến trình ứng dụng tại một trạm sẽ truy cập các dịch vụ TCP thơng qua một cổng. Một cổng như vậy kết hợp với một địa chỉ IP sẽ tạo thành một socket duy nhất trong mạng. Dịch vụ TCP được cung cấp nhờ liên kết logic giữa một cặp socket, mỗi socket cĩ thể tham gia liên kết với nhiều socket ở xa khác nhau. Trước khi truyền dữ liệu chúng thiết lập liên kết và khi khơng cĩ nhu cầu truyền dữ liệu nữa thì liên kết sẽ được giải phịng. Mỗi ứng dụng TCP gồm hai phần là client và server. Lưu đồ sau minh họa các bước cần thiết để các ứng dụng client và server giao tiếp với nhau : Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 11 Hình II.4 Tạo kết nối giữa client và server theo giao thức TCP II.2.1 CÁCH THỨC CÀI ĐẶT ỨNG DỤNG TCP SERVER Ứng dụng TCP server làm việc theo qui trình sau: Gọi hàm socket để tạo một socket. Gọi hàm bind để kết buộc socket với một port, đối với mỗi giao thức ứng dụng chuẩn thì sẽ cĩ một hằng số được định nghĩa sẵn trong winsock cho port của giao thức đĩ. Gọi hàm listen để chờ đến khi cĩ một client nối vào port. Khi cĩ một client nối vào thì hàm listen trả điều khiển về, ứng dụng server gọi hàm accept để xác nhận mối nối của client. Gọi các hàm gửi hay nhận dữ liệu để trao đổi thơng tin với client, ví dụ send, recv. Sau khi đã hồn tất quá trình trao đổi dữ liệu, ứng dụng server gọi hàm closesocket để đĩng socket đã tạo. Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 12 Hình II.5 Sơ đồ giao tiếp giữa server với client II.2.2 CÁCH THỨC CÀI ĐẶT ỨNG DỤNG CLIENT TCP Ứng dụng client TCP làm việc theo qui trình sau : - Gọi hàm socket để tạo một socket . - Gọi hàm connect để nối vào server. - Gọi hàm gửi hay nhận dữ liệu để trao đổi thơng tin với server, ví dụ như hàm send, recv. Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 13 - Sau khi đã hồn tất quá trình trao đổi dữ liệu, ứng dụng client gọi hàm closesocket để đĩng socket đã tạo. Hình II.6 Sơ đồ giao tiếp của client với server Ghi chú: Các bước trên cơ bản là giống nhau cho các ứng dụng client và server viết trên Windows NT và UNIX. Tuy nhiên, với ứng dụng viết trên UNIX thì khơng cần gọi các hàm WSAStartup, WSACleanup để khởi tạo thư viện quản lý socket và đĩng bộ phận này. Lý do, với UNIX thì bộ phận quản lý socket đã được hệ điều hành nạp sẵn. II.3 GIAO THỨC UDP Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 14 Giao thức UDP cung cấp khả năng broadcast trên hệ thống mạng TCP/IP . Chúng ta cũng cần cài đặt ứng dụng client và server. Ứng dụng client cĩ nhiệm vụ gửi thơng báo đến tất cả các instance của ứng dụng server đang chạy trên hệ thống mạng.[5] II.3.1 CÁCH CÀI ĐẶT ỨNG DỤNG SERVER UDP Ứng dụng server UDP được cài đặt đơn giản hơn ứng dụng TCP. Chúng ta cần các bước chính sau đây : - Gọi hàm socket để tạo một socket . - Gọi hàm bind để kết buộc socket với một port, đối với mỗi giao thức ứng dụng chuẩn thì sẽ cĩ một hằng số được định nghĩa sẵn trong winsock cho port của giao thức đĩ. - Gọi các hàm gửi hay nhận dữ liệu để trao đổi thơng tin với client, ví như hàm sendto, recvfrom. - Sau khi đã hồn tất quá trình trao đổi dữ liệu, ứng dụng server gọi hàm closesocket để đĩng socket đã tạo. II.3.2 CÁCH CÀI ĐẶT ỨNG DỤNG CLIENT UDP Ứng dụng client UDP thực hiện các bước sau : - Gọi hàm socket để tạo một socket. - Gọi hàm setsockopt để làm cho socket cĩ khả năng broadcoast . - Gọi các hàm gửi hay nhận dữ liệu để trao đổi thơng tin với server, ví dụ hàm sendto, recvfrom. - Sau khi đã hồn tất quá trình trao đổi dữ liệu, ứng dụng client gọi hàm closesocket để đĩng socket đã tạo. Ghi chú: Ngồi các bước trên, các ứng dụng viết trên Windows NT (kể cả client và server) phải gọi hàm WSAStartup để khởi tạo thư viện liên kết động Windows Socket DLL và hàm WSACleanup để đĩng thư viện này. Tuy nhiên, đối với ứng dụng viết trên UNIX thì bộ phận quản lý socket đã được hệ điều hành nạp sẵn và do đĩ khơng cần gọi các hàm như WSAStartup, WSACleanup của Windows NT. Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 15 CHƯƠNG III PHƯƠNG PHÁP MÃ HỐ VÀ NÉN ÂM THANH III.1 CÁC PHƯƠNG PHÁP MÃ HỐ III.1.1 GIỚI THIỆU CHUNG Trong hệ thống xử lý âm thanh, âm thanh được mã hố PCM. Các mã hố này cho phép khơi phục một cách tương đối trung thực tín hiệu âm thanh trong dải tần nghe được. Tuy nhiên trong một ứng dụng đặc biệt như truyền dữ liệu âm thanh trên mạng, âm thanh được truyền với tốc độ thấp hơn nhiều. Từ đĩ xuất hiện một số kỹ thuật mã hố và nén tín hiệu âm thanh như ADPCM, LPC, GSM . Các loại phần mềm và phần cứng thực hiện mã hố và nén âm thanh sang các loại dữ liệu số thường được gọi là codec(Coder-Decoder). Cĩ thể phân loại các phương pháp mã hố âm thanh thành 3 loại : Mã hố dạng sĩng(waveform codec) : Giữ nguyên hình dạng nguyên thuỷ của sĩng âm. Phương pháp mã hố này địi hỏi tốc độ dữ liệu rất cao nhưng lại cho chất lượng âm thanh rất tốt. Ưu điểm của bộ mã hố này là độ phức tạp, giá thành thiết kế, độ trễ và cơng suất tiêu thụ thấp. Bộ mã hố sĩng đơn giản nhất là điều biên xung mã (PCM) Tuy nhiên nhược điểm của bộ mã hố là khơng tạo được âm thanh chất lượng cao tại tốc độ dưới 16 kbps, bộ mã nguồn khắc phục được nhược điểm này.[4] Mã hố nguồn (Source codec) : Cho phép đạt được tốc độ truyền dữ liệu thấp, cĩ thể thực hiện tại tốc độ bit > 2kbps, nhưng chất lượng âm thanh khơng cao. Mã hố hỗn hợp (hybrid codec) : Sử dụng cả hai phương pháp trên để tạo ra tín hiệu âm thanh cĩ chất lượng tốt ở tốc độ dữ liệu trung bình. Mã hố Mã hố dạng sĩng Chất lượng tiếng nĩi hỗn hợp Mã hố dự đốn R t t t tuyến tính LPC ấ ố Tốt Trung bình 2 4 8 16 32 64 T c ố độ Hình III.1 Biểu đồ so sánh các phương pháp mã hố Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 16 Mã hố dạng sĩng Địi hỏi tốc độ bit rất cao nhưng tạo ra chất lượng âm thanh hồn hảo và thời gian xử lý rất ít, bởi vì phương pháp này chỉ đơn giản lấy mẫu tín hiệu ở tốc độ nào đĩ và lượng tử hố từng mẫu dùng lượng tử hố tuyến tính. Cách tiếp cận này gọi là điều biến xung mã(PCM). Am thanh mã hố theo phương pháp PCM, lấy mẫu tốc độ 8KHz, lượng tử 8bit/mẫu, cho tốc độ bit ra là 64 kbps. Phương pháp điều biên xung mã vi phân (DPCM) dự đốn giá trị hiện tại dựa vào các giá trị trước của các mẫu quá khứ, chỉ lưu trữ giá trị sai số lượng tử. Giá trị sai số này sẽ nhỏ hơn giá trị thực của mẫu, do đĩ cho phép lưu trữ giảm đi một phần. Một cải tiến của DPCM là điều biến xung mã vi phân thích nghi(ADPCM). Bộ tiến đốn và lượng tử hố trong phương pháp này cĩ khả năng thích nghi với tín hiệu cần mã hố. ADPCM hoạt động tốc độ 32 kbps cho chất lượng tương đối với PCM 64 kbps. Mã hố dự đốn tuyến tính LPC Một vấn đề đáng quan tâm là phương pháp mã hố dạng sĩng là khi lấy mẫu tín hiệu tương đương sẽ cho ra dịng dữ liệu khá lớn. Các phương pháp mã hố nguồn đi theo một cách tiếp cận khác, người ta phải qua tâm đến việc âm thanh được tạo ra như thế nào, nếu cĩ thể mơ hình hố cách tạo ra âm thanh thì khơng phải truyền đi các mẫu của tín hiệu âm thanh mà chỉ cần gửi đi cách thức tạo ra âm đĩ trên đến bộ mã. Như vậy theo phương pháp này thay vì mã hố và truyền trực tiếp âm thanh thì người ta chỉ mã hố các tham số tạo ra âm thanh tại nơi nhận, từ các tham số này bộ tổng hợp tiếng nĩi sẽ tổng hợp nên tiếng nĩi nhân tạo. Những phương pháp đi theo cách tiếp cận này gọi là Vocoder. Mơ tả đơn giản nhất của mơ hình này là mã hố dự đốn tuyến tính (LPC). Phương pháp mã hố Vocoder cho tốc độ bit rất thấp (>2 kbps) nhưng độ phức tạp cao hơn với phương pháp mã hố dạng sĩng và chất lượng âm thanh khơng trung thực . Mã hố hỗn hợp Để giải quyết vấn đề của phương pháp mã hố dạng sĩng và của phương pháp mã hố dự đốn, một nhĩm các phương pháp mã hố sử dụng phương pháp AbS (Analysis by Synthesis) để tạo ra mơ hình máy phát âm phức tạp hơn. Trong khi Vocoder sử dụng bộ lọc tuyến tính kích thích bởi chuỗi xung tuần hào hay chuồi nhiễu trắng để tạo ra âm hữu thanh hay vơ thanh, AbS sử dụng một dãy các trạng thái được lưu trữ trong codebook. Khi xem xét một khung âm thanh, AbS kiểm tra khung đĩ với rất nhiều tín hiệu kích thước rồi sẽ chọn tín hiệu nào đưa ra kết quả gần đúng nhất với âm thanh ban đầu. Bộ giải mã chỉ cần biết chỉ số của xung kích thước đĩ, sau đĩ tra codebook rồi tái tạo lại âm thanh. Một số các tham số khác nhau như năng lượng của sự kích thích và giá trị chu kỳ cũng cần đến khi giải mã. Các phương pháp mã đi theo cách này địi hỏi quá trình tính tốn phức tạp, cĩ thể tất cả các mục trong từ điển đều phải thử để đưa ra giá trị tốt nhất. Hệ thống thơng tin tồn cầu GMS : GSM là mộ chuẩn điện thoại được Viện Tiêu Chuẩn Viễn Thơng Châu Au ETSI để ra. Đầu vào của bộ nén GMS 06.10 bao gồm các khung 160 mẫu các tín giệu PCM tuyến tính lấy mẫu tại tần số 8 kHz. Chu kỳ mỗi khung là 20 ms, đây là khoảng thời gian rất ngắn và trong khoảng thời gian này cho phép được coi tín hiệu âm thanh ổn định. Độ trễ truyền dẫn thơng tin được tính bằng tổng thời gian xử lý và kích thước khung của thuật tốn. Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 17 Bộ mã hố thực hiện việc nén một khung tín hiệu đầu vào 160 mẫu (20 ms) vào một khung 260 bit. Như vậy một giây nĩ sẽ thực hiện nén được 13.133 bit ( tương đương với 1625 byte). Do vậy để nén một megabyte tín hiệu chỉ cần một thời gian chưa đầy 10 phút.[4] Trung tâm của quá trình xử lý tín hiệu là bộ lọc. Đầu ra của bộ lọc phụ thuộc rất nhiều vào giá trị đầu vào đơn của nĩ. Khi cĩ một dãy các giá trị đưa qua bộ lọc thì dãy tín hiệu này sẽ được dùng để kích thích bộ lọc. Dạng của bộ nén GMS 06.10 dùng để nén tín hiệu âm thanh bao gồm 2 bộ lọc và một giá trị kích thước ban đầu. Bộ lọc ngắn hạn dự đốn tuyến tính được đặt tại tầng đầu tiên của quá trình nén và tại tầng cuối cùng trong suốt quá trình dãn. Nĩ được kích thích bởi đầu ra của bộ lọc dự đốn dài hạn (LTP). III.1.2 PHƯƠNG PHÁP ĐIỀU BIẾN XUNG MÃ PCM Mã hố tín hiệu âm thanh liên qua tới các bước sau đây : a. Tín hiệu âm thanh được lấy mẫu với tần số tối thiểu là : f s 2 f max fs : tần số lấy mẫu fmax : tần số lớn nhất trong tín hiệu được lấy mẫu. Việc lấy mẫu như vậy là đảm bảo hồn tồn khơi phục lại được tín hiệu tương đương ban đầu bởi thiết bị khơi phục thiết bị. Tần số lấy mẫu nhỏ nhất cũng cĩ thể nhỏ hơn 2fmax nếu tần số thấp nhất của tín hiệu khác khơng. b. Biên độ của từng mẫu tín hiệu được lượng tử hố thành một trong số 2B mức. Điều này cĩ nghĩa dùng B bit trên một mẫu và thơng lượng là 2fsB bit/giây với tín hiệu được lọc thơng thấp. c. Các mức biên độ riêng biệt được thể hiện bằng các từ nhị phân riêng biệt cĩ chiều dài B. ví dụ : với B =2 thì một từ cĩ thể thể hiện cho 4 mức riêng biệt bằng cách sử dụng các từ mã 00, 01, 10 và 11. d. Đối với việc giải mã, các từu nhị phân được ứng thành các mức biên độ và chuỗi xung biên độ – thời gian được lọc thơng thấp với một bộ lọc cĩ dải tần giới hạn là fs. Bây giờ chúng ta giả sử là các bước a, c và d cĩ thể thực hiện một cách hồn tồn chính xác, chúng ta tập trung vào việc xác định các lỗi lượng tử xuất hiện trong bước b. Cho bước lượng tử (kí hiêu : ). Nếu số lượng các mức lượng tử rất lớn, người ta giả sử rằng sai số lượng tử cĩ phân bố đồng nhất như sau : 1 p(E) , - E (1) 2 2 Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 18 Điều này sẽ khơng đúng nếu tín hiệu là bão hồ bộ lượng tư. Ví du như biểu diễn hình 1, đầu ra của bộ lượng tử cĩ thể bão hồ tại 5 với tần số đầu và vượt qua số lượng và mỗi lượng tử trong trường hợp này sẽ là một hàm tăng tuyến tính.[4] Hình III.2 a.Đặc tuyến lượng tử hố;b.Đặc tuyết sai số lượng tử; c.VD lượng tử đều Nếu như ta cho rằng bộ lượng tử khơng bị bão hồ. Theo cơng thức (1) thì giá trị bình phương trung bình của sai số lượng tử là : 2 2 E 2 p(E)dE (2) 12 2 Nếu giá trị độ rộng của đầu vào X là Xrms, thì tỷ số tín hiệu/nhiễu được tính bởi : 2 2 SNR X rms / /12 (3) Ví dụ, cho bộ lượng tử cĩ khoảng biên độ từ – 4Xrms đến + 4Xrms( để thuận tiện về mặt lý thuyết, thì độ rộng 8Xrms của bộ lượng tử khơng cĩ ràng buộc riêng, ngoại trừ các trường hợp đặc biệt. Ví dụ, nếu tín hiệu PDF p(x) được biến đổi bằng hàm Gaussian trung bình – khơng, thì các mẫu tín hiệu sẽ rơi bên ngồi khoảng 8Xrms của bộ lượng tử với xác xuất nhỏ hơn 1/10.000). bước lượng tử đều cĩ thể được thực hiện tỷ số của khoảng biên độ trên số lượng các bước lượng tử (số các mức đầu ra). B 8X rms / 2 (4) Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 19 Từ (3) và (4) ta cĩ : SNR(dB) 10log10 SNR 6B 7,2 (5) Cơng thức trên miêu tả rất tốt về PCM với các điều kiện sau : 1.Hệ thống hoạt động với kênh sạch(khơng nhiễu), chỉ giới hạn về sai số lượng tử( và khơng gây ra lỗi các từ mã khi kênh cĩ nhiễu). 2.Tín hiệu đầu vào đủ phức tạp để loại trừ cấu trúc thời gian hiển nhiên trong dạng tín hiệu lỗi, như vậy biểu diễn tĩnh của lỗi trong 1 được thể hiện đầy đủ. 3.lượng tử hố đủ mịn(B>6) để ngăn chặn những thành phẩm liên quan đến tín hiệu trong dạng tín hiệu lỗi, sai số cĩ thể được đo trong biểu thức cơng suất nhiễu hay là biến sai số 2. 4.Bộ lượng tử được sắp với thanh biên độ từ (-4Xrms;+4Xrms) như vậy trong lượng tử đều, cứ thêm 1 bit thì được lợi 6 dB và để cĩ chất lượng thích hợp thì B >11 do đĩ thơng lượng tương đối lớn. III.2 CÁC PHƯƠNG PHÁP NÉN TIẾNG NĨI III.2.1 GIỚI THIỆU CHUNG Y tưởng nén tiếng nĩi là để giảm kích thước nhằm giúp ít tốn băng thơng truyền qua mạng. Dịng dữ liệu tiếng nĩi được giải nén ở tốc độ lấy mẫu mặc định ( 8bits/mẫu, 8 khz, kênh mono) sẽ yêu cầu đường truyền cĩ tốc độ 8000 mẫu/giây * 8 bits/ mẫu = 64 Kbits/giây để truyền dữ liệu qua mạng. Do đĩ, tùy theo tốc độ đường truyền thực tế trên mỗi mạng mà chọn giải pháp nén hay khơng nén dữ liệu trước khi truyền dữ liệu âm thanh qua mạng, cũng như chọn tỉ lệ nén là bao nhiêu cho phù hợp (chọn giải thuật nén). Vì nếu dữ liệu được nén thì phải giải nén khi được truyền đến máy nhận, do đĩ cũng tốn thời gian để nén và giải nén dữ liệu, điều này dẫn đến ảnh hưởng thời gian thực của hệ thống. Đối với các mạng cục bộ, thường cĩ tốc độ truyền của mạng cao nên cĩ thể khơng cần phải nén tiếng nĩi trước khi truyền. Ngược lại, đối với mạng Internet, hệ thống được kết nối với Internet thơng qua các modem chuẩn cĩ tốc độ thấp 14,4 Kbits/s hoặc 28,8Kbits/s thì nhất thiết phải nén tiếng nĩi trước khi truyền và giải nén trước khi phát. Hai phương pháp nén âm thanh thường được dùng nhất để giảm băng thơng là GSM và ADPCM.[2] III.2.2 CÁC PHƯƠNG PHÁP NÉN CỤ THỂ III.2.2.1 Phương pháp nén tiếng nĩi theo chuẩn GSM Phát triển tại Đại học Kỹ thuật Berlin vào năm 1992, GSM là một trong những phương pháp nén âm thanh phức tạp nhất đang được sử dụng, cho tỉ lệ nén 1:10. Giải thuật GSM dựa trên giao thức truyền thơng Mobile Phone, hiện tại là giao thức phổ biến nhất tại Châu Âu đối với điện thoại di động. Đầu vào của GSM bao gồm các frames 160 tín hiệu, những tín hiệu PCM tuyến tính 13 bits lấy mẫu ở 8 Khz. GSM cĩ sẵn trong thư viện C cĩ thể được dùng để tạo ra một đối tượng gsm giữ trạng thái cần thiết hoặc để mã hĩa những mẫu PCM tuyến tính thành các frames GSM, hoặc giải mã các frames GSM thành các frames PCM tuyến tính. Bộ mã hĩa nén 160 frames PCM 16 bits thành các frames GSM 260 bits. Tương ứng một giây tiếng nĩi thành 1625 bytes. Bởi vì mẫu 260 bits khơng chẵn để gắn vào các bytes 8 bits, nên bộ mã hĩa sẽ mã hĩa frame 160 bytes thành frame GSM 264 bits. Một buffer GSM nén 1 Mb cĩ thể lưu tiếng nĩi gần 10 phút.[2] Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 20 Một dịng dữ liệu tiếng nĩi giải nén 16 bits/mẫu ở 8Khz yêu cầu băng thơng tốc độ 128 Kbits/s, trong khi đĩ băng thơng để truyền qua mạng nếu dùng giải thuật nén GSM , tiếng nĩi 16 bits/mẫu chỉ cần: ( 264 bits * 8.000 mẫu/giây)/160 mẫu = 13,2 Kbits/giây Cho tỉ lệ nén 128/13,2 = 9,7 tương đương 10 :1. III.2.2.2 Phương pháp nén ADPCM Nguyên tắc : Là một phương pháp cĩ thể được dùng để nén các khối dữ liệu tiếng nĩi trước khi chúng được truyền đến các máy nhận và giải nén chúng để phát lại sau khi được nhận từ đường truyền. Hình sau là một giản đồ khối đơn giản của bộ mã hĩa và giải mã ADPCM : Hình III.3 Sơ đồ khối bộ mã hố và giải mã ADPCM Bộ mã hĩa ADPCM giả sử rằng những mẫu âm thanh kế cận nhau sẽ giống nhau, vì thế thay vì biểu diễn mỗi mẫu độc lập như PCM. ADPCM tính tốn sự chênh lệch giữa các mẫu âm thanh và giá trị tiên đốn của nĩ và tạo ra những giá trị vi phân PCM. Cĩ nhiều giải thuật ADPCM khác nhau được đề nghị. Trong phạm vi luận văn này em tìm hiểu và ứng dụng giải thuật đưa ra bởi IMA (Interactive Multimedia Association) . Giải thuật IMA ADPCM nén những mẫu PCM tuyến tính thành các mức lượng hĩa 4 bits, trong đĩ mỗi mẫu DPCM được biểu diễn bằng các giá trị âm thanh 16 bits, do đĩ giải thuật này cung cấp một tỉ lệ nén là 4:1. Ví dụ tiếng nĩi 16 bits/mẫu, 8 Khz, kênh mono yêu cầu tốc độ truyền dữ liệu là 128 Kbits/s , khi nén với giải thuật IMA_ADPCM chỉ cần tốc độ truyền dữ liệu 32 Kbits/s là đủ. Quá trình thực hiện của giải thuật IMA_ADPCM là đọc từ những bộ đệm cĩ giá trị kiểu nguyên và nén chúng thành một mẫu âm thanh 16 bits được biểu diễn bằng các mức lượng hĩa 4 bit. Bởi vì khơng cĩ giới hạn trong kích thước buffers tiếng nĩi Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 21 nên những mã ADPCM được kết hợp một cách dễ dàng với các phần cịn lại của chương trình để nén tiếng nĩi khi thu và giải nén trở lại khi phát. Giải thuật nén IMA ADPCM : Theo sơ đồ mã hĩa trên chúng ta thấy giải thuật IMA ADPCM tính tốn sự chênh lệch giữa mẫu âm thanh hiện tại X[n] và mẫu đã tiên đốn trước Xp[n-1] và sử dụng sự chênh lệch đĩ để tính tốn mức lượng hĩa D[n] cho mỗi mẫu. Giá trị Xp[n-1] chỉ là giá trị trễ thời gian của giá trị X[n]. Hình sau chỉ ra sơ đồ khối của quá trình lượng hĩa dùng giải thuật IMA. Mỗi mức đầu ra của bộ lượng hĩa được biểu diễn bằng bốn bits. Bit thứ tư là bit dấu của mức độ lượng hĩa.[2] Hình III.4 Sơ đồ giải thuật mã hố nén IMA ADPCM Từ sơ đồ giải thuật ta thấy rằng bit thứ ba được cài đặt lên 1 nếu độ chênh lệch giữa X[n] và Xp[n-1] là lớn hơn hay bằng step_size. Sau đĩ step_size được chia 2 và so sánh trở lại với độ chênh lệch (độ chênh lệch sẽ được tính lại Mẫu = mẫu-kích thước mẫu tại bước giải thuật nếu bit thứ ba được cài lên1). Bit thứ hai cũng được cài lên 1 khi độ chênh lệch mới ≥ kích thước mẫu tại bước giải thuật/2. Bộ mã hĩa một lần nữa laị chia kích thước mẫu tại bước giải thuật cho 2 và so sánh với độ chênh lệch mới và thiết lập giá trị cho bit một tương tự như các bước trước. Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 22 CHƯƠNG IV TÌM HIỂU HỖ TRỢ CỦA WINDOWS SDK TRONG XỬ LÝ VÀ TRUYỀN NHẬN ÂM THANH IV.1 MƠI TRƯỜNG LẬP TRÌNH SDK ĐỐI VỚI TRUYỀN ÂM THANH Mơi trường Windows SDK là mơi trường lập trình đa phương tiện dưới Windows, cung cấp các hàm cấp thấp rất thích hợp cho các ứng dụng trên mạng. Một cách thức đơn giản nhất trong việc xuất dữ liệu waveform ra loa là dùng hàm PlaySound. Chúng ta cĩ thể thao tác với dạng dữ liệu waveform bằng các hàm cấp thấp do hệ thống cung cấp. Ngồi ra hệ thống cịn cung cấp một cơ chế giúp người lập trình giao tiếp dễ dàng hơn với thiết bị, đĩ là các hàm MCI.[6] IV.1.1 CẤU TRÚC FILE WAVE VÀ HÀM PLAYSOUND IV.1.1.1 Cấu trúc file âm thanh wave Một file wave thật sự là một phần của một lớp file lớn hơn dùng bởi các hàm multimedia của windows là các file RIFF ( Resource Interchange File Format). Một file Riff bao gồm một hoặc nhiều chunk. Trong mỗi chunk cĩ con trỏ chỉ đến chunk kế tiếp. Mỗi chunk cĩ một mơ tả kiểu theo sau bởi một số dữ liệu. Một ứng dụng để đọc các file RIFF cĩ thể bước qua một số chunk, đọc các chunk cần quan tâm và bỏ qua các chunk khơng liên quan. Chunk file RIFF luơn luơn bắt đầu bằng header sau: Typedef struct { FOURCC ckID; DWORD cksize; }CK; Trong đĩ: FOURCC là một vùng 4 bytes định nghĩa loại chunk. Vùng này sẽ chứa từ WAVE đối với file wave. ckSize đặc tả kích thước dữ liệu trong chunk, sau header này chúng ta sẽ tìm thấy cSize bytes dữ liệu. Các chunk cĩ thể chứa các subchunks. Cấu trúc thật sự một file wave cơ bản bao gồm một chunk fmt theo sau là một chunk dữ liệu. Cĩ thể cĩ những chunk khác phía sau chunk WAVE nhưng thiết bị sử dụng file WAVE sẽ bỏ qua các chunk này. Hình sau mơ tả cấu trúc file RIFF chứa dữ liệu WAVE. ID SIZE FROM TYPE "fmt" SIZE "data" SIZE Hai subchunk trong chunk wave đặc tả thơng tin về một âm thanh file wave và sau đĩ là chính dữ liệu âm thanh. Chunk fmt chứa chủ yếu đối tượng Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 23 WAVEFORMAT và một số dữ liệu thêm vào gắn ở cuối chunk. Một đối tượng WAVEFORMAT được định nghĩa như sau : Typedef struct waveformar_tag{ WORD wFormatTag; WORD nChannels; DWORD nSamplesPerSec; DWORD nAvgBytesPerSec; WORD nBlockAlign; } WAVEFORMAT; Trong đo : wFormatTag : Chứa hằng WAVE_FORMAT_PCM được định nghĩa trong MMSYSTEM.H như sau: # define WAVE_FORMAT_PCM 1 Giá trị WAVE_FORMAT_PCM báo cho phần mềm đọc file wave biết cách âm thanh trong nĩ được mã hố. nChannels : Của đối tượng WAVEFORMAT cĩ 2 giá trị : 1 đối với âm thanh mono. 2 đối với âm thanh stereo. nSamplePerSec : Cho biết tần số lấy mẫu của âm thanh để cĩ thể thu và phát cùng một tốc độ, giá trị thơng thường của field này nhận một những giá trị sau: 11025 - 11,025Khz 22055 - 22,050Khz 44100 - 44,1 Khz nAvgBytesPerSec : Cho biết số bytes trung bình trong mỗi giây để thu và phát dữ liệu wave. nBlockAlign : Xác định số bytes yêu cầu chứa trong một mẫu Những mẫu cĩ độ phân giải nhỏ hơn hoặc bằng 8 bits cĩ thể lưu vào 1 bytes. Những mẫu cĩ độ phân giải từ 9 đến 16 bits yêu cầu 2 bytes. Những mẫu stereo yêu cầu số bytes gấp đơi những mono. Trong cấu trúc trên khơng định nghĩa số bits thật sự trong một mẫu dữ liệu âm thanh file wave, để định nghĩa số bits trong một mẫu ta dùng cấu trúc sau: Typedef struct pvmwaveformat_tag{ WAVEFORMAT wf; WORD wBitsPerSample; } PCMWAVEFORMAT; Trong đĩ: wf: Đối với dữ liệu subchunk fmt của một chunk WAVE chúng ta thật sự làm việc với đối tượng PCMWAVEFORMAT. nBitsPerSample: Xác định số bits thật sự trong một mẫu . Trong một mẫu mono 8 bits dữ liệu của chunk dữ liệu gồm một chuỗi dài cĩ giá trị 1 byte. Những mẫu stereo được chia ra với byte đầu dùng cho kênh bên trái và byte thứ hai dùng cho kênh bên phải, như vậy mỗi mẫu stereo 8 bits sẽ cần 2 bytes.[6] Để làm việc với một file RIFF bao gồm các bước sau : Mở file. Vào chunk cần thiết. Chuyển con trỏ file vào vị trí bắt đầu dữ liệu của chunk. Hồn tất, ra khỏi chunk. Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 24 Vào chunk kế tiếp. IV.1.1.2 Hàm Playsound Chúng ta dùng hàm PlaySound để play dữ liệu dạng waveform hoặc chúng ta cĩ thể dùng hàm sndPlaySound. Tuy nhiên trong mơi trường Win32 thì nên dùng hàm PlaySound. Hàm PlaySound cho phép chúng ta chỉ định các thơng số nguồn âm thanh theo các cách sau: Dùng tên alias khai báo trong file WIN.INI Dùng tên file. Dùng chỉ số nhận dạng tài nguyên Waveform-Audio Files Trong mơi trường Windows, phần lớn các file âm thanh dạng waveform đều cĩ phần mở rơng là .WAV Ví dụ dưới đây minh họa cho việc phát file âm thanh “AmThanh.WAV” PlaySound("C:\\SOUNDS\\AmThanh.WAV", NULL, SND_SYNC); Play sound theo các hiện tượng Hàm PlaySound cịn cho phép chúng ta xuất âm thanh tùy theo một sự kiện nào đĩ xảy ra trong hệ thống như click mouse hay nhấn một phím nào đĩ. Hệ thống sẽ phát âm thanh tùy theo hiệc tượng xảy ra để cảnh báo người sử dụng. Am thanh dạng này được gọi là sound events. Để xác định sound event, hàm PlaySound sẽ được gọi với thơng số pszSound trỏ đến bảng đăng ký sự kiện. Ví dụ chúng ta sẽ gọi hàm PlaySound ứng với sự kiện mouse click như sau: PlaySound("MouseClick", NULL, SND_SYNC); IV.1.2 GIAO TIẾP AUDIO VỚI BẰNG CÁC DỊCH VỤ CẤP THẤP Trong phần này chúng ta sẽ khảo sát việc giao tiếp với thiết bị audio bằng các hàm cấp thấp, các hàm này phù hợp với các ứng dụng cần giao tiếp. Các hàm và cấu trúc cấp thấp này đều cĩ prefix là wave.[6] Thiết bị và dữ liệu Khi muốn giao tiếp với thiết bị, chúng ta phải mở thiết bị để sử dụng và sau khi sử dụng xong thì phải đĩng thiết bị lại. Trong khi sử dụng chúng ta sẽ truy xuất các tính năng của thiết bị và theo dõi thiết bị thực thi bằng các handles và Identifiers. IV.1.3 SỬ DỤNG CÁC THIẾT BỊ XUẤT NHẬP, HỖ TRỢ WAVEFORM AUDIO Chúng ta dùng hàm waveOutOpen để mở thiết bị đầu ra nhằm xuất dữ liệu dạng waveform. Hàm sẽ mở thiết bị waveOut và trả handle về cho ứng dụng. Hệ thống multimedia sẽ hỗ trợ nhiều dạng output dữ liệu khác nhau do đĩ khi mở thiết bị nếu cần chúng ta phải chỉ định rõ thơng số dữ liệu. Ví dụ chúng ta dùng cờ WAVE_MAPPER để xác định thiết bị output sẽ xuất âm thanh dạng waveform. Dị tìm thiết bị Windows cung cấp các hàm sau giúp chúng ta xác định các thiết bị trong hệ thống phù hợp cho yêu cầu của mình. Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 25 Hàm Chức năng AuxGetNumDevs Truy xuất số lượng các thiết bị sẵn cĩ trong hệ thống WaveInGetNumDevs Truy xuất số lượng các thiết bị nhập hỗ trợ waveform audio sẵn cĩ trong hệ thống WaveOutGetNumDevs Truy xuất số lượng các thiết bị xuất hỗ trợ waveform audio sẵn cĩ trong hệ thống Các thiết bị khai báo trong hệ thống được đánh các chỉ số nhận dạng bắt đầu từ 0. Sau khi xác định số lượng các thiết bị sẵn cĩ trong hệ thống, chúng ta cĩ thể dị tìm khả năng của từng thiết bị bằng các hàm sau: Hàm Chức năng AuxGetDevCaps Truy xuất khả năng của thiết bị xuất WaveInGetDevCaps Truy xuất khả năng của thiết bị nhập dạng waveform WaveOutGetDevCaps Truy xuất khả năng của thiết bị xuất dạng waveform Các hàm truy xuất này sẽ truy xuất này sẽ lấy các cấu trúc liên quan đến khả năng của thiết bị. Các cấu trúc dưới đây sẽ tương ứng với các hàm liệt kê ở trên: Hàm Structure AuxGetDevCaps AUXCAPS WaveInGetDevCaps WAVEINCAPS WaveOutGetDevCaps WAVEOUTCAPS Thiết bị waveform cĩ khả năng hỗ trợ các dạng format khơng chuẩn. Dạng format khơng chuẩn này được dùng trong cấu trúc WAVEFORMATEX. Handle và Identifier của thiết bị Khi mở thiết bị, chúng ta sẽ nhận được handle hay thơng số Identify của thiết bị. Chúng ta sẽ điều khiển thiết bị qua các thơng số này. Sự khác biệt giữa handle và identify là khĩ thấy nhưng rất quan trọng. Identitier của thiết bị được chỉ định ngầm định từ số lượng các thiết bị sẵn cĩ trong hệ thống. Identifier sẽ được trả về khi chúng ta dùng các hàm auxGetNumDevs, waveInGetNumDevs, or waveOutGetNumDevs Hàm. Handle của thiết bị là thơng số trả về của device driver khi chúng ta dùng các hàm waveInOpen hay waveOutOpen. Waveform-Audio Output Data Types Các thơng số dưới đây được dùng cho thiết bị waveform output Cấu trúc Chức năng HWAVEOUT Handle của thiết bị waveform output WAVEFORMATEX Cấu trúc dùng chỉ định dạng format thiết bị output/ input WAVEHDR Cấu trúc dùng làm header cho khối dữ liệu Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 26 waveform. Cấu trúc được dùng cho cả thiết bị output và input WAVEOUTCAPS Cấu trúc dị hỏi khả năng của thiết bị output. Chỉ định dạng format của dữ liệu waveform audio Khi chúng ta mở thiết bị output bằng hàm waveOutOpen, thơng số pwfx sẽ chỉ định cấu trúc WAVEFORMATEX xác định dạng format của dữ liệu waveform. Đây là cấu trúc mở rơng của cấu trúc WAVEFORMAT. Ghi dữ liệu waveform Sau khi mở thiết bị xuất, chúng ta cĩ thể xuất dữ liệu bằng cách gọi hàm waveOutWrite. Hàm sẽ gửi khối dữ liệu âm thanh ra thiết bị xuất. Chúng ta dùng cấu trúc WAVEHDR để chỉ định header của khối dữ liệu được gửi ra. Header này gồm con trỏ tới khối dữ liệu đã lock, chiều dài khối dữ liệu và một số thơng số cờ. Khối dữ liệu phải được prepare trước khi đem ra sử dụng. Sau khi gửi khối dữ liệu đến thiết bị output, chúng ta phải chờ driver hồn tất việc xử lý khối dữ liệu trước khi giải phĩng nĩ. Khi chúng ta cần gửi nhiều khối dữ liệu liên tục, chúng ta sẽ phải theo dõi việc xử lý hồn tất khối dữ liệu để cĩ thể gửi khối tiếp theo. PCM Waveform-Audio Data Format Thơng số lpData trong cấu trúc WAVEHDR sẽ trỏ đến dữ liệu đã được lấy mẫu. Đối với dữ liệu PCM 8-bit, mỗi giá trị lấy mẫu được biểu diễn bằng một số 8 bit khơng dấu. Đối với dữ liệu PCM 16-bit, mỗi giá trị lấy mẫu được biểu diễn bằng một số 16 bit khơng dấu. Bảng dưới đây cho chúng ta thấy các giá trị cao nhất, thấp nhất cũng như giá trị trung bình của dữ liệu PCM: Data format Maximum value Minimum value Midpoint value 8-bit PCM 255(0xFF) 0 128 (0x80) 16-bit PCM 32,767 (0x7FFF) -32,768 (0x8000) 0 Các gĩi dữ liệu PCM Thứ tự của dữ liệu thay đổi tùy theo dạng format 8-bit hay 16-bit, stereo hay mono. Bảng dưới đây trình bày các gĩi dữ liệu của các dạng PCM khác nhau: PCM waveform Chức năng 8-bit mono Mỗi giá trị lấy mẫu là 1 byte tương ứng một kênh. Các giá trị mẫu xếp theo thứ tự 1, 2, 3, 4 . . . 8-bit stereo Mỗi giá trị lấy mẫu là 2 byte. Các giá trị mẫu xếp theo thứ tự 1, 2, 3, 4 . . . Với mỗi giá trị mẫu byte đầu là kênh 0 (trái) cịn byte sau là kênh 1 (phải). 16-bit mono Mỗi giá trị lấy mẫu là 2 byte. Các giá trị mẫu xếp theo thứ tự 1, 2, 3, 4 . . . Với mỗi giá trị mẫu byte đầu là byte thấp của kênh 0 cịn byte sau là byte cao của kênh 0. 16-bit stereo Mỗi giá trị lấy mẫu là 4 byte. Các giá trị mẫu xếp theo Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 27 thứ tự 1, 2, 3, 4 . . . Với mỗi giá trị mẫu byte đầu là byte thấp của kênh 0 (trái), byte thứ 2 là byte cao của kênh 0, byte thứ 3 là byte thấp của kênh 1 (phải) cịn byte thứ 4 là byte cao của kênh 1. Đĩng thiết bị waveform-Audio Output Sau khi thực thi cơng việc xong, chúng ta sẽ gọi hàm waveOutClose để đĩng thiết bị. Khi thiết bị đang thực thi mà gọi hàm này thì lỗi sẽ xảy ra. Nếu chúng ta muốn đĩng thiết bị giữa chừng thì đầu tiên chúng ta nên gọi hàm waveOutReset trước khi đĩng thiết bị. Nhưng trước đĩ cũng cần gọi hàm waveOutUnprepareHeader để unprepare tất cả các khối dữ liệu. Playing Waveform-Audio Files Chúng ta cĩ thể dùng các hàm sau đây để xuất dữ liệu dạng âm thanh ra loa: Hàm Chức năng MessageBeep Xuất âm thanh dưới dạng thơng báo của hệ thống SndPlaySound Xuất âm thanh dưới dạng đăng ký trước trong hệ thống hay là nội dung của một file wave PlaySound Giống như hàm trên và thêm cơ chế truy xuất trực tiếp tài nguyên. Các hàm PlaySound và sndPlaySound sẽ nạp hồn tồn nội dung file wave vào bộ nhớ và xuất ra ngõ output. Khả năng bộ nhớ của chúng cĩ giới hạn nên chúng chỉ quản lý được các nội dung dưới 100KB. Khi làm việc với các file cĩ nội dung lớn hơn thì chúng ta cĩ thể sử dụng các dịch vụ do MCI cung cấp. Sử dụng Windows message trong việc quản lý khi playback Các Thơng báo dưới đây cĩ thể được sử dụng trong quá trình xuất dữ liệu: Thơng báo Chức năng MM_WOM_CLOSE Được gửi đi khi đĩng thiết bị bằng hàm waveOutClose MM_WOM_DONE Được gửi đi sau khi driver hồn tất việc xuất dữ liệu bằng hàm wafveOutWrite. MM_WOM_OPEN Được gửi đi khi thiết bị được mở bằng hàm waveOutOpen. Các thơng số wParam và lParam cũng rất cần thiết. Thơng số wParam luơn luơn xác định handle của thiết bị waveform-audio. Đối với thơng số lParam, Thơng báo MM_WOM_DONE dùng thơng số này trỏ tới cấu trúc WAVEHDR chỉ định sụ hồn tất của dữ liệu trong khi thơng số này khơng được hai Thơng báo cịn lại dùng. Việc dùng này rất hữu hiệu, Thơng báo MM_WOM_DONE sẽ là tín hiệu được báo về sau khi việc playback khối dữ liệu hồn tất. Ta sẽ tiếp nhận Thơng báo này và giải phĩng các biến cĩ liên quan. Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 28 Thay đổi volume của quá trình playback dữ liệu waveform audio Chúng ta sẽ dùngcác hàm sau đây để lấy thơng số volume cũng như thiết lập các thơng số này theo yêu cầu. Hàm Chức năng WaveOutGetVolume Truy xuất mức volume của thiết bị xuất WaveOutSetVolume Thiết lập mức volume cho thiết bị Giá trị volume là một số doubleword. Khi audio format là stereo, 16 bit cao chỉ giá trị volume của channel phải và 16 bits thấp chỉ giá trị volume của channel trái. Cịn nếu ở các thiết bị khơng hỗ trợ 2 kênh thì 16 bit thấp sẽ được sử dụng chỉ giá trị volume cịn 16 bit cao sẽ khơng dùng đến. Giá trị volume thay đổi từ giá trị 0x0 (silence) cho đến mức 0xFFFF (maximum) Recording Waveform Audio Chúng ta cĩ thể sử dụng dịch vụ thu âm thanh theo chuẩn MCI. Tuy nhiên nếu thấy cần thiết, chúng ta cĩ thể sử dụng các hàm thu âm thanh cấp thấp. Các thơng số dữ liệu dưới đây sẽ đặc trưng cho dạng dữ liệu waveform audio input Structure Chức năng HWAVEIN Handle của thiết bị input WAVEFORMATEX Cấu trúc của dạng dữ liệu được thiết bị input hỗ trợ WAVEHDR Cấu trúc dùng làm header của khối dữ liệu input. Nĩ cũng được dùng khi xuất dữ liệu ra Output WAVEINCAPS Cấu trúc dùng dị hỏi các khả năng của thiết bị input Trước khi bắt đầu cơng việc thu dữ liệu, chúng ta phải dùng hàm waveInGetDevCaps để dị hỏi khả năng cũng như xác định các thuơc tính của thiết bị. Hàm sẽ trả về cấu trúc WAVEINCAPS xác định các thơng số mong muốn. Opening Waveform-Audio Input Devices Để thu dữ liệu, trước hết chúng ta dùng hàm waveInOpen để mở thiết bị waveform input. Nếu thực thi thành cơng, hàm sẽ trả về cho chúng ta handle của thiết bị. Managing Waveform-Audio Recording Sau khi mở thiết bị, chúng ta cĩ thể tiến hành việc thu dữ liệu. Dạng dữ liệu waveform thu được sẽ được đưa vào buffer, buffer này được trỏ đến trong cấu trúc WAVEHDR. Trước khi được sử dụng, chúng ta phải prepare buffer này. Windows cung cấp cho chúng ta các hàm sau đây dùng thu dữ liệu waveform: Hàm Chức năng WaveInAddBuffer Gửi một buffer cho device driver, thiết bị sẽ thu dữ liệu vào khối này WaveInReset Ngừng thu dữ liệu và đánh dấu tất cả các Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 29 buffer đã thu xong WaveInStart Bắt đầu thu dữ liệu. WaveInStop Kết thúc việc thu dữ liệu Chúng ta dùng hàm waveInAddBuffer để gửi các khối buffer tới device driver. Khi dữ liệu được điền đầy vào buffer, ứng dụng sẽ được thơng báo bằng window Thơng báo, callback Thơng báo, thread Thơng báo, hay event, tùy theo cờ thơng báo được chỉ định trong hàm open device. Trước khi bắt đầu thu dữ liệu, chúng ta phải gửi ít nhất một buffer dữ liệu cho thiết bị input và khi đĩng thiết bị, chúng ta gọi hàm waveInReset để đánh dấu các buffer đã được thu xong. Using Window Messages to Manage Waveform-Audio Recording Các Thơng báo sau đây sẽ được dùng để quản lý việc thu dữ liệu dạng waveform audio: Thơng báo Chức năng MM_WIM_CLOSE Được gửi đi khi thiết bị đĩng lại khi gọi hàm waveInClose MM_WIM_DATA Được gửi đi khi thiết bị thu đầy một buffer khi gọi hàm waveInAddBuffer MM_WIM_OPEN Được gửi đi khi thiết bị được open khi gọi hàm waveInOpen Thơng số lParam của MM_WIM_DATA là pointer trỏ đến cấu trúc WAVEHDR để nhận dạng buffer dữ liệu. Buffer cĩ thể khơng chứa đầy dữ liệu vì việc thu dữ liệu cĩ thể kết thúc trước khi buffer được thu đầy. Chúng ta cĩ thể biết được kích thước thật sự của dữ liệu bằng thơng số dwBytesRecorded. Audio data block Hàm waveInAddBuffer và waveOutWrite cĩ thơng số yêu cầu ứng dụng chỉ định khối dữ liệu cần cho thiết bị sử dụng cho việc thu hay playback. Các hàm trên sử dụng cấu trúc WAVEHDR để miêu tả khối dữ liệu trên. Trước khi sử dụng các hàm trên để gửi khối dữ liệu cho thiết bị. Chúng ta phải cấp phát vùng nhớ cho khối dự liệu và khối header. Khối header phải được prepare và unprepare bằng các hàm sau: Hàm Chức năng WaveInPrepareHeader Prepare khối dữ liệu input WaveInUnprepareHeader Unprepare khối dữ liệu input WaveOutPrepareHeader Prepare khối dữ liệu output WaveOutUnprepareHeader Unprepare khối dữ liệu output Trước khi gửi khối dữ liệu cho driver input hay output, chúng ta phải prepare chúng. Sau khi thiết bị sử dụng xong, các khối dữ liệu phải được unprepare trước khi giải phĩng các vùng nhớ đã cung cấp. Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 30 Khi kích thước dữ liệu lớn, chúng ta phải cung cấp các buffer liên tục cho thiết bị, quá trình này phải diễn ra liên tục cho đến khi hồn tất cơng việc và thiết bị được đĩng lại. Ứng dụng phải xác định và quản lý thời điểm mà thiết bị hồn tất việc thự thi trên các khối dữ liệu để đưa ra các tác động thích hợp. Các cách sau đây được đưa ra: Chi định hàm callback nhận Thơng báo mà thiết bị gửi khi nĩ hồn tất một khối dữ liệu. Sử dụng các event callback Chỉ định window hay thread nhận Thơng báo gửi từ thiết bị. Xác định bit WHDR_DONE trong cờ dwFlags của cấu trúc WAVEHDR đi kèm với mỗi khối dữ liệu. Khi ứng dụng khơng đáp ứng được tốc độ xử lý các buffer thì chiến lược buffer kép cĩ thể được đưa ra để tăng tốc độ thực thi. Chúng ta sẽ khảo sát một số phương thức xử lý sau khi thiết bị hồn tất một khối dữ liệu. Dùng hàm callback để xử lý các driver messages Để chỉ định hàm callback xử lý ứng vớicác driver message, chúng tachỉ định cờ CALLBACK_FUNCTION trong biến fdwOpen và địa chỉ hàm xử lý trong biến dwCallback khi gọi hàm waveInOpen hay waveOutOpen. Messages gửi cho hàm callback tương tự như Thơng báo gửi cho window, ngoại trừ việc nĩ cĩ hai thơng số DWORD thay vì một thơng số DWORD và một thơng số UINT. Để gửi dữ liệu cho hàm callback chúng ta cĩ thể dùng một trong hai cách sau: Dùng thơng số dwInstance trong hàm open device Dùng field dwUser trong cấu trúc WAVEHDR để chỉ định khối dữ liệu gửi cho device driver. Dùng event callback xử lý các driver message Để dung event callback, chúng ta dùng hàm CreateEventđể truy xuất handle của event. Trong hàm open thiết bị, chỉ định cờ CALLBACK_EVENT cho thơng số fdwOpen. Sau khi gọi hàm waveOutPrepareHeader nhưng trước khi gửi dữ liệu cho thiết bị, chúng ta tạo ra một nonsignal event bằng cách gọi hàm ResetEvent, chỉ định event handle được lấy từ hàm CreateEvent. Trong vịng loop để kiểm tra khi bit WHDR_DONE được set trong cấu trúc WAVEHDR, chúng ta gọi hàm WaitForSingleObject, chỉ định thơng số event handle và giá trị time-out là INFINITE. Giá trị event callback là giá trị dùng gọi hàm callback. Bởi vì event callback khơng xác định được thơng báo xác định close, done hay open. Ứng dụng phải kiểm tra tình trạng của hệ thống đang chờ sự kiện gì xảy ra để đưa ra các đáp ứng chính xác. Dùng window hay thread để xử lý các message driver Để dùng hàm window callback, chúng ta chỉ định thơng số CALLBACK_ WINDOW trong biến fdwOpen và chỉ định handle của window trong thơng số dwCallback khi gọi hàm open thiết bị. Driver message sẽ được gửi tới window procedure. Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 31 Tương tự như vậy, chúngta sẽchỉ định thơng số CALLBACK_THREAD và thread handle trong hàm open khi chúng ta muốn thread xử lý các driver message. Ngồi cách thức dùng hàm callback, chúng ta cĩ thể dựa vào thơng số dwFlags trong WAVEHDR để xác định xem thiết bị cĩ hồn tất việc xử lý khối dữ liệu hay chưa. Các hàm kiểm tra lỗi Các hàm waveform audio sẽ trả về giá trị khác 0 khi cĩ lỗi xảy ra. Windows cung cấp cho chúng ta các hàm xác định lỗi dựa trên các thơng số này. Ứng dụng sẽ dựa vào các thơng số xác định lỗi để quyết định cơng việc thực thi tiếp tục. Các hàm sau được dùng để xác định các lỗi xảy ra: Hàm Chức năng WaveInGetErrorText Trả về chuỗi text xác định lỗi xảy ra của input device WaveOutGetErrorText Trả về chuỗi text xác định lỗi xảy ra của output device IV.2 KỸ THUẬT TRUYỀN NHẬN ÂM THANH TRÊN MẠNG IP IV.2.1 MƠ HÌNH LIÊN KẾT VÀ TRAO ĐỔI DỮ LIỆU Chương trình dùng giao thức TCP/IP làm giao thức giao tiếp. Việc thiết lập liên kết cũng như trao đổi dữ liệu đều tuân theo các cấp của giao thức này. Việc gọi và thiết lập liên kết được thực hiện theo mơ hình client/server, việc trao đổi dữ liệu được thực hiện thơng qua socket theo giao thức TCP. Cĩ hai ý tưởng được đưa ra trong việc dùng socket để trao đổi dữ liệu. Dùng 1 socket : Mỗi máy dùng một socket để truyền nhận dữ liệu. Theo giao thức TCP sau khi hai socket connect được với nhau thì việc tiến hành trao đổi dữ liệu sẽ bắt đầu. Chúng ta sẽ dùng cặp socket này. Như vậy, một socket trên một máy đồng thời đảm nhận việc truyền dữ liệu đi cũng như nhận dữ liệu về.[3] socket socket Yêu cầu socket Yêu cầu truyền dữ liệu nhận dữ liệu Hình IV.1 Mơ hình dùng 1 socket Cách dùng này cĩ đặc điểm là việc tạo liên kết đơn giản, quá trình tạo liên kết hồn tồn giống như các bước trong việc tạo liên kết giữa các socket dùng giao thức TCP. Chương trình chạy và lắng nghe ở một port xác định. Khi cĩ một yêu cầu gọi liên kết đến, chương trình sẽ tạo ra một socket để nối kết với socket gọi. Sau khi thiết Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 32 lập liên kết thì các socket bắt đầu gửi nhận dữ liệu. Socket sẽ gửi dữ liệu âm thanh đi đồng thời nhận dữ liệu truyền tới và chuyển cho hệ thống xử lý. Socket làm việc theo cách này sẽ nhận hai thơng báo cùng một lúc. Khi cĩ dữ liệu từ mạng truyền tới, hệ thống sẽ thơng báo cho socket để tiến hành việc nhận dữ liệu. Cũng tương tự như vậy, khi cĩ dữ liệu âm thanh sẵn sàng, hệ thống cũng sẽ gọi socket để truyền đi. Như vậy, khi thực thi socket sẽ nhận được hai thơng báo của hệ thống. Vì việc truyền nhận dữ liệu âm thanh là dạng dữ liệu liên tục cho nên tần suất mà hệ thống thơng báo cho socket là rất thường xuyên. Vì vậy, socket trong cùng một lúc cĩ thể nhận được cả hai yêu cầu truyền dữ liệu đi và nhận dữ liệu về. Thêm vào đĩ các hoạt động truyền nhận dữ liệu là các hoạt động bị tắc nghẽn. Do đĩ chúng ta phải lưu ý đến hiện tượng này, socket cĩ thể đáp ứng khơng kịp nhu cầu của hệ thống. Chúng ta lấy một trường hợp ví dụ. Khi socket nhận được yêu cầu truyền dữ liệu đi, nĩ sẽ lấy dữ liệu từ các buffer và truyền đi. Do quá trình truyền dữ liệu cĩ thể bị tắc nghẽn, socket sẽ phải chờ. Đồng thời trong lúc này, nĩ lại nhận được tín hiệu thơng báo cĩ buffer kế tiếp cần truyền đi và tín hiệu thơng báo cĩ dữ liệu trên mạng truyền về. Với các yêu cầu dồn dập như vậy, hệ thống cĩ thể sẽ đáp ứng khơng kịp và chương trình cĩ thể bị treo. Vì vậy, khi dùng một socket để truyền nhận dữ liệu, chúng ta phải tính tốn cân đối thời gian giữa việc truyền dữ liệu đi và việc nhận dữ liệu về sao cho hợp lý để hệ thống cĩ thể làm việc liên tục được. Chúng ta cĩ thể qui định thời gian cho việc truyền nhận. Trong một thời điểm socket cĩ thể chỉ làm việc truyền dữ liệu đi, các yêu cầu nhận dữ liệu sẽ bị ngưng lại. Sau đĩ socket sẽ chỉ xử lý các yêu cầu nhận dữ liệu. Chiến lược này giúp giảm nhẹ hoạt động của socket. Tuy nhiên, chúng ta cần áp dụng cho cả hai socket liên kết. Trong một thời điểm, một socket sẽ truyền cịn socket cịn lại sẽ nhận dữ liệu, và thời điểm sau thì quá trình sẽ diễn ra theo chiều ngược lại. Dùng 2 socket : Xuất phát từ ý tưởng trên, chúng ta cĩ thể dùng hai socket trong việc trao đổi dữ liệu. Một liên kết hình thành giữa hai máy sẽ gồm hai cặp socket liên kết với nhau. Một socket chỉ đảm nhận việc truyền dữ liệu trong khi socket cịn lại đảm nhận việc nhận dữ liệu.[3] Socket Socket truyền truyền Socket Socket nhận nhận Yêu cầu truyền Socket dữ liệu truyền Socket nhận Yêu cầu nhận dữ liệu Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 33 Hình IV.2 Mơ hình dùng 2 socket Vì mỗi socket chỉ nhận một tín hiệu nhất định. Socket truyền sẽ chỉ chú ý tới tín hiệu báo cĩ dữ liệu của hệ thống để tiến hành truyền dữ liệu đi. Trong khi đĩ, socket nhận sẽ chỉ lưu ý đến tín hiệu báo cĩ dữ liệu của hệ thống. Hai socket sẽ hoạt động độc lập với nhau và cơng việc của một socket sẽ nhẹ nhàng hơn mơ hình trên. Tuy nhiên, trong mơ hình này, việc thiết lập liên kết giữa hai máy sẽ trở nên phức tạp hơn. Theo mơ hình client/server, khi một socket gọi và thiết lập liên kết với chương trình ở máy remote xong thì máy remote cũng phải tạo ra một socket và tiến hành liên kết ngược lại. Sau khi cặp socket hồn tồn liên kết xong thì hai máy mới coi như đã connect và tiến hành truyền nhận dữ liệu. Một khía cạnh khác cần lưu ý là tuy hai socket hoạt động độc lập với nhau nhưng chúng đều thuộc cùng một chương trình và chúng đều tiến hành việc gửi nhận dựa trên các giao thức lớp dưới chung. Do đĩ, trong một thời điểm chỉ cĩ một hoạt động diễn ra hoặc là truyền dữ liệu hoặc là nhận dữ liệu. Vì vậy thật ra hai socket cũng phải hoạt động phụ thuộc nhau. Socket gửi dữ liệu phải chờ socket nhận nhận xong dữ liệu rồi mới bắt đầu truyền đi và ngược lại việc truyền dữ liệu phải được hồn tất thì việc nhận dữ liệu mới cĩ thể tiến hành được. Một vấn đề khác nẩy sinh do đặc điểm của dữ liệu. Dữ liệu tiếp nhận là dạng dữ liệu liên tục do đĩ, các tín hiệu mà hệ thống báo cho hai socket cũng xảy ra liên tục, vì vậy thực sự rằng tuy chỉ làm một cơng việc nhưng khối lượng cơng việc mà socket phải đảm nhận là rất lớn. Thêm vào đĩ, hai socket đều phụ thuộc vào một process do đĩ thật sự xét về mặt thực thi của quá trình thì khả năng giảm nhẹ cơng việc là khơng bao nhiêu. Và khả năng hệ thống bị treo do quá tải cũng vẫn cĩ thể xảy ra. Chúng ta cĩ những cách giải quyết để giảm nhẹ việc thực thi của chương trình như dùng cơ chế xử lý song song (thread) hay dùng cơ chế phân chia thời gian cho các hoạt động như đã nĩi ở trên. IV.2.2 CƠ CHẾ GỌI VÀ XÁC LẬP LIÊN KẾT Khi liên kết được xác lập, chúng ta sẽ bắt đầu tiến hành trao đổi dữ liệu. Tuy nhiên trước hết chúng ta cần khảo sát phương pháp gọi cũng như thiết lập liên kết. Chương trình được hiện thực dựa trên cơ chế client/server cho nên việc tạo liên kết cũng dựa trên cơ chế này. Ý tưởng chính là: khi chương trình bắt đầu thực thi, nĩ cũng bắt đầu lắng nghe lời gọi liên kết ở một port xác định. Thực sự, trong chương trình chúng ta sẽ tạo ra một socket server và lắng nghe ở một port qui ước trước. Khi một socket khác muốn tạo liên kết, nĩ sẽ tiến hành gọi liên kết với socket server ở giá trị port này.[3] Trong giao thức TCP/IP, một quá trình giao tiếp thơng qua mơi trường mạng phải cĩ một chỉ số port xác định. Các quá trình khác nhau phải cĩ port khác nhau. Khi thiết kế mơ hình client/server, các nhà thiết kế đã tạo ra một số dịch vụ thơng dụng trên mạng như: finger, echo, mail, ftp . . . Các server của các dịch vụ này được dành sẵn các port xác định mà khơng một quá trình nào được phép sử dụng. Các port này được gọi là well-known port và do hệ thống cấp phát và quản lý. Thơng thường, các chỉ số well-known port cĩ giá trị từ 0 đến 1023. Các ứng dụng khơng được phép sử dụng giá trị port trong khoảng này. Ứng dụng cĩ thể dùng các giá trị port từ 1024 trở đi. Ví dụ: khi chúng ta cần tạo một socket mà khơng cần quan tâm đến giá trị port, Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 34 chúng ta cĩ thể nhờ hệ thống cấp cho một giá trị port cịn trống. Thơng thường các giá trị port mà hệ thơng cung cấp cho ứng dụng khi cĩ yêu cầu nằm trong khoảng từ 1024 đến 5000. Cịn khi chúng ta muốn chỉ định một giá trị port cho socket, chúng ta sẽ cĩ thể chọn giá trị từ 5000 trở đi. Vì trong vùng này xác suất mà port đĩ đã bị chiếm là rất hiếm. Vì vậy, khi thiết kế chúng ta muốn tạo một port cố định thì nên chọn socket lắng nghe ở một port cĩ giá trị lớn hơn 5000. Giá trị được chọn là 7699 nhưng mơ hình của chúng ta là : trong một chương trình vừa cĩ đĩng vai trị là client vừa là server nên ta chọn port cĩ thể thay đổi được trong khoảng từ 1024 đến 5000. Khi muốn tạo liên kết, chúng ta sẽ tạo một socket và tiến hành connect vào socket đang lắng nghe ở một địa chỉ và port lắng nghe. Khi socket listen nhận thấy cĩ yêu cầu liên kết, nĩ sẽ thơng báo cho người sử dụng biết. Nếu nguời sử dụng đồng ý thì nĩ sẽ tiến hành connect và việc trao đồi dữ liệu bắt đầu. Nếu người sử dụng từ chối thì ứng dụng sẽ thơng báo cho phía gọi lời từ chối và đĩng liên kết lại. Chúng ta nĩi thêm về địa chỉ khi liên kết. Do chương trình hiện thực trên mơi trường mạng Windows là mơi trường mạng workgroup. Mỗi máy được xem như một host riêng lẻ. Nếu trên mạng khơng cĩ các server như server novell hay server NT thì chúng ta khơng thể biết được các thơng tin về một máy remote nếu chúng ta khơng tạo liên kết với máy đĩ. Vì vậy, trong cơ chế liên kết, chúng ta chọn việc định địa chỉ để liên kết. Một máy muốn thiết lập liên kết với một máy khác thì phải nhập thơng số là địa chỉ IP của máy đĩ. IV.2.3 CƠ CHẾ TRUYỀN NHẬN DỮ LIỆU Khi viết một ứng dụng trên mơi trường Windows, chúng ta phải lưu ý đến đặc điểm của mơi trường Windows là mơi trường cĩ kiến trúc message-driven. Windows được xem là một mơi trường cĩ kiến trúc message-driven hay event-driven vì khơng một chương trình nào trên windows cĩ thể thực thi nếu khơng cĩ một Thơng báo hay một sự kiện kích khởi nĩ. Trong mơi trường Windows luơn tồn tại một vịng lặp message loop. Vịng message loop này sẽ truy xuất các Thơng báo từ các hàng chờ của các chương trình và tùy theo loại Thơng báo hay sự kiện, nĩ cho phép window procedure tương ứng thực thi. Vì vậy trên mơi trường Windows cĩ thể tồn tại nhiều ứng dụng cùng một lúc mỗi ứng dụng cĩ một hàng chờ Thơng báo riêng. Khi cĩ một sự kiện xảy ra, hệ thống sẽ xác định xem sự kiện đĩ tuơng ứng với ứng dụng nào và chuyển Thơng báo đến hàng chờ của ứng dụng tương ứng đĩ. Tùy theo loại Thơng báo mà ứng dụng sẽ gọi chương trình tương ứng thực thi. Mơi trường windows 16 bits là mơi trường nonpreemptive, cĩ nghĩa là khi một ứng dụng đang xử lý một Thơng báo thì khơng một ứng dụng nào cĩ thể thực thi được. Phải chờ cho đến khi procedure của ứng dụng tiến hành xong cơng việc và trả về thì lúc đĩ procedure tương ứng với Thơng báo tiếp theo trong hàng chờ mới được thực thi. Trong khi đĩ các mơi trường Win32 như Windows98, WindowsNT lại thực thi theo cơ chế preemptive. Trong mơi trường này, việc procedure nào được thực thi là do hệ thống quyết định. Thật ra, trong mơi trường Win32, hệ thống định thời cho các thread thực thi. Thread chính là đoạn mã thực thi của một chương trình nên các chương trình đều cĩ cơ hội thực thi. Khi winsock được thiết kế lần đầu tiên, các mơ hình thiết kế được làm cho phù hợp với cơ chế “ message-driven” và “ nonpreemptive” của Windows 16bits. Một số hàm socket nguyên thủy khi thực thi cần một khoảng thời gian tương đối. Khi hàm thực thi rơi vào tình trạng này, nĩ được gọi là bị tắc nghẽn. Khi một hàm bị tắc nghẽn, Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 35 nĩ sẽ ngăn trở việc thực thi của các hàm khác trong hệ thống. Trong hệ thống UNIX, mơi trường mà socket được thiết kế đầu tiên, các hàm blocking này khơng gây trở ngại cho hệ thống vì hệ thống sẽ chiếm giữ các quá trình bị blocking và cho phép các quá trình khác thực thi. Trong khi đĩ, hệ thống Windows 16 bits khơng cĩ khả năng chiếm giữ các quá trình blocking. Dẫn đến việc hệ thống khơng tiếp tục thực thi được vì các quá trình khác khơng cĩ cơ hội thực thi. Hệ thống phải chờ cho đến khi quá trình blocking hồn tất cơng việc thì mới tiếp tục thực thi được. Khi thiết kế winsock, các nhà thiết kế đã tính đến khả năng này. Vì vậy họ cĩ một giải pháp là đưa một đoạn mã đặc biệt vào hàm blocking để cho phép các quá trình khác kiểm tra được hàng chờ Thơng báo của mình. Tuy nhiên đây khơng phải là một giải thuật hiệu quả. Trong hệ thống socket của Berkeley các nhà nghiên cứu cũng đã lưu ý đến vấn đề này khi thiết kế, và họ đã thiết kế các hàm nonblocking bên cạnh các hàm blocking. Chúng ta xét một ví dụ là hàm send() của socket. Khi hoạt động ở chế độ blocking, hàm send() sẽ gửi dữ liệu đi, hàm sẽ bị tắc nghẽn và nĩ chỉ trả về khi hồn tất việc truyền dữ liệu, tức là dữ liệu đã được nhận hồn tồn. Cịn nếu socket được tạo ra ở cơ chế bất đồng bộ, hàm send() sẽ hoạt động ở chế độ non-blocking. Hàm send() sau khi gửi dữ liệu đi sẽ trả về ngay lập tức. Và hệ thống sẽ phải gọi một hàm khác như select() để quan sát tình trạng của việc gửi dữ liệu. Trên mơi trường Windows chúng ta cũng cĩ thể sử dụng các hàm non-blocking. Tuy nhiên các nhà thiết kế winsock cịn đưa ra các hàm bất đồng bộ.[3] Các hàm bất đồng bộ được đưa ra dựa trên cơ chế hoạt động message-driven của mơi trường Windows. Chúng ta lấy ví dụ là các hàm gửi nhận dữ liệu. Việc gửi dữ liệu khơng nhất thiết phải diễn ra ngay lập tức, và việc nhận dữ liệu sẽ bắt buộc chương trình phải chờ trừ phi nĩ nhận được một hằng đặc biệt. Bằng cách tạo socket ở chế độ non-blocking để dùng các hàm non-blocking và kết hợp với hàm WSAAssyncSelect(), ứng dụng sẽ nhận được các message thơng báo sự kiện để báo cho chương trình biết khi nào chương trình cĩ thể gửi dữ liệu đi hoặc đã cĩ dữ liệu truyền đến cần đọc ra từ socket. Trong các khoảng thời gian cịn lại, khi khơng cĩ thơng báo các phần khác của hệ thống cĩ thể thực thi được. Các hàm bất đồng bộ rất phù hợp cho các hoạt động diễn ra trên mơi trường Windows 16 bits là mơi trường nonpreemptive. Trong mơi trường Win32 như Windows NT hay Windows98 là mơi trường preemptive các hàm blocking vẫn cĩ thể sử dụng được. Tuy nhiên việc dùng các hàm bất đồng bộ trên mơi trường Win32 giúp chương trình đáp ứng tốt hơn cho việc tương tác với người sử dụng. Một hàm blocking sẽ ngăn trở hệ thống đáp ứng kịp thời cho các thao tác của người sử dụng. Điều này rất quan trọng trên một mơi trường giao diện như Windows. Vì vậy các hàm bất đồng bộ vẫn được sử dụng. Vì mơi trường Windows98 cĩ hỗ trợ cơ chế lập trình song song thơng qua việc định thời thực thi cho các thread, do đĩ trong việc thiết kế, chúng ta chọn dùng cơ chế blocking và thực hiện việc lập trình socket bằng các đối tượng do MFC cung cấp là các lớp CAsyncSocket, CSocket, CSocketFile, CArchive. Việc chọn lập trình bằng cơng cụ này vì cĩ nhữnh đặc điểm sau: Các lớp đối tượng đều do MFC hỗ trợ, phù hợp với cấu trúc chương trình được xây dựng dựa trên các lớp đối tượng MFC. Ứng dụng được xây dựng trên các lớp đối tượng MFC bằng các cơng cụ AppWizard, ClassWizard. Việc viết ứng dụng sẽ dễ dàng và đơn giản hơn. Và khi ứng dụng cĩ hỗ trợ socket thơng qua các lớp đối tượng socket của MFC ở trên, việc lập trình sẽ trở nên tiên lợi hơn. Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 36 Việc lập trình socket trên các lớp đối tượng thường dễ dàng và đơn giản hơn so với việc lập trình bằng các hàm socket nguyên thủy được hỗ trợ bởi Windows SDK. Chúng ta lấy một ví dụ như sau: tạo một socket và lắng nghe ở một port xác định.[6] Lập trình bằng cơng cụ do Windows SDK hỗ trợ: // Tạo Socket SOCKET hSocket = socket ( int af = PF_INET, int type = SOCK_STREAM, int protocol = 0); // Ràng buộc socket vào một port cố định SOCKADDR_IN sin; u_short alport = IPPORT_RESERVED; sin.sin_family = AF_INET; sin.sin_addr.s_addr = 0; for (;;) { sin.sin_port = htons(alport); if (bind(hSocket, (LPSOCKADDR)&sin, sizeof (sin)) == 0){ /* it worked */ } if ( GetLastError != WSAEADDRINUSE) { /* fail */ } alport ; if (alport == IPPORT_RESERVED/2 ) { /* fail all unassigned reserved ports are */ /* in use. */ } } // Lắng nghe lời gọi liên kết int listen ( hSocket, int backlog = 5 ); Trong khi đĩ nếu chúng ta lập trình bằng các lớp socket do MFC hỗ trợ thì các cơng việc phải thực thi như sau: // Tạo lớp đối tượng CSocket* m_pSocket = new CSocket; // Tạo socket và ràng buộc vào một port xác định m_pSocket->Create(nPort); // Lắng nghe lời gọi liên kết Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 37 m_pSocket->Listen(); Khi lập trình chúng ta chọn các hàm blocking vì chúng được hỗ trợ bởi cơng cụ lập trình serialize. Cơ chế serialize cho phép hệ thống đảm bảo việc truyền nhận dữ liệu trên socket. Việc lập trình socket thơng qua cơ chế serialize cũng đơn giản và dễ dàng hơn. Vì chương trình được hiện thực trên mơi trường Windows98 cho nên chúng ta sẽ thực thi vào các hàm truyền nhận của socket. Vì vậy các hàm blocking cũng khơng ảnh hưởng nhiều đến việc thực thi của chương trình cũng như trong tồn hệ thống. Ngồi ra việc dùng cơ chế Serialize (Serialization là một quá trình đọc một đối tượng dữ liệu từ đĩa hay ngược lại, ghi chúng lên dĩa. MFC hỗ trợ cơ chế serialization trong class object vì vậy bất cứ đối tượng nào dẫn xuất từ object đều thừa hưởng cơ chế serialization) cũng đồng nghĩa với việc chúng ta dùng giao thức TCP trong việc truyền nhận dữ liệu. Việc dùng giao thức này giúp quá trình trao đổi dữ liệu được diễn ra tin cậy hơn. Dĩ nhiên phí tổn hệ thống phải bỏ ra cũng cao hơn. Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 38 CHƯƠNG V THIẾT KẾ CHƯƠNG TRÌNH TRUYỀN ÂM THANH TRÊN MẠNG LAN V.1 MƠI TRƯỜNG VÀ CƠNG CỤ LẬP TRÌNH V.1.1 MƠI TRƯỜNG WINDOWS Hệ điều hành Windows là hệ điều hành đa nhiệm , tức là nhiều chương trình cĩ thể chạy một lúc. Trong mơi trường đa nhiệm, chương trình cĩ thể chia làm nhiều phần nhỏ gọi là các nhánh(thread) chạy đồng thời với nhau. Một chương trình khi chạy bao giờ cũng cĩ một nhánh chính, sau đĩ chương trình cĩ thể tạo ra các nhánh con bằng cách gọi đến các hàm CreateThread. Hệ điều hành sẽ làm nhiệm vụ điều khiển các nhánh này. Windows cho phép đặt các mức ưu tiên cho các nhánh. Nhánh luơn được khởi tạo ở mức ưu tiên bình thường, chương trình cĩ thể thay đổi các mức ưu tiên của các nhánh bằng cách dùng hàm SetThreadPriority tuỳ theo mức yêu cầu. Cĩ các mức ưu tiên sau đây : Idle Below Normal Normal Above Normal High Readtime Mức ưu tiên dành cho các ứng dụng chỉ hoạt động khi hệ thống rỗi, mức cuối cùng dành cho các ứng dụng địi hỏi thời gian thực. IV.1.2 CƠNG CỤ LẬP TRÌNH Do đặc điểm của chương trình là truyền nhậnh âm thanh trên mạng. Do đĩ lập trình liên qua rất nhiều đến winsock. Hiện nay cĩ rất nhiều ngơn ngữ hỗ trợ cho việc lập trình trên mạng. Qua tìm hiểu em thấy rằng ngơn ngữ Visual C++ 6.0 cĩ những hàm WinSock và những cấu trúc được khai báo trong WINSOCK.H cho cả mơi trường 16 cũng như 32 bit. Những hàm Winsock được hiện thực trong WINSOCK.DLL (hay WSOCK32.DLL ứng với bản 32 bit). Chương trình ứng dụng sẽ được link với WINSOCK.LIB (hay WSOCK32.LIB). Chính vì vậy rất thích hợp cho lập trình các ứng dụng trên mạng. Các Hàm TCP/IP Sau đây là ý nghĩa chi tiết các tham số của các hàm TCP/IP. Để sử dụng các hàm này, trong chương trình cần cĩ chỉ thị [6] : # include Hàm accept : ·Cú pháp: SOCKET PASCAL FAR accept ( SOCKET s, struct sockaddr FAR * addr, Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 39 int FAR &addrlen); ·Chức năng: Xác nhận mối nối của client. Nếu thành cơng, sẽ trả về socket được nối vào, ngược lại trả về giá trị INVALID_SOCKET. Ý nghĩa các tham số : Tham số Ý nghĩa S Socket đang chờ client nối vào Addr Bộ đệm nhận về địa chỉ client nối vào Addrlen Chiều dài của địa chỉ trả về trong addr Hàm bind : ·Cú pháp: int PASCAL FAR bind ( SOCKET s, const struct sockaddr FAR * name, int namelen); ·Chức năng: Kết buộc socket với port, đối với mỗi nghi thức ứng dụng chuẩn thì sẽ cĩ một hằng số định nghĩa sẵn trong winsock cho port của nghi thức đĩ. Nếu thành cơng trả về 0, ngược lại trả về trị SOCKET_ERROR. Ý nghĩa các tham số : Tham số Ý nghĩa S Socket đang chờ kết buộc Name Địa chỉ port mà socket sẽ được kết buộc Namelen Chiều dài của tham số name Hàm closesocket : ·Cú pháp: int PASCAL FAR closesocket ( SOCKET s); ·Chức năng: Sau khi hồn tất quá trình trao đổi dữ liệu, ứng dụng gọi hàm closesocket để đĩng socket đã tạo. Hàm connect : ·Cú pháp: int PASCAL FAR connect ( SOCKET s, const struct sockaddr FAR * name, int namelen); ·Chức năng: Gọi hàm connect để nối client vào server. Nếu thành cơng trả về 0, ngược lại trả về giá trị SOCKET_ERROR. Ý nghĩa các tham số : Tham số Ý nghĩa s Socket đang chờ được nối với server Name Địa chỉ server sẽ nối Namelen Chiều dài của tham số name Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 40 Hàm inet_ntoa : ·Cú pháp: char FAR* PASCAL FAR inet_ntoa (struct in_addr iadddr ); ·Chức năng: Nhận vào một địa chỉ internet iaddr và đổi thành địa chỉ internet dưới dạng chuỗi. Hàm listen : ·Cú pháp: int PASCAL FAR listen ( SOCKET s, int backlog); ·Chức năng: Tạo một hàng đợi tối đa backlog client trên port chờ được kết buộc với socket s. Hàm recv : ·Cú pháp: int PASCAL FAR revc ( SOCKET s, char FAR* buf, int len, int flags); ·Chức năng: Nhận dữ liệu từ socket. Sử dụng cho nghi thức TCP. Ý nghĩa các tham số : Tham số Ý nghĩa s Socket để nhận dữ liệu buf Bộ đệm chứa dữ liệu đọc được len Kích thước bộ đệm flags Cách thực hiện thao tác Hàm recvfrom : ·Cú pháp: int PASCAL FAR recvfrom( SOCKET s, char FAR* buf, int len, int flags, struct sockaddr* from, int fromlen); ·Chức năng: Nhận dữ liệu từ socket UDP, xác định địa chỉ của socket đã gửi dữ liệu. Ý nghĩa các tham số : Tham số Ý nghĩa s Socket để nhận dữ liệu buf Bộ đệm chứa dữ liệu đọc được Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 41 len Kích thước bộ đệm flags Cách thực hiện thao tác, nhận giá trị MSG_PEEK hay MSG_OOB from Địa chỉ nơi dữ liệu được gửi đi fromlen Chiều dài của fromlen Hàm send : ·Cú pháp: int PASCAL FAR send ( SOCKET s, const char FAR* buf, int len, int flags); ·Chức năng: Gửi dữ liệu qua socket. Sử dụng cho nghi thức TCP .Ý nghĩa các tham số: Tham số Ý nghĩa S Socket để gửi dữ liệu Buf Bộ đệm chứa dữ liệu sẽ truyền Len Kích thước bộ đệm Flags Cach thực hiện thao tác Hàm sendto : ·Cú pháp: int PASCAL FAR sendto ( SOCKET s, const char FAR* buf, int len, int flags, const struct sockaddr *to, int tolen); ·Chức năng: Gửi dữ liệu đến một socket xác định. Sử dụng cho nghi thức UDP.Ý nghĩa các tham số: Tham số Ý nghĩa s Socket để gửi dữ liệu buf Bộ đệm chứa dữ liệu sẽ truyền len Kích thước bộ đệm Flags Cách thực hiện thao tác to Địa chỉ máy phải gửi dữ liệu Tolen Chiều dài của tolen Hàm setsockopt : ·Cú pháp: int PASCAL FAR setsockopt ( SOCKET s, int level, Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 42 int optname); const char FAR* optval, int optlen); ·Chức năng: Đặt các thuộc tính tùy chọn cho socket.Ý nghĩa các tham số như sau: Tham số Ý nghĩa s Socket cần được đặt thuộc tính level Mức định nghĩa thuộc tính, chỉ cĩ thể nhận giá trị SOL_SOCKET hay IPPROTO_TCP optname Tên option muốn đặt, một số giá trị thơng dụng : -SO_BROADCAST: Cho phép truyền thơng broadcast trên socket. -SO_LINGER : Chờ trước khi đĩng socket nếu cịn dữ liệu chưa gửi. Optval Bộ đệm chứa giá trị sẽ gán cho option, cĩ thể là BOOL hay struct, int tùy thuộc vào optname cụ thể Optlen Chiều dài của optlen Hàm socket : ·Cú pháp: SOCKET PASCAL FAR socket ( int addr, int type, int protocol); ·Chức năng: Tạo một socket và trả về handle của socket nếu thành cơng, trường hợp cĩ lỗi trả về giá trị INVALID_SOCKET.Ý nghĩa các tham số như sau: Tham số Ý nghĩa addr Đặc tả dạng lưu trữ địa chỉ, hiện nay chỉ cĩ thể nhận giá trị AF_INET cho Internet type Qui định lựa chọn TCP hay UDP SOCKET_STREAM: ứng với TCP SOCKET_DGRAM : ứng với UDP Protocol Qui định nghi thức đặc biệt được dùng với socket, nhận giá trị 0 nếu khơng muốn sử dụng một nghi thức đặc biệt Hàm WSAStartup : ·Cú pháp: int PASCAL FAR WSAStartup( WORD version, LPWSADATA lpWSAData); ·Chức năng: Đây là hàm phải gọi đầu tiên khi sử dụng socket. Hàm cĩ nhiệm vụ khởi tạo thư viện liên kết động Windows socket DLL.Ý nghĩa các tham số như sau : Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 43 Tham số Ý nghĩa version Version cao nhất của Windows sockets API cĩ thể sử dụng LpWSAData Chỉ đến cấu trúc WSADATA nhận về chi tiết thực hiện của Windows Socket Hàm WSACleanup : ·Cú pháp: int PASCAL FAR WSACleanup(void); ·Chức năng: Khi chấm dứt sử dụng các hàm socket phải gọi WSACleanup để đĩng thư viện liên kết động Windows Socket DLL. V.2 THIẾT KẾ CHƯƠNG TRÌNH CPHONE Từ những lý thuyết ở trên em xin xây dựng chương trình CPhone với mục đích chính là truyền âm thanh trên mạng LAN như sau : Cơng nghệ điện thoại ngày nay tuy phát triển mạnh và cĩ nhiều phương pháp nén tín hiệu âm thanh cĩ hiệu quả. Nhưng ở Việt Nam hiện nay mới chỉ bắt đầu đưa vào sử dụng. Trong điều kiện thời gian và trình độ cĩ hạn nên đồ án này khơng thể đưa ra một mơ hình điện thoại Internet hồn chỉnh với đầy đủ các phương pháp nén tiếng nĩi hiệu quả mà chỉ đưa ra mơ hình truyền nhận tiếng nĩi đơn giản nhất giữa hai thực thể máy tính. V.2.1 MƠ HÌNH TRUYỀN ÂM THANH PC – PC TRÊN MẠNG Việc xậy dựng một hệ thống sử dụng cơng nghệ điện thoại Internet theo mơ hình thứ 2 và thứ 3 đã trình bầy trong phần mở đầu địi hỏi quá trình nghiên cứu và thiết bị kỹ càng, đầu tư cơng nghệ, vốn thích đáng mới cĩ thể thực hiện được. Trong đồ án này thực hiện theo mơ hình thứ nhất là PC – PC, nĩ đơn giản hơn và khơng cầu đầu tư thiết bị mới, cĩ thể tận dụng được các thiết bị cĩ sẵn, cĩ thể thiết kế. Thử nghiệm hồn chỉnh trong phạm vì đồ án tốt nghiệp. Mơ hình PC – PC thức hiện hầu hết các thao tác bằng phần mềm, 2 máy tính chạy cùng một phần mềm như vậy cĩ thể dễ dàng mở rộng dần từng bước, cĩ thể thử nghiệm trên mạng LAN, sau đĩ cĩ thể thử nghiệm trên mạng Internet. Các bước cơ bản cho mơ hình PC – PC gồm : - ¢m thanh anolog từ microphone được chuyển thành digital tại soundcard(PCM,8kHz,8bits/mẫu). - Các mẫu được sao chép vào vùng đệm thành các khối cĩ độ lớn nhất định. - Dùng các thuật nén PCM để nén các khối đĩ. - Thêm vào khối đã nến các thơng tin khác - Gửi khối dữ liệu sau khi dịng goi đĩ qua socket(TCP/UDP) - Gĩi tín được truyền qua mạng vật lý đến đầu kia - Loại bỏ các thơng tin thêm vào, giải nén các khối dữ liệu đĩ, ghi khối dữ liệu âm thanh được giải mã vào vùng đệm - Chép các mẫu trên vào vùng đệm của soundcard - Soundcard chuyển đổi các mẫu đĩ thành âm thanh. V.2.2 XÂY DỰNG MƠ HÌNH CPHONE Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 44 Phần này trình bầy mơ hình ứng dụng truyền âm thanh thoại cho phép trao đổi âm thanh trên mạng LAN, gọi tên là CPhone. Hinh V.1 Cấu trúc của mơ hình CPhone Mơ hình này gồm các yếu tố chính như sau: - Thiết bị ngoại vi và các kết nối vật lý (Physical transport) : Một số các thiết bị ngoại vi cần thiết như : micro, loa, sound card. Các thiết bị này đảm nhận việc thu , một phần của quá trình xử lý tiếng nĩi và phát tiếng nĩi. Các kết nối vật lý cung cấp phương tiện trên đĩ các bit dữ liệu được truyền. Kết nối Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 45 vật lý CPhone trong mạng LAN, WAN, Internet cĩ thể là cáp đồng trục, cáp quang, đường điện thoại v.v - Giao thức liên lạc (TCP/IP) : Gồm một số các qui luật và nguyên tắc mà các thiết bị trên mạng cĩ thể liên lạc và làm việc với nhau. Giao thức sử dụng các kết nối vật lý của mạng để truyền dữ liệu. Hệ thống CPhone sử dụng giao thức TCP/IP. - Hệ thống phần mềm : Phạm vị nghiên cứu của đồ án này thì chương trình được thiết kế cĩ cấu hình tối thiểu là chỉ 2 máy tính cùng chạy một chương trình kết nối với nhau qua mạng. Tín hiệu âm thanh từ Microphone qua soundcard được mã hố bằng phương pháp PCM,8kHz, 8bits/mẫu, được chia nhỏ thành từng đoạn cĩ độ dài nhất định(frame), các frame này được mã hố theo các thuật tốn, cuối cùng gửi gĩi dữ liệu đã mã hố đến socket của mạng và truyền gĩi này đến nơi nhận. Theo các mơ hình đưa ra ở trên và phạm vị nghiên cứu của đồ án này thì chương trình được thiết kế cĩ cấu hình tối thiểu là chỉ 2 máy tính cùng chạy một chương trình kết nối với nhau qua mạng. Tín hiệu âm thanh từ Microphone qua soundcard được mã hố bằng phương pháp PCM,8kHz, 8bits/mẫu, được chia nhỏ thành từng đoạn cĩ độ dài nhất định(frame), các frame này được mã hố theo các thuật tốn, cuối cùng gửi gĩi dữ liệu đã mã hố đến socket của mạng và truyền gĩi này đến nơi nhận. Cĩ thể chia thành 3 modul chính : Modul xử lý âm thanh Modul mã hố(giải mã) âm thanh Modul truyền nhận âm thanh. Mẫu tiếng nĩi Gĩi dữ liệu sau thu được khi mã hố Modul xử Modul mã Modul truyền lý âm thanh hố nhận (giải mã) Mẫu tiếng nĩi Gĩi dữ liệu đã giải mã nhận từ remote Hình V.2 Các modul của chương trình CPhone Khi chương trình này đưa vào thực tế sẽ gĩp phần vào giải quyết các cơng việc giữa các phịng ban trong cơ quan được nhanh chĩng và thuận tiện. Mục đích cuối cùng mà chương trình cĩ thể thực hiện được là cĩ thể trực tiếp nĩi truyện với nhau trong mạng LAN của cơ quan hay cơng ty nào đĩ Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 46 V.2.3 MODUL THU VÀ PHÁT ÂM THANH Modul xử lý âm thanh làm nhiệm vụ giao tiếp với soundcard, ghi vào bộ nhớ và truyền cho modul II để mã hố, đồng thời nhận các mẫu đã giải mã ở modul II để đưa ra soundcard trong quá trình nhận. Quá trình thu và phát tiếng nĩi thơng qua vùng đệm (buffer), cĩ 2 loại vùng đệm trong Direct sound : Primary buffer và Secondary buffer. Primary buffer chứa tiếng nĩi mà người nghe sẽ nghe thấy. Chỉ cĩ duy nhất một Primary buffer và buffer này do DirectSound tạo ra, secondary buffer chứa tiếng nĩi hoặc đoạn tiếng cần đưa ra. Chương trình cĩ thể tạo ra một hoặc nhiều Secondary buffer. Khi phát tiếng nĩi trong secondary buffer, DerectSound sẽ chuyển tiếng nĩi sang Primary buffer và đưa ra soundcard. Chương trình ứng dụng cĩ thể dùng DirectSoundCapture để ghi tiếng nĩi vào một Capturebuffer. Cũng như khi phát tiếng nĩi, chương trình cĩ thể báo con trỏ đến một vị trí nào đĩ và khi nĩ đến cuối của buffer thì nĩ tự động quay lại vị trí đầu của buffer. Khi thao tác với các buffer, DirectSound cho phép khĩ một phần của buffer lại để đảm bảo khơng bị ghi đè lên phần này. Modul thu và phát tiếng nĩi nằm trong cùng một Record thread. Thread cĩ mức ưu tiên cao nhất. Mỗi khi cĩ một dịng thơng báo từ DirectSound gửi đến tức là khi con trỏ Capture buffer đi đến vị trí quy định trước thì thread này sẽ được gọi đến. Lúc này, modul thu tiếng nĩi sẽ khố phần Capture buffer vừa ghi xong. Néu trong buffer của modul phát tiếng nĩi cĩ tín hiệu tiếng nĩi thì sẽ chép vào Secondary buffer của DirectSound. Lưu đồ của modul thu và phát tiếng nĩi như sau : Bắt đầu Khố buffer DirectSound Chép tín hiệu âm thanh vừa lấy mẫu vào Record buffer đúng Play buffer Chép play buffer vào cĩ dữ liệu Secondary buffer sai Mở khố buffer DirectSound Kích hoạt modul mã hố Kết thúc Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 47 Hình V.3 Lưu đồ của modul thu và phát tiếng nĩi V.2.4 MODUL MÃ HỐ VÀ GIẢI MÃ ÂM THANH Modul mã hố được kích hoạt sau khi modul VAD xác định tín hiệu âm thanh cĩ chức tiếng nĩi. Cơng việc của modul mã hố gọi đến các thủ tục mã hố tiếng nĩi(GSM,LPC ). Sau đĩ, chuyển dữ liệu đã mã hố vào Send buffer tồi kích hoạt modul truyền. Modul nhận nằm trong thread mã hố, cĩ mức ưu tiên bình thường. Sau đây là lưu đồ giải thuật modul mã hố : Bắt đầu sai Play buffer cĩ dữ liệu Kết thúc đúng Lấy một khung tiếng nĩi từ Record buffer Mã hố theo phương pháp PCM Chép khung tiếng nĩi đã mã hố vào Sendbuffer Kích hoạt modul truyền Hình V.4 Lưu đồ giải thuật modul mã hố Modul giải mã tiếng nĩi được kích hoạt sau khi modul nhận được dữ liệu từ máy ở xa. Loại bỏ Header, các dữ liệu thừa và đưa vào trong buffer nhận. Modul giải mã sẽ xá định phương pháp giải mã tương ứng với phương pháp mã hố được sử dụng ở bên truyền. Sau đĩ chuyển dữ liệu đã mã hố vào buffer phát tiếng nĩi. Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 48 Lưu đồ giải thuật modul giải mã như sau : Bắt đầu sai Buffer nhận Kết thúc cĩ dữ liệu đúng Lấy một khung tiếng nĩi từ buffer nhận Mã hố theo phương pháp PCM Chép khung tiếng nĩi vào buffer phát Hình V.5 Lưu đồ giải thuật modul mã hố V.2.5 MODUL TRUYỀN, NHẬN ÂM THANH Modul này cĩ nhiệm vụ giao tiếng giữa máy tính với mạng IP. Sử dụng giao thức TCP/IP. Khi buffer truyền cĩ dữ liệu cần truyền đi, modul truyền sẽ kích hoạt . dữ liệu cần truyền sẽ cĩ thêm các header và các thơng tin cần thiết khác. Modul truyền cĩ mức ưu tiên bình thường. Khi cĩ dữ liệu đến, winsock sẽ gửi thơng báo đến chương trình, chương trình nhận được thơng báo và kích hoạt modul nhận. Modul nàu cĩ nhiệm vụ nhận dữ liệu, kiểm tra, loại bỏ dữ liệu thừa cùng với header. Sau khi chuyển dữ liệu vào buffer nhận và kích hoạt modul giải mã. Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 49 Lưu đồ giải thuật của modul truyền và nhận : Bắt đầu sai Buffer truyền Kết thúc cĩ dữ liệu đúng Lấy một khung tiếng nĩi từ buffer truyền Truyền theo giao thức TCP Hình V. 6 Lưu đồ giải thuật modul truyền Bắt đầu sai Cĩ goi tin Kết thúc chưa nhận đúng Dùng giao thức TCP Lấy gĩi tin Kích hoạt modul giải mã Hình V.7 Lưu đồ giải thuật modul nhận V.3 THIẾT KẾ GIAO DIỆN CHƯƠNG TRÌNH CPHONE Chương trình thực hiện với điều kiện hai máy đàm thoại phải cùng chạy chương trình ứng dụng này. Giao diện chính của chương trình : Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 50 Hình V.8 Giao diện chương trình CPhone Khi muốn bắt đầu cuộc đàm thoại, người sử dụng vào menu kết nối và click vào nhập IP. Điều này sẽ gọi hàm tạo kết nối giữa hai máy PC, hàm này hiển thị cửa sổ yêu cầu người sử dụng nhập vào IP của máy cần kết nối. Sau khi đã nhập xong click connect, một thơng điệp yêu cầu kết nối sẽ gửi đến máy cần kết nối. Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 51 Hình V.9 Nhập địa chỉ IP Nếu khơng cĩ tín hiệu thì chưa cho phép quá trình đàm thoại. Khi cĩ tín hiệu phản hồi thì các hàm khởi động sound card, card mạng và socket được gọi và thực hiện cuốc đàm thoại. Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 52 Hình V.10 Cuộc đàm thoại đang được thực hiện IV.4 KẾT QUẢ THỰC NGHIỆM&NHẬN XÉT ĐÁNH GIÁ CHƯƠNG TRÌNH IV.4.1 KẾT QUẢ THỰC NGHIỆM Mơi trường thử nghiệm đồ án này là mạng LAN, sử dụng cơng nghệ Ethernet 10 Mbps. Hiện tại truyền dữ liệu giữa các máy tính trong mạng LAN cịn rất ít, phần lớn các tài nguyên về dải thơng của mạng cịn chưa sử dụng. Phần giải thơng cịn lại này là rất lớn để truyền tín hiệu tiếng nĩi, cũng vì lý do này nên độ trễ point – to – point trong mạng nhỏ và tương đối đồng đều (hầu hết < 10ms), giá trị này rất nhỏ so với mức chấp nhận được là 200ms. Vì chất lượng của cuộc đàm thoại trong trường hợp này hầu như chỉ phụ thuộc vào chất lượng của sound card. IV.4.2 ĐÁNH GIÁ KẾT QUẢ Qua thử nghiệm, em thấy chất lượng tiếng nĩi đầu ra khơng cĩ gì khác biệt so với chất lượng tiếng nĩi đầu vào, chất lượng âm thanh sau khi truyền là cĩ thể chấp nhận được. Như du sao đĩ chỉ là đánh giá qua cảm nhận của tai chúng ta mà thơi nên chưa thể khảng định được chất lượng tiếng nĩi sau khi truyền cĩ đạt tiêu chuẩn cho phép hay khơng. Nếu sử dụng các máy đo các thơng số liên quan đến chất lượng tiếng nĩi, phương pháp này đảm bảo đánh giá chính xác chất lượng tiếng nĩi trong điều kiện chấp nhận được. Nhưng luận văn này mới chỉ dừng lại ở mức độ đồ án tốt nghiệp và do điều kiện khơng cho phép nên chưa cĩ thể cĩ được các thiết bị đo các thơng số của tiếng nĩi. Vì vậy, chưa thể đánh giá chất lượng âm thanh một cách chính xác được. So với một số dịch vụ truyền âm thanh thoại hiện nay như : VoIP (dịch vụ 171) , Internet Telephony thì chất lượng âm thanh tốt hơn. Vì mơ hình Cphone chỉ ứng dụng trên mạng cục bộ nên tốc độ đường truyền rất cao, mặt khác khoảng cách rất ngắn. Tuy nhiên độ trễ cịn rất lớn song với mạng cục bộ thì vấn đề này vẫn cĩ thể chấp nhận được. Cịn đối với các dịch vụ 171 hay Internet Telephony hiện nay thì chất lượng âm thanh giai đoạn đầu nĩi chung khơng đạt được mong muốn đối với người sử dụng nhưng hiện tại chất lượng âm thanh đã được cải thiện đáng kể và đặc biệt các ứng dụng này ngày càng được đưa vào phục vụ cuộc sống. Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 53 KẾT LUẬN Đồ án tốt nghiệp đã hồn thành các nhiệm vụ đề ra trong phạm vi cho phép. Do điều kiện về thời gian cùng như trình độ cịn hạn chế nên đồ án này dừng lại ở mức nghiên cứu một số phương pháp mã hố tiếng nĩi và một số giao thức truyền tín hiệu trên mạng Internet như TCP/IP, UDP. Trên cơ sở đĩ xây dựng phần mềm thử nghiệm truyền tiếng nĩi thoại trên mạng LAN. Đồ án này của em sử dụng các hàm cĩ sẵn trong mơi trường SDK từ đĩ xây dựng ứng dụng CPhone cĩ thể liên kết hai máy lại và thực hiện quá trình trao đổi âm thanh. Phần thử nghiệm mới chỉ dừng lại ở việc xây dựng một ứng dụng truyền tiếng nĩi giữa 2 thực thể PC theo giao thức TCP/IP và tiếng nĩi mới chỉ được mã hố theo phương pháp PCM nên tỷ số nén và tốc độ truyền chưa cao. Mặt khác, do mới chỉ đánh giá được chất lượng tiếng nĩi theo phương pháp chủ quan nên chưa khảng định được điều gì về độ trễ và chất lượng tiếng nĩi sau khi truyền. Thế nhưng những gì đạt được trong đồ án này chủ yếu là nhằm giúp em cĩ thể nắm bắt được vững hơn về mặt lý thuyết cũng như nắm quyền kiểm sốt, quyền điều khiển ứng dụng trong thực tế, các kết quả này rất qua trọng và hữu ích cho mọi hoạt động nghiên cứu sau này cho dù những nội dung trong bài luận văn và phần thử nghiệm chưa được đầy đủ và hồn chỉnh như mong muốn. Hiện nay, mơ hình truyền tiếng nĩi trên mạng(VoIP) đang được nghiên cứu và phát triển mạng trên thế giới nĩi chung và nước ta nĩi riêng, nhưng đây vẫn là một vấn đề rất mới, đặc biệt hiện này đã ứng dụng được cho mạng Internet. Qua thử nghiệm cho thấy hướng nghiên cứu cĩ thể tiếp tục nâng cấp để đưa vào sử dụng, trước tiên với mơ hình nhỏ là dùng cho mạng cục bộ trong các phịng ban. Từ đĩ cĩ thể phát triển và đưa vào sử dụng trên diện rộng nhăm tăng chất lượng các cuộc đàm thoại, giảm giá thành cuộc gọi và để thương mại hố sản phẩm. Về lâu dài thì cĩ thể nghiên cứu, xây dựng các bộ giải mã cho ngơn ngữ tiếng việt; nghiên cứu ghép thêm các modul nhằm tạo các cuộc đàm thoại mật để đảm bảo an tồn cuộc gọi. Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 54 PHẦN PHỤ LỤC Các từ viết tắt, ký hiệu : AbS : Analysis by Synthesis ADPCM : Adaptive Differential Pulse Code Modulation ATC : Adaptive Transform Coding PABX : Private Automatic Branch eXchange PCM : Pulse Code Modulation GMS : Global System for Mobile telecommucations ETSI : European Telecommunication Standards Institude GSM : Global System for Mobile telecommunication protocol MCI : Media Control Interface TCP : Transmission Control Protocol UDP : User Datagram Protocol IP : Internet protocol RIFF : Resource Interchange File Format IMA : Interactive Multimedia Association ICMP : Internet Control Message Protocol LPC : Linear Prediction Coding OSI : Open System Interconnection Chương trình nguồn : Đoạn chương trình thực hiên chức năng đợi (chạy nền) UINT Server(LPVOID param) { const PORT=1967; const NO_FLAGS_SET=0; const MAXBUFLEN=500; WSADATA Data; SOCKADDR_IN SvrAddr,CIntAddr; SOCKET SvrSock,CIntSock; int AddrLen=sizeof(SOCKADDR_IN); int status,nbyte,nbsend; char bufferrecv[MAXBUFLEN],buffersend[80]; //Khởi tạo Windows Socket DLL status=WSAStartup(MAKEWORD(1,1),&Data); if(status!=0) { MessageBox(NULL,"ERROR: WSAStartup unsuccessful.", "WSAStartup error!",MB_ICONEXCLAMATION); return(-1); } memset(&SvrAddr,0,sizeof(SvrAddr)); SvrAddr.sin_port=htons(PORT); SvrAddr.sin_family=AF_INET; SvrAddr.sin_addr.s_addr=htonl(INADDR_ANY); SvrSock=socket(AF_INET,SOCK_STREAM,0); if(SvrSock==INVALID_SOCKET) { MessageBox(NULL,"ERROR: Socket unsuccessful.","Socket error !", Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 55 MB_ICONEXCLAMATION); WSACleanup(); return(-1); } //Kết buộc socket với PORT bind(SvrSock,(LPSOCKADDR)&SvrAddr,sizeof(SvrAddr)); //Chờ client nối vào listen(SvrSock,1); //Xác nhận mối nối khi cĩ client nối vào CIntSock=accept(SvrSock,(LPSOCKADDR)&CIntAddr,&AddrLen); if(CIntSock==INVALID_SOCKET) { MessageBox(NULL,"ERROR: Connect unsuccessful.","Connect error !", MB_ICONEXCLAMATION); closesocket(CIntSock); WSACleanup(); return(-1); } else { nbyte=recv(CIntSock,bufferrecv,MAXBUFLEN,NO_FLAGS_SET); if((nbyte==0)||(nbyte==SOCKET_ERROR)) { MessageBox(NULL,"Please the end conversation !","The conversation !",MB_ICONEXCLAMATION); closesocket(CIntSock); WSACleanup(); return(-1); } else MessageBox(NULL,bufferrecv,"The coversation !",MB_ICONINFORMATION); strcpy(buffersend,"Receivered the signal. Please begin the conversation."); nbsend=send(CIntSock,buffersend,strlen(buffersend)+1,NO_FLAGS_SET); if(nbsend!=(int)strlen(buffersend)+1) { closesocket(CIntSock); WSACleanup(); return(0); } return(0); } } Đoạn mã thực hiện kết nối hai máy : // Tạm dừng trạng thái chờ SuspendThread(Server); // Chuyển sang trạng thái gọi m_DestAddrStr=dialog.m_DestAddrStr; if(m_DestAddrStr=="") { MessageBox("ERROR: Hostname is unknown !","Error hostname !", MB_ICONEXCLAMATION); return(-1); } const PORT=1967; Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 56 const NO_FLAGS_SET=0; const MAXBUFLEN=256; WSADATA Data; SOCKADDR_IN SockAddr; unsigned long DestAddr; int status,nbyte,nbrecv; char SendBuf[50],RecvBuf[MAXBUFLEN]; // Khởi tạo Windows Socket DLL status=WSAStartup(MAKEWORD(1,1),&Data); if(status!=0) { MessageBox("ERROR :WSAStartup unsuccessf", "Error WSAStarup !",MB_ICONEXCLAMATION); return(-1); } // Nhận địa chỉ internet, chuyển sang dạng 4 byte DestAddr=inet_addr(m_DestAddrStr); //Khởi tạo cấu trúc SOCKADDR_IN SockAddr.sin_addr=*(struct in_addr*)&DestAddr; SockAddr.sin_port=htons(PORT); SockAddr.sin_family=AF_INET; // Tạo một socket hSock=socket(AF_INET,SOCK_STREAM,0); if(hSock==INVALID_SOCKET) { MessageBox("ERROR: Socket unsuccessful.","Error Socket", MB_ICONEXCLAMATION); WSACleanup(); return(-1); } // Nối vào máy chạy ứng dụng server status=connect(hSock,(LPSOCKADDR)&SockAddr,sizeof(SockAddr)); if(status==SOCKET_ERROR) { MessageBox("ERROR: Connect unsuccessful !","Error connect !", MB_ICONEXCLAMATION); closesocket(hSock); WSACleanup(); return(-1); } else { strcpy(SendBuf,"There is the signal send to your computer !"); nbyte=send(hSock,SendBuf,strlen(SendBuf)+1,NO_FLAGS_SET); nbrecv=recv(hSock,RecvBuf,MAXBUFLEN,NO_FLAGS_SET); if((nbrecv==0)||(nbrecv==SOCKET_ERROR)) { MessageBox("Please end the conversation !", "The conversation",MB_ICONEXCLAMATION); closesocket(hSock); WSACleanup(); return(-1); } else MessageBox(RecvBuf,"The conversation",MB_ICONINFORMATION); } Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ
- LUẬN VĂN TỐT NGHIỆP Trang 57 // Kết thúc trạng thái gọi // Khơi phục lại trạng thái chờ ResumeThread(Server); return(1); } Đoạn chương trình thực hiện chức năng ghi âm thanh từ micro void CWAveIn::recordWaveData() { HWAVEIN hWaveIn; HWND hwndApp=NULL; HGLOBAL hWaveHdr; LPWAVEHDR lpWaveHdr; HMMIO hmmio=NULL; UINT wResult; HANDLE hFormat=NULL; WAVEFORMAT pFormat; DWORD dwDataSize=1000; // Mở thiết bị wave để phát. if (!waveInOpen((LPHWAVEIN)&hWaveIn, WAVE_MAPPER, (LPWAVEFORMATEX)&pFormat, (LONG)waveInProc, DWORD(this), CALLBACK_FUNCTION)) { MessageBox( "Failed to open waveform input device.", NULL,MB_OK | MB_ICONEXCLAMATION); LocalUnlock(hFormat); LocalFree(hFormat); mmioClose(hmmio, 0); return; } // Allocate and lock memory for the waveform data. hData = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, dwDataSize ); if (!hData) { MessageBox( "Out of memory.", NULL, MB_OK | MB_ICONEXCLAMATION); mmioClose(hmmio, 0); return; } if ((lpData =(HPSTR)GlobalLock(hData)) == NULL) { MessageBox( "Failed to lock memory for data chunk.", NULL, MB_OK | MB_ICONEXCLAMATION); GlobalFree(hData); mmioClose(hmmio, 0); return; } // Allocate and lock memory for the header. hWaveHdr = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, (DWORD) sizeof(WAVEHDR)); if (hWaveHdr == NULL) { GlobalUnlock(hData); GlobalFree(hData); Đề tài : Xây dựng ứng dụng truyền thông âm thanh trên mạng cục bộ