Tải bản đầy đủ (.pdf) (21 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (526.28 KB, 21 trang )


ĐẠ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
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.
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.
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:
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:
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
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
F
ramePositionControl
Đ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.
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
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ẽ
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
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);
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.
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
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
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.
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.
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,
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.
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

}
}
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;
}
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.

×