標籤:
最近需要從記憶體流中直接播放音頻,想到了使用第三方音頻播放庫bass。在windows上可以很方便的使用相應動態庫(具體參考萬一的部落格),但在iOS上卻沒有相應的使用介紹,準確的說是沒有用於Firemonkey上的樣本。在它官方論壇找到一個用於OSX的Demo,通過分析和測試,研究出了Firemonkey在iOS開發上使用第三方靜態庫的流程和方法。
下面以在Delphi XE10上使用bass的靜態庫libbass.a為例。
1、擷取要使用的靜態庫libbass.a檔案,將libbass.a檔案放在工程能search到的目錄下,一般就放在當前工程目錄下。
2、擷取相應的標頭檔bass.h,翻譯為Pascal介面檔案bass.pas,具體過程和方法請自行百度。這裡因為官網有OSX的demo,裡面有OSX的調用聲明檔案bass.pas,只需稍微修改開頭部分即可增加支援iOS。因為delphi移動平台不支援AnsiChar,為了不修改其他地方,這裡引入了網上的ByteStrings單元dcu,裡面定義了支援移動平台的AnsiChar。
[delphi] view plaincopyprint?
- unit BASS;
-
- interface
-
- {$IFDEF MSWINDOWS}
- uses
- Windows;
- {$ELSE}
- {$IFDEF MACOS}
- uses
- Macapi.Dispatch
- {$IFDEF NEXTGEN}
- ,System.ByteStrings
- {$ENDIF}
- ;
- {$ENDIF}
- {$ENDIF}
-
- // Functions
- const
- {$IFDEF MSWINDOWS}
- bassdll = ‘bass.dll‘;
- {$ENDIF}
- {$IFDEF LINUX}
- bassdll = ‘libbass.so‘;
- {$ENDIF}
- {$IFDEF MACOS}
- {$IFDEF IOS} //增加支援iOS
- bassdll = ‘libbass.a‘;
- {$ELSE} //增加支援iOS
- bassdll = ‘libbass.dylib‘;
- {$ENDIF}
- {$ENDIF}
3、如果就這樣編譯工程,編譯器將報標識符未找到的錯誤,如所示。這是因為靜態庫libbass.a依賴iOS的AudioToolbox.framework。
4、SDK Manager中增加AudioToolbox.framework。
5、Project->Options->Delphi Compiler->Linker->Options passed to the LD linker 中增加“-framework AudioToolbox”。
6、現在可以編譯發布帶libbass.a的程式了。但如果程式碼中使用BASS_StreamCreateFile函數,編譯器將報標識符未找到的錯誤,如所示。這是因為該函數使用了iOS的CFNetwork.framework。
7、同理,需要增加CFNetwork的引用。由於SDK中已經預設同步了CFNetwork,因此只需在第5步Link Option中再增加一個“-framework CFNetwork”即可。
8、至此,就可以編譯發布使用BASS播放記憶體MP3的程式了。
PS:官網說bass依賴的framework有: AudioToolbox, SystemConfiguration, CFNetwork, Accelerate, CoreMIDI(如果使用了BassMiDi)。所以請自行增加SystemConfiguration,Accelerate的引用。
Demo源碼下載
libbass.a: http://s.cdz.la/file/7690588
bass.pas: http://s.cdz.la/file/7690589
demo: http://s.cdz.la/file/7690592
http://blog.csdn.net/tht2009/article/details/50183721
Firemonkey使用iOS的第三方靜態庫(Link Binary With Libraries)