sound music j2me

21
ĐẠI HC QUC GIA TP. HCH˝ MINH TRƯỜNG ĐẠI HC KHOA HC TNHI˚N KHOA CNG NGHTHNG TIN TRN ANH DŨNG - 02HC022 PHAN TRUNG HIU 02HC055 NGHI˚N CU CNG NGHJ2ME X´Y DNG THƯ VIN V CNG CPHN MM HTRPH`T TRIN GAME TR˚N ĐIN THOI DI ĐỘNG LUN VĂN CNH´N TIN HC GI`O VI˚N HƯỚNG DN GV. Th.S TRN MINH TRIT GV. VĂN CH˝ NAM NI˚N KHA 2002 2005

Upload: sa-qa

Post on 26-Jun-2015

1.116 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Sound Music J2ME

ĐẠI HỌC QUỐC GIA TP. HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

KHOA CÔNG NGHỆ THÔNG TIN

TRẦN ANH DŨNG - 02HC022

PHAN TRUNG HIẾU � 02HC055

NGHIÊN CỨU CÔNG NGHỆ J2ME

XÂY DỰNG THƯ VIỆN VÀ CÔNG CỤ PHẦN MỀM

HỖ TRỢ PHÁT TRIỂN GAME

TRÊN ĐIỆN THOẠI DI ĐỘNG

LUẬN VĂN CỬ NHÂN TIN HỌC

GIÁO VIÊN HƯỚNG DẪN

GV. Th.S TRẦN MINH TRIẾT � GV. VĂN CHÍ NAM

NIÊN KHÓA 2002 � 2005

Page 2: Sound Music J2ME

Chương 4Xử lý âm thanh

Trần Anh Dũng � 02HC022 43 Phan Trung Hiếu � 02HC055

Chương 4 Xử lý âm thanh Việc xử lý âm thanh trên điện thoại di động trong J2ME được hỗ trợ bởi thư

viện lập trình đa phương tiện trên nền tảng MIDP � Mobile Media API (MMAPI)

và các thư viện lập trình được cung cấp bởi các nhà sản xuất cho từng dòng điện

thoại. Các điện thoại sử dụng MIDP 2.0 đã được hỗ trợ thư viện lập trình đa phương

tiện MMAPI như một chuẩn chung cho các dòng điện thoại. Tuy nhiên các điện

thoại sử dụng MIDP 1.0 muốn xử lý âm thanh phải dựa trên các thư viện lập trình

âm thanh do nhà sản xuất cung cấp. Để tìm hiểu cách thức xử lý âm thanh trên điện

thoại di động ta lần lượt tìm hiểu các thư viện lập trình hỗ trợ xử lý âm thanh.

4.1 Thư viện lập trình đa phương tiện trong J2ME

Thư viện lập trình đa phương tiện � Mobile Media API (MMAPI) là một gói

thư viện tùy chọn hỗ trợ các khả năng đa phương tiện như âm thanh hay video cho

ứng dụng trên thiết bị di động dựa trên nền tảng MIDP.

4.1.1 Tổng quan về MMAPI

Thư viện MMAPI là một phiên bản rút gọn của Java Media Framework

(JMF), một gói trong J2SE, được thiết kế để có thể chạy trên bất kỳ máy ảo nào dựa

trên J2ME, bao gồm các máy ảo hỗ trợ CLDC (thường trên các điện thoại di động)

hay CDC (trên các máy trợ giúp số cá nhân PDA hay smartphone). MMAPI có các

phiên bản và thư viện bổ sung sau:

• MMAPI 1.0 (JSR 135): một gói thư viện tùy chọn cho nền tảng J2ME, thư

viện này cung cấp một giao diện lập trình ứng dụng (API) chuẩn để phát lại

và thu các định dạng đa phương tiện như nhạc hoặc video. Đây là thư viện

chuẩn với số đặc tả là JSR 135, được thiết kế với khả năng mềm dẻo để có

thể mở rộng và không phụ thuộc vào thiết bị cũng như nền tảng. MMAPI

không phụ thuộc vào bất kỳ định dạng lưu trữ, giao thức truyền dữ liệu hoặc

những khả năng của các thiết bị phần cứng.

Page 3: Sound Music J2ME

Chương 4Xử lý âm thanh

Trần Anh Dũng � 02HC022 44 Phan Trung Hiếu � 02HC055

• MMAPI 1.1: phiên bản chỉnh sửa của MMAPI 1.0 với những thay đổi cho

tính năng phù hợp với tính bảo mật có trong MIDP 2.0. Bản đặc tả này

không thay đổi bất kỳ lớp hoặc phương thức nào so với MMAPI 1.0. Một số

phương thức trong MMAPI có thể phát sinh ngoại lệ SecurityException nếu

như chương trình chạy không theo quyền thích hợp. Một trong số các yêu

cầu về bảo mật bao gồm tính năng ghi lại (recording) và truy cập mạng.

Những yêu cầu này nhằm đảm bảo quyền riêng tư của người dùng.

• MIDP 2.0 Media API (JSR 118): thư viện này là một tập con của MMAPI để

có thể chạy được trên các thiết bị cấp thấp có hỗ trợ MIDP 2.0. Vì vậy, nó có

một số yêu cầu như khả năng phát lại nhạc sử dụng rất ít tài nguyên hệ thống,

hỗ trợ việc phát lại các tông nhạc đơn giản, điều chỉnh âm lượng� Do

những yêu cầu trên nên thư viện đa phương tiện trong MIDP 2.0 thiếu một số

tính năng của MMAPI như: không hỗ trợ video, không hỗ trợ đồng bộ hóa

việc phát lại nhiều tập tin âm thanh cùng lúc.

• Thư viện bổ sung đa phương tiện (JSR 234): hỗ trợ bổ sung những khả năng

mới nhất của phần cứng như khả năng chụp ảnh số và nghe đài radio. Một số

tính năng mới của nó bao gồm khả năng điều khiển độ sáng, độ tương phản,

đèn flash, chế độ sáng, phóng to hoặc thu nhỏ lại của máy chụp hình trong

điện thoại. Ngoài ra còn có những tính năng xử lý âm thanh nâng cao như tạo

các hiệu ứng âm thanh hay khả năng thay đổi cổng xuất chẳng hạn như ra loa

hoặc ra tai nghe.

Các đặc tính của MMAPI:

• Hỗ trợ phát lại (playback) và ghi lại (recording) các tập tin đa phương tiện,

hỗ trợ định dạng âm thanh hay hình ảnh bất kỳ.

• Sử dụng ít tài nguyên của hệ thống, chạy được với những cấu hình rất thấp

của các thiết bị dựa trên CLDC như điện thoại di động.

• Không phân biệt giao thức cũng như định dạng.

Page 4: Sound Music J2ME

Chương 4Xử lý âm thanh

Trần Anh Dũng � 02HC022 45 Phan Trung Hiếu � 02HC055

• Khả năng lựa chọn: chỉ sử dụng một số tính năng. Chẳng hạn khi lập trình

chỉ cần hỗ trợ các tính năng âm thanh cơ bản hay hỗ trợ một vài định dạng

nào đó thì ta có thể giới hạn các tính năng khác vì không cần dùng đến.

• Khả năng mở rộng: những tính năng mới có thể được thêm vào mà không

làm ảnh hưởng đến các tính năng trước đó. Hiện nay MMAPI chưa hỗ trợ

khả năng định dạng tập tin và các lớp điều khiển cho từng định dạng, các tính

năng này có thể được bổ sung trong tương lai.

• Khả năng tùy chọn cho các nhà sản xuất thiết bị: mặc dù thư viện này cung

cấp các tính năng cho nhiều mục đích khác nhau nhưng nó phải cho phép các

nhà sản xuất bỏ qua một số tính năng nếu như thiết bị của họ không hỗ trợ.

4.1.2 Xử lý tập tin đa phương tiện trong MIDP 2.0 với MMAPI

Tập hợp các hàm hỗ trợ âm thanh của MMAPI được tích hợp trong MIDP

2.0 được gọi là Audio Building Block (ABB), cung cấp khả năng phát các tông

nhạc và các đoạn âm thanh. ABB được thi hành trong các gói

javax.microedition.media và javax.microedition.media.control.

Có rất nhiều loại dữ liệu âm thanh. Dữ liệu này được định dạng thành những

tập tin khác nhau tùy thuộc vào cách các bit dữ liệu tham gia vào quá trình biểu diễn

âm thanh. Các loại âm thanh thông thường là MP3, AIFF, và WAV. Trong ABB

của MIDP 2.0, các loại âm thanh được xác định dựa trên kiểu định danh đa phương

tiện của MIME (Multipurpose Internet Mail Extension) bằng cách dùng một chuỗi

để xác định phần chính và phần mở rộng của loại âm thanh đó. Ví dụ như kiểu định

danh của MIME cho loại âm thanh WAV là �audio/x-wav�.

Kiểu định dạng của từng loại âm thanh chỉ xác định được cách chuyển các

bit dữ liệu thành âm thanh. Để có thể biểu diễn âm thanh trên điện thoại di động

chúng ta còn phải xác định giao thức chuyển dữ liệu âm thanh từ máy chủ lên thiết

bị MIDP để dữ liệu âm thanh được chuyển đổi sang âm thanh.

Như vậy, việc xử lý tập tin đa phương tiện bao gồm hai thành phần:

Page 5: Sound Music J2ME

Chương 4Xử lý âm thanh

Trần Anh Dũng � 02HC022 46 Phan Trung Hiếu � 02HC055

• Xử lý giao thức truyền: đọc dữ liệu từ một nguồn như tập tin hay máy chủ để

chuyển đến bộ phận xử lý nội dung.

• Xử lý nội dung: giải mã dữ liệu và xuất ra một thiết bị như loa hay màn hình

video.

Để dễ dàng lập trình hai bộ phận xử lý trên, MMAPI cung cấp hai đối tượng

cấp cao sau:

• DataSource: trừu tượng hóa phần xử lý giao thức bằng cách ẩn đi cách đọc

dữ liệu từ nguồn.

• Player: đọc dữ liệu từ DataSource, xử lý và xuất ra thiết bị xuất. Lớp đối

tượng này cung cấp các phương thức để điều khiển việc phát lại các tập tin

âm thanh.

Ngoài ra, MMAPI còn cung cấp một đối tượng thứ ba là Manager cho phép

các lập trình viên tạo ra các đối tượng Player từ các đối tượng DataSource hoặc

InputStream. Qui trình của việc biểu diễn âm thanh được mô tả trong hình sau:

Hình 4-1 Qui trình biểu diễn âm thanh Đối tượng Manager cung cấp kiểu nội dung âm thanh và giao thức cho đối

tượng Player thông qua phương thức createPlayer( ). Có thể có một hoặc vài điều

khiển được kết hợp với một đối tượng Player để xác định tham số cho việc phát âm

thanh, như là volume, số lần lặp� Trong ABB, gói

javax.microedition.media.Control là một giao tiếp biểu diễn điều khiển còn gói

javax.microedition.media.control chứa các thành phần của giao tiếp điều khiển. Mối

quan hệ giữa các đối tượng tham gia vào quá trình biểu diễn âm thanh được mô tả

như sau:

Page 6: Sound Music J2ME

Chương 4Xử lý âm thanh

Trần Anh Dũng � 02HC022 47 Phan Trung Hiếu � 02HC055

Hình 4-2 Mối quan hệ giữa các đối tượng 4.1.3 Các thành phần của MMAPI

• javax.mecroedition.media cung cấp một số giao tiếp, một lớp ngoại lệ

MediaException và đặc biệt là lớp Manager, đây chính là nơi bắt đầu để nhận

về các đối tượng Player.

• javax.mecroedition.media.control định nghĩa những điều khiển cụ thể được

sử dụng với đối tượng Player như VolumeControl, VideoControl,�

• javax.mecroedition.media.protocol cung cấp các giao thức cho việc định

nghĩa các điều khiển tùy biến, ví dụ như lớp DataSource là một lớp trừu

tượng để xử lý nội dung các tài nguyên.

Các lớp trong MMAPI được mô tả trong bảng sau:

Gói Lớp Mô tả javax.microedition.media

Manager Điểm bắt đầu nhận đối tượng Player để xử lý các tập tin đa phương tiện.

javax.microedition.media.protocol

ContentDescriptor Mô tả kiểu nội dung của dữ liệu.

javax.microedition.media.protocol

DataSource Biểu diễn một cách trừu tượng khả năng xử lý các giao thức bằng cách che đi chi tiết cách nhận dữ liệu từ tập tin hay máy chủ. Đối tượng Player sử dụng những phương thức của lớp này để lấy dữ liệu.

Bảng 4-1 Các lớp trong MMAPI

Page 7: Sound Music J2ME

Chương 4Xử lý âm thanh

Trần Anh Dũng � 02HC022 48 Phan Trung Hiếu � 02HC055

Các giao tiếp trong MMAPI được mô tả chi tiết trong bảng sau:

Gói Giao tiếp Mô tả javax.microedition.media

Control Điều khiển một số chức năng liên quan đến xử lý đa phương tiện. Đối tượng Control nhận được từ giao tiếp Controllable, đối tượng Player mở rộng Controllable nên có thể cung cấp các điều khiển, ví dụ như VolumeControl để điều khiển tăng giảm âm thanh.

javax.microedition.media

Controllable Cung cấp một giao tiếp để nhận về đối tượng Control từ một đối tượng Player hoặc từ các đối tượng khác.

javax.microedition.media

Player Dùng để phát lại các tập tin đa phương tiện. Đối tượng này cung cấp những phương thức để quản lý vòng đời của Player.

javax.microedition.media

PlayerListener Dùng để nhận được các đối tượng phát sinh từ đối tượng Player.

javax.microedition.media

TimeBase Một nguồn liên tục các nhịp thời gian, dùng để đo thời gian cho việc đồng bộ hóa việc phát lại nhiều Player cùng một lúc.

javax.microedition.media.control

FramePositionControl Điều khiển vị trí chính xác của các khung hình video.

javax.microedition.media.control

GUIControl Nếu các điều khiển hỗ trợ giao tiếp đồ họa thì cần cung cấp phần hiện thực cho giao tiếp này.

javax.microedition.media.control

MetaDataControl Dùng để nhận các thông tin về tập tin đa phương tiện.

javax.microedition.media.control

MIDIControl Điều khiển các thiết bị MIDI.

javax.microedition.media.control

PitchControl Điều khiển độ cao thấp tương đối của âm thanh mà không ảnh hưởng đến tốc độ phát lại.

javax.microedition.media.control

RateControl Điều khiển tốc độ phát lại của Player.

javax.microedition. RecordControl Điều khiển việc ghi âm thanh.

Page 8: Sound Music J2ME

Chương 4Xử lý âm thanh

Trần Anh Dũng � 02HC022 49 Phan Trung Hiếu � 02HC055

media.control javax.microedition.media.control

StopTimeControl Xác định điểm dừng khi phát lại.

javax.microedition.media.control

TempoControl Điều khiển nhịp độ khi phát lại.

javax.microedition.media.control

ToneControl Cho phép phát lại một chuỗi tông nhạc do người dùng định nghĩa.

javax.microedition.media.control

VideoControl Điều khiển việc hiển thị video, ví dụ như vị trí tương đối so với Canvas.

javax.microedition.media.control

VolumeControl Điều khiển âm lượng.

javax.microedition.media.protocol

SourceStream Được dùng chung với đối tượng DataSource để cung cấp giao tiếp cho việc nhận dữ liệu từ Player.

Bảng 4-2 Các giao tiếp của MMAPI

4.1.4 Các giao thức và các kiểu âm thanh được hỗ trợ trong MIDP 2.0

MIDP 2.0 rất phức tạp trong việc xác định các giao thức và kiểu nội dung để

thực thi. Vì vậy, đối tượng Manager cung cấp hai phương thức để xác định kiểu nội

dung âm thanh và giao thức chuyển dữ liệu âm thanh lên MIDP như sau:

public static String getSupportedContentTypes(String protocol)

public static String getSupportedProtocols(String content_type)

Chúng ta có thể tìm ra kiểu nội dung âm thanh dựa trên một giao thức và

ngược lại. Nếu ta cung cấp giá trị null cho cả hai phương thức trên ta sẽ nhận được

một danh sách kiểu nội dung âm thanh hay một danh sách các giao thức. Các giao

thức và kiểu nội dung âm thanh được mô tả trong bảng sau:

Giao thức Giải thích device Giao thức lấy dữ liệu từ thiết bị. http Giao thức truyền tập tin. Đây là giao thức mạng chuẩn, khi ta xác

định một tập tin đa phương tiện với giao thức HTTP thì toàn bộ tập tin này sẽ được download về trước khi phát ra âm thanh.

resource Giao thức lấy dữ liệu từ tài nguyên hệ thống. file Giao thức lấy dữ liệu từ tập tin.

Bảng 4-3 Các giao thức truyền dữ liệu

Page 9: Sound Music J2ME

Chương 4Xử lý âm thanh

Trần Anh Dũng � 02HC022 50 Phan Trung Hiếu � 02HC055

Các kiểu nội dung âm thanh:

Kiểu nội dung Giải thích audio/midi Tập tin nhạc theo định dạng MIDI audio/x-smaf Tập tin nhạc theo định dạng SMAF, là tập tin có phần mở

rộng .mmf của dòng điện thoại Samsung. audio/x-wav Tập tin nhạc theo định dạng WAVE. audio/x-tone-seq Chuỗi tông nhạc. audio/mpeg Tập tin nhạc theo định dạng MP3. audio/3gp Tập tin video theo định dạng 3GP

Bảng 4-4 Các kiểu nội dung âm thanh

Để xác định kiểu nội dung âm thanh của một đối tượng Player đang tồn tại ta

dùng phương thức getContentType( ).

4.1.5 Vòng đời của Player

Do việc biểu diễn âm thanh sử dụng ít tài nguyên trên thiết bị MIDP và các

tập tin âm thanh có dung lượng tương đối lớn nên đối tượng Player phải có một

vòng đời cho phép các hành vi của nó được điều khiển chính xác. Vòng đời này

được mô tả bằng các trạng thái là các giá trị hằng xác định trong đối tượng Player.

Có năm trạng thái là: UNREALIZED, REALIZED, PREFETCHED, STARTED, và

CLOSED. Sáu phương thức sau được dùng để thay đổi trạng thái của đối tượng

Player: realize( ), prefetch( ), start( ), stop( ), deallocate( ), close( ).

Khi một đối tượng Player được tạo ra thì đầu tiên nó sẽ ở trạng thái

UNREALIZED. Ở trạng thái này Player chưa dò tìm dữ liệu âm thanh và chưa yêu

cầu về tài nguyên phần cứng. Khi gọi phương thức realize( ) thì đối tượng Player sẽ

định vị dữ liệu âm thanh và chuyển sang trạng thái REALIZED, khởi động những

thông tin cần thiết để có thể nhận về nội dung tập tin. Gọi prefetch( ) sẽ chuyển sang

trạng thái PREFETCHED, ở trạng thái này Player sẽ tạo kết nối đến dữ liệu và thực

thi những tác vụ khởi động khác như điều khiển thiết bị phần cứng, chuẩn bị và sử

dụng bộ đệm. Khi gọi start( ), thì Player bắt đầu xử lý dữ liệu và trạng thái được

chuyển thành STARTED. Khi toàn bộ nội dung đã được phát lại xong thì đối tượng

Player sẽ được chuyển về trạng thái PREFETCHED. Gọi phương thức close( ) sẽ

Page 10: Sound Music J2ME

Chương 4Xử lý âm thanh

Trần Anh Dũng � 02HC022 51 Phan Trung Hiếu � 02HC055

chuyển sang trạng thái CLOSED, xác nhận Player đã giải phóng tất cả tài nguyên,

ngắt kết nối và không được sử dụng lại.

Các phương thức realize( ), prefetch( ) và start( ) được thực thi tuần tự, nếu

ta bỏ qua một phương thức nào thì các trạng thái sẽ ngầm định và các phương thức

bỏ qua vẫn được thực thi. Nếu có lỗi xảy ra trong quá trình tìm dữ liệu nguồn hay

truy cập tài nguyên hệ thống thì các phương thức trên sẽ thông báo ngoại lệ

MediaException.

Có nhiều phương thức cho phép quay về trạng thái trước đó. Phương thức

stop( ) sẽ chuyển Player từ trạng thái STARTED về trạng thái PREFETCHED.

Phương thức deallocate( ) chuyển Player từ trạng thái PREFETCHED hoặc trạng

thái STARTED về trạng thái REALIZED bằng cách giải phóng toàn bộ tài nguyên.

Phương thức deallocate( ) cũng có thể chuyển Player từ trạng thái bị mắc kẹt giữa

UNREALIZED và REALIZED khi chưa nhận được dữ liệu về trạng thái

UNREALIZED.

Cuối cùng, phương thức close( ) chuyển Player từ bất kỳ trạng thái nào về

trạng thái CLOSED. Tất cả tài nguyên được giải phóng, ngắt mọi kết nối và chấm

dứt vòng đời của Player. Sơ đồ sau đây mô tả vòng đời của đối tượng Player:

Hình 4-3 Vòng đời của Player

Page 11: Sound Music J2ME

Chương 4Xử lý âm thanh

Trần Anh Dũng � 02HC022 52 Phan Trung Hiếu � 02HC055

4.1.6 Điều khiển Player

Định thời của một Player là vị trí của đoạn âm thanh đang được phát. Ví dụ,

khi Player đang phát một đoạn âm thanh có thời lượng 4s được một nửa thì định

thời mang giá trị 2s. Nếu ta muốn chuyển đến vị trí bất kỳ trong đoạn âm thanh

đang phát ta có thể dùng hàm setMediaTime( ). Ta có thể xác định vị trí hiện hành

của đoạn âm thanh đang phát bằng hàm getMediaTime( ). Tổng thời gian của đoạn

âm thanh ta có thể lấy được bằng hàm getDuration(). Tuy nhiên có một số định

dạng âm thanh ta không thể xác định được tổng thời gian biểu diễn nó, khi đó hàm

getDuration( ) trả về giá trị TIME_UNKNOWN.

Player cũng có thể được lặp lại, nghĩa là một đoạn âm thanh có thể được

Player phát lại nhiều lần. Chúng ta có thể điều khiển đặc tính này bằng hàm

setLoopCount( ) trước khi Player bắt đầu. Nếu đặt giá trị cho hàm này là -1 thì sẽ

lặp vô hạn định. Một đối tượng Player cung cấp những điều khiển (controls) cho

kiểu dữ liệu nó đang xử lý. Chúng ta có thể liệt kê một danh sách các controls cho

một Player bằng hàm getControls( ), đây là một phương thức mà Player kế thừa từ

giao diện Controllable. Phương thức này trả về một mảng các controls thích hợp với

Player. ABB chỉ định nghĩa một VolumeControl và một ToneControl nhưng khi

thực thi thì không cần cung cấp thêm control nào khác phù hợp với kiểu nội dung

âm thanh và các giao thức được hỗ trợ. Để nhận được chỉ một control, ta sử dụng

phương thức getControl( ) (cũng kế thừa từ Controllable). Tên của control là tên

của một giao tiếp trong gói javax.microedition.media.control. Để có thể trả về

control thì Player ít nhất phải ở trạng thái REALIZED. Ví dụ khi ta đang phát lại

một tập tin theo định dạng MIDI và gọi phương thức getControl( ) thì ta sẽ nhận về

một đối tượng điều khiển là MIDIControl. Để sử dụng VolumeControl định volume

ở giá trị trung bình ta có thể làm như sau:

// Player player = Manager.createPlayer(...); player.prefetch(); VolumeControl vc = (VolumeControl)player.getControl("VolumeControl");

vc.setLevel(50);

Page 12: Sound Music J2ME

Chương 4Xử lý âm thanh

Trần Anh Dũng � 02HC022 53 Phan Trung Hiếu � 02HC055

4.1.7 Bắt sự kiện cho Player

Player cung cấp các phương thức thêm và gở bỏ các listener thông báo các sự

kiện quan trọng trong vòng đời của Player.

public void addPlayerListener(PlayerListener playerListener)

public void removePlayerListener(PlayerListener playerListener)

Tham số playerListener là sự kiện phát sinh từ Player. Các sự kiện có thể

được mô tả bằng chuỗi, sự kiện, thông tin. Các hằng số trong giao diện

PlayerListener mô tả các sự kiện thông thường như: STARTED, END_OF_MEDIA

và VOLUME_CHANGED.

4.1.8 Phát tông nhạc và chuỗi tông nhạc

Để phát một nốt nhạc ta sử dụng phương thức playTone( ) trong gói

javax.microedition.media.Manager:

public static void playTone(int note, int duration, int volume)

Trong phương thức trên, note giống như một nốt nhạc MIDI mà mỗi chỉ số

tương ứng với một phím trên bàn phím piano, với giá trị 60 là nốt đô trung và 69 là

nốt la âm lượng 440Mhz trên nốt đô trung . Duration được tính bằng đơn vị micro

giây, và volume có giá trị từ 0 đến 100.

Việc phát một chuỗi tông nhạc sẽ phức tạp hơn nhiều trong API media của

MIDP 2.0. Nó được thực thi với Player cùng kiến trúc của Control. Để nhận được

Player phát chuỗi các nốt nhạc, chúng ta phải truyền một giá trị đặc biệt

(TONE_DEVICE_LOCATOR của Manager) để tạo Player. Ở đây giá trị của

TONE_DEVICE_LOCATOR là �device://tone�, nghĩa là sử dụng giao thức

�device� và kiểu nội dung âm thanh là �audio/x-tone-seq�.

Khi đã tạo Player để phát chuỗi tông nhạc, ta truyền cho Player này một

chuỗi các nốt sử dụng đối tượng ToneControl tương ứng của nó. Để xác định

control này ta dùng hàm getControl(�ToneControl�) và đảm bảo Player phải ít nhất

ở trạng thái REALIZED.

Page 13: Sound Music J2ME

Chương 4Xử lý âm thanh

Trần Anh Dũng � 02HC022 54 Phan Trung Hiếu � 02HC055

Tất cả các nốt đều được định nghĩa với chỉ số nốt và thời lượng. Chỉ số nốt

cũng giống như trong phương thức playTone( ) của Manager với giá trị 60 là nốt đô

trung và 69 là nốt la âm lượng 440Mhz trên nốt đo trung. Duration được xác định

bằng bội số của resolution, theo mặc định thì resolution của một chuỗi tông nhạc là

1/64 của nhịp 4/4. Vì vậy duration là 64 tương ứng với một nốt nhạc nhịp 4/4.

Toàn bộ chuỗi tông nhạc phải bắt đầu với một phiên bản. Đây không phải là

phiên bản của dữ liệu âm thanh mà là phiên bản của dạng chuỗi tông nhạc mà ta

đang sử dụng. Hiện tại chỉ có một phiên bản được chấp nhận là phiên bản 1. Một

chuỗi tông nhạc đơn giản được mô tả như sau:

byte[] sequence = new byte[] {

ToneControl.VERSION, 1,

67, 16, // The

69, 16, // hills

67, 8, // are

65, 8, // a -

64, 48, // live

62, 8, // with

60, 8, // the

59, 16, // sound

57, 16, // of

59, 32, // mu -

59, 32 // sic

};

Chuỗi tông nhạc trên dựa trên nhiều giá trị mặc định, nhịp độ (tempo) mặc

định là 120 nhịp trên phút và resolution mặc định là 1/64. Âm lượng (volume) mặc

định là 100 (lớn nhất). Sau đây là một số các đặc tính khác trong chuỗi tông nhạc:

• Sử dụng ToneControl.TEMPO để định nhịp độ.

• Sử dụng ToneControl.RESOLUTION để định resolution.

• Các block âm có thể tái sự dụng nên được định nghĩa. Để bắt đầu định nghĩa

block sử dụng ToneControl.BLOCK_START với một chỉ số block. Để kết

thúc định nghĩa block sử dụng ToneControl.BLOCK_END với chỉ số block

tương ứng. Để phát một block âm ta dùng ToneControl.PLAY_BLOCK với

Page 14: Sound Music J2ME

Chương 4Xử lý âm thanh

Trần Anh Dũng � 02HC022 55 Phan Trung Hiếu � 02HC055

chỉ số block tương ứng. Block phải được định nghĩa sau VERSION, TEMPO

và RESOLUTION.

• Volume được điều khiển bất cứ lúc nào trong suốt thời gian phát âm thanh

bằng cách sử dụng ToneControl.SET_VOLUME.

• Để diễn tả dấu lặng ta dùng ToneControl.SILENCE.

• Ta có thể phát lại một âm nhiều lần sử dụng ToneControl.REPEAT.

4.2 Các API hỗ trợ xử lý âm thanh được cung cấp bởi các nhà sản xuất

Khi phiên bản MIDP 2.0 chưa ra đời thì vấn đề xử lý âm thanh trên điện

thoại di động gặp rất nhiều khó khăn do chưa có một chuẩn chung nào cho các dòng

điện thoại. MIDP 1.0 không hỗ trợ xử lý âm thanh nên các hãng điện thoại cung cấp

các thư viện xử lý âm thanh riêng cho dòng sản phẩm của mình.

Mặc dù trong MIDP 2.0 đã hỗ trợ một thư viện lập trình âm thanh chuẩn

không phụ thuộc thiết bị nhưng hiện nay số lượng điện thoại có hỗ trợ thư viện

chuẩn này chưa nhiều, giá thành của điện thoại dử dụng MIDP 2.0 và có hỗ trợ

MMAPI còn khá cao và chưa được sử dụng rộng rãi. Vì vậy các thư viện hỗ trợ xử

lý âm thanh do các hãng sản xuất điện thoại cung cấp vẫn còn được sử dụng rộng

rãi. Tuy nhiên để có thể ứng dụng các thư viện lập trình này vào việc xử lý âm

thanh thì cần thêm một số bước kỹ thuật để sản phẩm có thể chạy trên các dòng điện

thoại khác nhau. Bảng sau mô tả một số API của các nhà sản xuất điện thoại di động

cung cấp cho việc xử lý âm thanh.

STT Nhà cung cấp Tên gói 1 NoKia Com.nokia.mid.sound.* 2 SamSung Com.samsung.util.* 3 Sony Ericssion Javax.microedition.media.*

Javax.microedition.media.control.*

Bảng 4-5 API của một số nhà sản xuất

Page 15: Sound Music J2ME

Chương 4Xử lý âm thanh

Trần Anh Dũng � 02HC022 56 Phan Trung Hiếu � 02HC055

4.2.1 Nokia API Các API mà nhà sản xuất Nokia cung cấp chỉ hỗ trợ cho việc phát các âm

thanh dạng TONE, dạng WAV. TONE được lưu trữ theo dạng mảng các byte biểu

diễn cho tần số nốt nhạc như ví dụ sau: byte[] dataIntro = {

(byte)0x02, (byte)0x4a, (byte)0x3a, (byte)0x40,

(byte)0x04, (byte)0x00, (byte)0x19, (byte)0x2a,

(byte)0xa2, (byte)0x34, (byte)0x49, (byte)0xaa,

(byte)0x17, (byte)0xa1, (byte)0x6a, (byte)0x12,

(byte)0xa1, (byte)0x1a, (byte)0x20, (byte)0xd5,

(byte)0x0b, (byte)0x50, (byte)0x00

};

hoặc được lưu trữ trong file .ott (ví dụ amnhac.ott).

Cách phát âm thanh dạng TONE:

private Sound introSnd=null;

introSnd=new Sound(dataIntro, Sound.FORMAT_TONE);

introSnd.setGain(254);

public void playIntroduction(){

stopAllSound();

introSnd.play(1);

}

public void stopAllSound(){

introSnd.stop();

}

Có một khó khăn khi sử dụng cách phát âm thanh dạng này là ta không thể

phát song song nhiều hiệu ứng âm thanh cùng một lúc được. Điều này gây khó khăn

cho việc tạo các hiệu ứng âm thanh cho ứng dụng.

Cách kiểm tra điện thoại có hỗ trợ chơi âm thanh:

Dùng phương thức className tìm gói com.nokia.mid.Sound, nếu tìm thấy

tức là điện thoại có hỗ trợ chơi âm thanh.

Page 16: Sound Music J2ME

Chương 4Xử lý âm thanh

Trần Anh Dũng � 02HC022 57 Phan Trung Hiếu � 02HC055

private static TonePlayer makeTonePlayer() {

TonePlayer player;

try {

Class.forName("com.nokia.mid.sound.Sound");

// Tạo lớp chơi âm thanh

Class class = Class.forName("example.tones.NokiaTonePlayer");

player = (TonePlayer)(clas.newInstance());

} catch (Exception e) {

System.out.print(" Không hỗ trợ âm thanh.");

}

return player;

}

Lớp chơi âm thanh trên Nokia.

Package example.tones;

import com.nokia.mid.sound.*; // import gói chơi âm thanh

class NokiaTonePlayer extends TonePlayer {

private final Sound sound; NokiaTonePlayer() {

sound = new Sound(0, 1L);

}

void play(int frequency) {

sound.init(frequency, 2000L);

sound.play(1);

}

void stop() {

sound.stop();

}

}

Vì không thể phát cùng lúc nhiều kênh âm thanh nên trong ứng dụng chỉ

chọn một trong hai cách sau: một là sử dụng âm thanh cho các hiệu ứng, hai là sử

dụng âm thanh làm nhạc nền mà không có âm thanh cho phần hiệu ứng.

Page 17: Sound Music J2ME

Chương 4Xử lý âm thanh

Trần Anh Dũng � 02HC022 58 Phan Trung Hiếu � 02HC055

4.2.2 Samsung API hỗ trợ âm thanh và rung Thư viện API cho điện thoại di động (ĐTDĐ) Samsung bao gồm AudioClip

để chơi nhạc, Vibration để tạo rung, LCDLight để bật tắt đèn màn hình và cuối cùng

là SMS cho phép ta lập trình gửi tin nhắn SMS. Chúng ta chỉ tìm hiểu phần âm

thanh và rung.

4.2.2.1 Chơi nhạc với AudioClip

Âm thanh có lẽ là một tính năng không thể thiếu của game, không chỉ với

game trên PC mà cả game trên ĐTDĐ. Samsung cung cấp lớp

com.samsung.util.AudioClip để lập trình âm thanh cho ứng dụng MIDP. Hiện nay

ĐTDĐ Samsung chỉ hỗ trợ kiểu định dạng .mmf (TYPE_MMF = 1). Để tạo đối

tượng AudioClip, ta dùng constructor sau: public AudioClip(int type, java.lang.String filename)

Với type luôn luôn bằng 1 (định dạng .mmf) và filename là tên tập tin .mmf.

Để kiểm tra ĐTDĐ Samsung có hỗ trợ âm thanh hay không, ta dùng phương

thức tĩnh (static) AudioClip.isSupported( ). AudioClip còn hỗ trợ 4 phương thức

điều khiển là play( ) để chơi nhạc, stop( ) dừng chơi, pause( ) tạm dừng và resume( )

chơi tiếp đoạn nhạc đã tạm dừng trước đó. Lưu ý ở mỗi thời điểm chỉ có tối đa một

đối tượng AudioClip chơi nhạc và đó là đối tượng được gọi play( ) sau cùng.

4.2.2.2 Cảm nhận rung với Vibration

Rung là một tính năng đặc trưng của điện thoại di động. Samsung cho phép

bật và tắt chế độ rung của điện thoại di động với lớp com.samsung.util.Vibration.

Để kiểm tra điện thoại có hỗ trợ rung hay không, ta gọi phương thức

Vibration.isSupported( ). Lớp Vibration còn cung cấp 2 phương thức:

Vibration.start( ) để bật rung và Vibration.stop( ) để tắt rung. Phương thức start( )

gồm 2 tham số:

public static void start(int duration, int strength)

Trong đó, duration là khoảng thời gian rung được tính bằng giây, là một giá

trị nguyên dương và strength là cường độ rung, có giá trị từ 1 đến 5. Tuy nhiên,

Page 18: Sound Music J2ME

Chương 4Xử lý âm thanh

Trần Anh Dũng � 02HC022 59 Phan Trung Hiếu � 02HC055

hiện nay giá trị strength này được bỏ qua, nghĩa là chỉ có duy nhất một cường độ

rung.

4.2.2.3 Sony Ericssion API

Với điện thoại Ericssion thì việc lập trình âm thanh tương đối dễ dàng hơn

các loại Nokia hay SAMSUNG. Do các loại điện thoại Ericssion hỗ trợ Java đều sử

dụng gói API về âm thanh được hỗ trợ trong MIDP 2.0.

4.3 Những khó khăn và hướng giải quyết khi xử lý âm thanh

Khi xử lý âm thanh sử dụng thư viện lập trình đa phương tiện MMAPI thì sẽ

có rất nhiều thuận lợi cho việc ứng dụng trên nhiều dòng điện thoại khác nhau vì

việc xử lý dựa trên một thư viện chuẩn. Tuy nhiên, hiện nay các dòng sản phẩm có

hỗ trợ MMAPI chưa nhiều và giá thành của điện thoại hỗ trợ MMAPI còn khá cao

và chưa được sử dụng rộng rãi. Vì vậy xây dựng ứng dụng sử dụng thư viện này

chưa thể áp dụng phổ biến. Trong tương lai, với sự phát triển của công nghệ di

động, thì đây sẽ không còn là vấn đề nan giải.

Khi xử lý âm thanh sử dụng các thư viện lập trình âm thanh của các nhà sản

xuất điện thoại cung cấp, cụ thể là ba loại điện thoại khác nhau là Nokia, Samsung

và Ericssion, ta thấy cách lập trình xử lý âm thanh là khác nhau vì mỗi nhà sản xuất

đều cung cấp các API riêng và âm thanh mà mỗi nhà sản xuất dùng cho điện thoại

của họ cũng khác nhau.

Vậy làm sao khi viết một ứng dụng có thể chạy được trên các dòng sản phẩm

khác mà không cần phải viết nhiều lần cho nhiều dòng sản phẩm khác nhau? Cách

giải quyết như sau:

• Tạo lớp trừu tượng cho việc xử lý âm thanh chung, gồm các phương thức

chính có thể chơi nhạc.

• Tạo các lớp chơi âm thanh ứng với các dòng sản phẩm tương ứng kế thừa từ

lớp trừu tượng.

Page 19: Sound Music J2ME

Chương 4Xử lý âm thanh

Trần Anh Dũng � 02HC022 60 Phan Trung Hiếu � 02HC055

• Dùng className để tìm một số lớp đặc trưng của từng sản phẩm, nếu tìm

thấy thì xác định được sản phẩm thuộc loại nào và dùng lớp tương ứng chơi

nhạc.

Cài đặt chi tiết cách xử lý âm thanh như sau:

public class Abstract AbSound {

public AbSound(){}

public void StopSound(){}

public void PlaySound(int i, int j, int k){}

public synchronized void sound(byte type){}

public void a(int i){}

public void Init(){}

public void Vibration(){}

public void Light(){}

}

Lớp âm thanh cho Nokia.

import com.nokia.mid.sound.*;

import java.io.*;

import com.nokia.mid.ui.DeviceControl;

public class soundnokia extends AbSound implements

SoundListener{

// Khai báo các biến âm thanh

// Cài đặt tất cả các phương thức trừu tượng

public void StopSound(){

// Code của Nokia

}

public void PlaySound(int i, int j, int k){

//Code ca Nokia

}

public synchronized void sound(byte type){

// Code của Nokia

}

}

Page 20: Sound Music J2ME

Chương 4Xử lý âm thanh

Trần Anh Dũng � 02HC022 61 Phan Trung Hiếu � 02HC055

Lớp âm thanh cho SAMSUNG:

import com.samsung.util.*; public class SoundSS extends AbSound { // Khai báo các bin âm thanh // Cài đặt tất cả các phương thức trừu tượng public void PlaySound(int j, int k, int l){ // Code play nhc ca Samsung } public void StopSound(){ // Code Stop nhc ca Samsung } public synchronized void sound(byte type){ //Code của Samsung } public void Vibration(){ // Code của Samsung } public void Light(){ // Code của Samsung } }

Tương tự cho các dòng điện thoại khác ta cũng cài đặt như vậy. Sau đó để sử

dụng ta cần có lớp Detect Sound như sau:

public class DetectSound{ public DetectSound(String s, String s1){} public static AbSound Init(){ AbSound q1; Try{ Class.forName("com.nokia.mid.sound.Sound"); Class.forName("com.nokia.mid.sound.SoundListener"); Class.forName("com.nokia.mid.ui.DeviceControl"); Class class1 = Class.forName("soundnokia"); q1 = (AbSound)class1.newInstance(); }catch(Exception exception){} try{ Class.forName("com.samsung.util.AudioClip"); Class.forName("com.samsung.util.Vibration"); Class.forName("com.samsung.util.LCDLight"); Class class2 = Class.forName("SoundSS"); q1 = (AbSound)class2.newInstance(); }catch(Exception exception1){ q1 = new AbSound(); } return q1; }

Page 21: Sound Music J2ME

Chương 4Xử lý âm thanh

Trần Anh Dũng � 02HC022 62 Phan Trung Hiếu � 02HC055

Trong ứng dụng, khi cần sử dụng âm thanh ta chỉ cần gọi phương thức Init( )

xác định xem loại điện thoại nào đang được sử dụng.

4.4 Tổng kết

Trong chương này chúng ta đã tìm hiểu cách xử lý âm thanh cho điện thoại

di động sử dụng thư viện lập trình đa phương tiện chuẩn MMAPI cũng như các thư

viện lập trình âm thanh của các nhà sản xuất điện thoại cung cấp. Tất cả các ứng

dụng rồi cũng được xử lý theo một chuẩn chung nhưng tất cả các thư viện đều có

những ưu khuyết điểm riêng của nó và việc sử dụng thư viện nào cho ứng dụng của

mình còn tùy thuộc vào các điều kiện cụ thể. Tóm lại, với sự có mặt của âm thanh

các ứng dụng trên điện thoại di động sẽ hấp dẫn hơn rất nhiều.