2012-02-12 9 views
5

Có hướng dẫn hoặc ví dụ nào về cách phát tệp WAV trên máy Mac từ ứng dụng được xây dựng bởi Delphi XE2 FireMonkey không?Có phát lại âm thanh WAV trên máy Mac từ Delphi XE2 không?

Tôi hỏi vì mã này không hoạt động:

var 
    //fWaves head and data is initialized and plays properly on Win through OpenAL 
    fWaves: array of record 
    Head: TWAVHeaderEx; 
    Data: array of byte; 
    end; 
    D: NSData; 
    N: NSSound; 
begin 
    D := TNSData.Wrap(TNSData.Create.initWithBytes(@fWaves[0].Head, SizeOf(fWaves[0].Head) + fWaves[0].Head.DataSize)); 
    ShowMessage(IntToStr(D.length)); //--Length is correct 
    N := TNSSound.Wrap(TNSSound.Create.initWithData(D)); 
    ShowMessage(FloatToStr(N.Duration)); //--Displays 0 
    if N.play then 
    ShowMessage('Yes') 
    else 
    ShowMessage('No'); //--Always returns NO 
end; 

Tôi tải phần đầu tập tin WAV và dữ liệu từ bộ nhớ và nó đóng tốt với OpenAL. Vì vậy, vấn đề là một nơi nào đó trong việc sử dụng NSSound của tôi. Bất cứ ai có thể vui lòng cung cấp một số ví dụ làm việc của phát lại âm thanh Delphi XE2 trên máy Mac?

+0

Tôi đoán định dạng của bản ghi fwaves không khớp chính xác với định dạng của tệp WAV thực. Thử sử dụng byte thô từ tệp. –

+0

Đã thử rằng, cũng như cố gắng initFromFile (path_to_aiff) .. Không có gì giúp đỡ. Vì vậy, cuối cùng tôi đã chuyển sang OpenAL. – Kromster

Trả lời

0

Cũng có thể gửi nó như một câu trả lời, trong trường hợp đó sẽ giúp mọi người:

Cố gắng đó, như cố gắng cũng initFromFile(path_to_aiff) .. Không có gì giúp đỡ. Vì vậy, cuối cùng tôi đã chuyển sang OpenAL.

Có thể trong tương lai Embarcadero khắc phục cách truy cập cụ thể vào NSSound, nhưng bây giờ OpenAL hoạt động tốt nhất. Ngoài ra, OpenAL là nền tảng chéo, có nghĩa là tôi có thể sử dụng cùng một mã âm thanh trên Win và Mac.

3

Freepascal/Lazarus có một đơn vị được gọi là "macosall.pas" là bản dịch của các headerfiles os-x C++ thành pascal, cho phép bạn gọi các hàm os-x nguyên gốc.

Đáng buồn là đơn vị này không phải là một phần của delphi, nhưng bằng cách mở đơn vị bạn có thể sao chép khai báo hàm vào delphi và nó sẽ hoạt động.

Tôi hy vọng rằng bạn sẽ tìm thấy những gì bạn cần trong API quicktime là trung tâm phương tiện truyền thông trên máy Apple. Ngoài ra, hãy xem Apple developer và xem tài liệu.

+0

Điều đó không cho tôi một đầu mối về những gì sai với NSSound-NSData trong mã được trích dẫn. – Kromster

+0

Trong khi mã hóa trong C# và mono cho iOS, tôi đã trải qua nhiều vấn đề tương tự nhưng ở các khu vực khác nhau. Nếu TNSData có cùng các phương thức như lớp Objective C ban đầu, thì bạn có thể đẩy dữ liệu dưới dạng NSStream, NSBuffer hoặc thậm chí là văn bản. Trong đoạn mã trên bạn sử dụng một bộ đệm byte bình thường có vẻ như, hãy thử khởi tạo từ một luồng. Một ví dụ là hộp thoại gửi thư mà theo tài liệu của apple nên lấy về bất kỳ đối tượng NSdata nào - nhưng không phải cho đến khi tôi sử dụng một luồng mà nó hoạt động. –