• Thứ Ba, 18/05/2004 09:04 (GMT+7)

    Trình chơi nhạc thông minh


    Chỉ cần đưa đĩa nhạc MP3 vào ổ CD-ROM và chương trình sẽ tự động chọn chơi những bài nhạc theo ‘gu’ của bạn
    Các đĩa nhạc MP3 chứa đến hàng trăm bài nhạc, mỗi khi tậu được một đĩa mới bạn lại phải bỏ thời gian ra để lập danh sách các bài nhạc mình ưa thích. Thật tuyệt vời nếucó chương trình chơi nhạc có thể “hiểu” được “gu” của bạn và tự động chọn chơi những bài có giai điệu mà bạn ưa thích.
    Bài viết này giới thiệu một chương trình chơi MP3 thông minh, được đặt tên là Louis, Louis (hình 1), theo tên của nhà phát minh ra hộp chơi nhạc - Louis Glass. Louis, Louis có hai chế độ làm việc. Ở chế độ Random (ngẫu nhiên) chương trình chọn ngẫu nhiên các bài nhạc. Khi chọn nhạc, chương trình sẽ xác định xem bạn thích bài nhạc ở mức nào. Thuật toán lựa chọn đầu tiên kiểm tra xem bạn đã xếp hạng bài nhạc chưa, nếu chưa nó sẽ kiểm tra việc xếp hạng album, và cuối cùng là artist (ca sĩ hay nhạc sĩ). Xác suất bài nhạc được chơi tuỳ thuộc vào việc phân hạng của bạn theo điểm số từ 0 đến 10. Nếu bạn chưa thực hiện bất kỳ việc phân hạng nào, xác suất được ấn định là 25%.
    Chế độ thứ hai (bỏ chọn ô Random Play), Louis, Louis, làm việc gần giống các chương trình chơi MP3 thông thường. Bạn có thể thiết lập để chương trình chơi bài nhạc bất kỳ trong danh sách của bạn, và nó sẽ tiếp tục tuần tự chơi qua tất cả các bài nhạc.
    Bạn có thể duyệt qua danh sách các bài nhạc bằng cách nhấn nút Playlist, tất cả các bài nhạc của bạn sẽ được hiển thị theo dạng cây (hình 2). Bạn có thể thêm bài hát mới vào danh sách bằng nút Add Tracks, bạn chỉ cần xác định thư mục và chương trình sẽ tự động dò tìm các bài nhạc chưa có trong danh sách để thêm vào (hình 3). Sau đó, bạn có thể thực hiện phân hạng theo Artist, Album và Song (bài nhạc). Công việc này được thực hiện nhanh chóng và dễ dàng với các điều khiển dạng thanh trượt. Việc phân hạng càng chính xác thì Louis, Louis càng ‘hiểu’ rõ gu của bạn và phục vụ tốt hơn.

     


    Hình 1: Giao diện chính của chương trình Louis, Louis

    Xây Dựng Chương Trình
    Có nhiều tùy chọn để xây dựng chương trình chơi MP3, ví dụ như thư viện java miễn phí ở website http://www.javazoom.net, và còn có nhiều chương trình chơi MP3 miễn phí khác cho phép bạn thay đổi theo yêu cầu của mình.
    WinAmp của Nullsoft (http://www.winamp.com/) và Windows Media Player của Microsoft (http://msn.microsoft.com/) có cung cấp các bộ phát triển SDK cho phép bạn xây dựng chương trình chơi MP3 mà không phải làm từ đầu, bạn có thể tận dụng giao diện và các tính năng sẵn có, cũng như khả năng điều khiển chương trình. Đây là hai ứng cử viên sáng giá để xây dựng chương trình chơi nhạc riêng của bạn.
    WMP của Microsoft được chọn để xây dựng Louis, Louis. Bạn có thể nhúng WMP vào chương trình như một thành phần điều khiển, giải pháp này đơn giản hơn so với việc điều khiển WinAmp từ bên ngoài. Và điều quan trọng là giấy phép sử dụng công nghệ MP3 của Microsoft được chuyển giao cho người dùng WMP SDK. Nhờ vậy Louis, Louis không bị vướng vấn đề bản quyền công nghệ MP3.
    Bạn có thể tải về WMP SDK ở địa chỉ http://msdn.microsoft.com/, vào liên kết Downloads, chuyển tới mục Graphics and Multimedia rồi tới Windows Media Technologies, và tải về Windows Media Player 7.1 SDK.
    WMP SDK có cung cấp một chương trình mẫu C++ dùng ATL (Active Template Library). Louis, Louis là ứng dụng ATL - dùng WMP OCX (OLE Control EXtension) như là một điều khiển nhúng. ATL cho phép thực hiện việc này mà không yêu cầu phải viết nhiều lệnh.
    Dùng cách của Andrew Whitechapel giới thiệu ở Code Guru (http://www.codeguru.com/atl/atlWindows.html) để tạo ứng dụng ATL đơn giản ban đầu với lớp cửa sổ chính, ClouisDialog, và chương trình đã sẵn sàng làm việc với WMP OCX. Tạo một thể hiện của OCX và nhúng WMP vào. ATL định nghĩa lớp cửa sổ CAxWindows được thiết kế đặc biệt để chứa điều khiển ActiveX, thêm một thành viên của lớp này vào ClouisDialog, và tạo cửa sổ con trong ClouisDialog::On-InitDialog(). Khi cửa sổ được tạo, nó lập tức tạo một thể hiện của WMP OCX trong cửa sổ. Đoạn mã 1 được trích từ OnInitDialog().
    Sau khi tạo thể hiện WMP control, kế tiếp phải thiết lập các thành phần chương trình gọi các hàm và xử lý các sự kiện của control này. Trước hết dùng chức năng import của Visual C++ để kéo vào định nghĩa đầy đủ các đối tượng COM trong OCX. Dòng lệnh sau được thêm vào tập tin STDAFX.H.

     

     #import “WMP.OCX”

     


    Hình 2: Danh sách bài nhạc thể hiện ở dạng cây

    Thêm tập các biến thành viên vào lớp ClouisDialog; xem đoạn mã 2. Bốn đối tượng COM thể hiện các giao tiếp dùng để gọi các hàm thuộc các thành phần khác nhau của WMP. Chúng được khởi tạo trong ClouisDialog::OnInitDialog() ngay sau khi WMP OCX được tạo (đoạn mã 3). Với các đối tượng này, bạn có thể thêm vào hay gỡ bỏ bài nhạc khỏi danh sách, nhảy tới bài nhạc kế… Vấn đề còn lại là xử lý sự kiện.
    ATL có lớp mẫu IdispEventImpl dùng cho việc tiếp nhận sự kiện từ OCX. Thực hiện theo tài liệu hướng dẫn của Microsoft, tạo lớp tiếp nhận cho sự kiện cần thiết, ở đây là sự kiện CurrentItemChange (đoạn mã 4). Việc thêm các sự kiện mới thực hiện đơn giản bằng cách thêm hàm thành viên xử lý. Sự kiện được xác định duy nhất bởi dispid (trong trường hợp này là 0x16ae), mẫu hàm xử lý sự kiện có trong tập tin WMP.TLI được tạo khi xử lý câu lệnh #import.
    Để kết nối với cơ chế sự kiện, tạo thành viên ClouisEventSink trong CLouisDialog và kết nối nó với OCX trong hàm OnInitDialog():
               
    hr = m_EventSink.DispEventAdvise (m_Player );
    Một lời gọi hàm Unadvise tương ứng được thực hiện khi chương trình kết thúc.

    Cơ Sở Dữ Liệu
    Microsoft Access được dùng để tạo cơ sở dữ liệu đơn giản gồm các bảng Tracks (bài nhạc), Albums, và Artists, mỗi bảng chứa tên và điểm phân hạng. Bảng Tracks có chứa tên tập tin nhạc với đường dẫn đầy đủ.




    Hình 3: Thêm và Quét tìm bài nhạc mới

    Một câu truy vấn nhóm tất cả các bảng dữ liệu trên thành một danh sách được sắp thứ tự; đây là danh sách mà chương trình dùng chọn bài nhạc để chơi. Ba bảng dữ liệu cơ sở chỉ dùng đến khi thêm bài nhạc mới.
    Việc kết nối với cơ sở dữ liệu Access được thực hiện với OLEDB thông qua ATL. Dùng ALT Oject Wizard để tạo lớp truy cập đầy đủ tới đối tượng dữ liệu.

    Thêm Vào Danh Sách Playlist
    Tác vụ thêm vào danh sách playlist gồm hai bước. Như trong hình 3, bước đầu tiên xác định thư mục, kế tiếp thực hiện việc duyệt file có đuôi mp3.
    Thay vì tự viết lớp giải mã thẻ ID3, chúng ta có thể dùng lớp CMP3Info của Roman Nurik ở Code Project (http://www.codeproject.com). Nó làm việc rất tốt.

     

    Hoạt Động
    Điều khiển WMP lấy 5 bài nhạc từ danh sách playlist, gồm bài nhạc đang được chơi, hai bài nhạc trước, và hai bài nhạc sau. Điều này nhằm cho phép người dùng có thể dùng các nút nhảy bài (skip) của WMP để nhảy nhanh tới bài sau hoặc bài trước.
    Mỗi khi một bài nhạc được chơi xong, sự kiện CurrentItemChange được gửi đi. Mỗi khi người dùng nhảy tới bài kế, Louis, Louis thêm một bài mới vào danh sách sắp chơi, và bỏ đi một bài ở phần danh sách đã chơi. Danh sách ảo này giúp cho chế độ chơi ngẫu nhiên thực hiện dễ dàng.

     

    Các Yêu Cầu Cần Thiết
    Để xây dựng chương trình, bạn cần có Visual C++ 6, tốt nhất nên cập nhật lên Service Pack 5, và phải cài Windows Media Player 7.1. Nếu có cài WMP SDK thì càng tốt. Mặc định, WMP không cho phép ứng dụng bên ngoài chèn thêm vào danh sách của nó. Để cho phép kiểm soát danh sách của WMP, bạn khởi chạy WMP, vào menu Tools•Options, vào mục Media Library và chọn Full Access cho phần Internet site rights.
    Mã nguồn đầy đủ của chương trình có ở http://www.ddj.com/ftp/2002/2002_10/llmp3.zip.


    Phương Uyên

    ID: A0301_80