2012年7月23日 星期一

Port LAME MP3 Encoder to MIPS WINCE

DL LAME 3.99.5
基本上打開 vc9_lame.sln  就可以build 了,但是這是 Windows 版本

選擇 solution platform
改成 STANDARDSDK_500 (MIPS)
copy from WIN32


基本上
從Windows porting 到 WINCE 會遇到下列問題

1. WINCE 沒有
signal.h
errno.h
fcntl.h
io.h

沒有
sys/types.h
sys/stat.h
sys/timeb.h

沒有
SetPriorityClass(), ftime()

沒定義 _IOFBF, 其值為0

2. 要定義 _MIPS_,  跟 STRSAFE_NO_DEPRECATE

STDIN_FILENO, STDOUT_FILENO。STDERR_FILENO
http://checko.blogspot.tw/2006/03/file-and-stream-stdin-and-stdinfileno.html
http://www.mail-archive.com/dev@apr.apache.org/msg18982.html
http://forum.soft32.com/pda/Porting-app-GetStdHandle-ftopict51244.html

3. 最好定義 _WIN32_WCE, Link Subsystem 要指定為WINDOWSCE

在 build LAME 時 會出現一個 warning
 'strdup' undefined; assuming extern returning int
把 strdup 改成 _strdup 就好了

4. mpglib & libmp3lame 容易過關
但是frontend 的 lame.exe 部份就要修改
lametime.c 沒有 clock(), time(),
parse.c 沒有 FindFirstFileA 要改成 FindFirstFileW

沒有 SetPriorityClass(),  WINCE 是直接 map 248-255 這8個 (0 最高255最低)
Windows 是6個Priority Class 7個 Priority Level
6 * 7 = 42 種組合 map 到 0-31 priority ( 0 最低)


5. 沒有 stdint.h 這個檔案是c99 相關的, VS2008 (包含)以前的版本都不支援,(VS2008 C99 支援很差?) 在Visual Studio 2010 的版本,放在 \vc\include 下

6. 有 setvbuf 卻沒有定義 _IOFBF _IONBF ...



最後有一堆 Linking Error

因為用 wmain 所 entry point 要設成 mainWCRTStartup


Windows CE supports the following CRT entry points:
  • mainACRTStartup for applications that define the main function
  • mainWCRTStartup for applications that define the wmain function
  • WinMainCRTStartup for applications that define the WinMain function
  • wWinMainCRTStartup for applications that define the wWinMain function
  • _DllMainCRTStartup for DLLs
沒有 _wgetenv, GetConsoleOutputCP
沒有 powf, log10f 改成 pow, log10
沒有 time(), 因為被 preprocessor 改成 _time64()

lame_get_file_size 的問題
需要在 FILE* 和 HANDLE 之間轉換
_get_osfhandle  可以把 file descriptor 轉成 file handle
_fileno 可以把 file pointer (FILE*) 轉成 file descriptor

但是
在WINCE下沒有 _get_osfhandle

沒有留言: