05 1月 2012

[跨界] 之一:Nokia 真是會造手機!

早餐店裡的一張廣告上看到 Nokia 新的 Lumia 系列的手機造型,那線條真是太洗練了!方得不會太方,圓得不會太圓,如果要說有什麼缺點的話…大概就是裡面裝的是微軟的作業系統吧…

回到家,撥弄了一會兒手上的 Nokia N900 ,裡面的系統是基於 Linux 的 maemo 系統。Linux 的功能很強大。比方說,我可以隨處用 Linux 抓附近的 Wifi 訊號,然後試著去破解它的密碼 ,這樣就有網路可以用了!當然,我不會做這種事。因為對方也可以藉由封包查詢的方式把我登入網頁時的帳號密碼抓下來。又或者,我可以利用自己寫的程式,不需經過 Apple 的審查就在手機上運行,和朋友分享 (哪來的朋友啊?)  等等…

有這麼強大的功能,但我一直以來,只把它當做「臨時可以上網查資料的電話」和「偶爾看一下 GPS 地圖的裝置」而已。這樣是不是太浪費 maemo 的能力了呢?

於是,這幾天就利用一些零碎的時間,想把手上幾個自己寫的程式 port (移植) 到 maemo 上頭。理論上,我的桌機是 Linux,筆電是 Linux ,手機既然也是 Linux …頂多只有 cpu 的型號不一樣而已。i386 和 ARM 的架構,應該沒有差很多吧…所以,這應該是小菜一碟而已囉?

想不到,一玩下去,才發現「代誌不是憨人想得那簡單!」

Nokia 真是會造手機!但真的很不會搞「系統」。

在 Lumia 系列的手機出來以前,前一代裝載著基於 Linux 發展出來的 meego 的 N9 就已經讓我心動不已了。但讓我踩下煞車的,除了荷包的考量外,還有「短短的四個產品時程裡, Nokia 就歷經了自己寫的 symbian 系統 > 基於 Linux 的 maemo 系統 (只用在 N900 上) > 也是基於 Linux 的 meego 系統 (只用在 N9 上) > MS 開發的 Mango 系統!(用在 Lumia 系列的眾多手機上)」這個因素。

一下要這個系統,一下要那個系統,這樣三心二意地怎麼可能把事情做得好咧?

在 Linux 裡有個很好用的函式庫,叫 libsndfile ,看名字也知道是用來處理聲音的 (library - sound - file) ,python 裡呢,有個把 libsndfile 包裝好的模組,叫 audiolab。這個東西很好用!(因為可以拿來偷懶)

如果我要讀取一個聲音檔的內容的話,只要…
sound = audiolab.wavread("sample.wav")
只要一行程式, sound 裡面就包含有 sample.wav 檔裡的所有我會用到的資訊了。

結果呢… libsndfile 在 maemo 有相依性的問題,所以裝不起來。我又不想自己編譯,因為那還要再建立一個編譯環境,只為了編一個函式庫 (另一個原因是我懶…) 。

那這個問題怎麼辦呢?Nokia 決定裝死,把問題丟給社群去解決,但玩「聲音」的本來就是小眾,玩 maemo 系統的,也是小眾。兩個小眾的交集就是…怎麼好像只剩我一個?

好吧,那不偷懶,用 python 的 wave 模組來讀 *.wav 檔好了。要用 wave 模組達成和 audiolab 一樣的目的,那就必需用上…
wavfile = wave.open("sample.wav", "r")
wavData = numpy.fromstring(wavFile.readframes(wavfile.getnframes()), 'int16')
wavfs = wavFile.getframerate()
sound = (wavData, wavfs, 'pcm16')

此時的 sound 才會和前面用 audiolab 的 sound 內容一致。

乍看之下,好像才多幾行而已嘛…好,沒關係,我偶爾也是很勤快的。幾個手起鍵落,把程式改好以後,傳送到 N900 手機裡…呃…不會跑。錯誤訊息裡說「你沒有裝 numpy 這個模組哦!」

好吧,那就來裝…想不到,這又是另一段痛苦的開始,弄了半天,不管是用 easy-install 還是 apt-get ,numpy 就是裝不上去。因為有個叫 liblapack (library - linear algebra - package) 的線性代數運算的函式庫找不到。

好吧,那先裝上 liblapack 總行了吧! 呿~不行!

我說 Nokia 這存的是什麼心態啊!? numpy 是很重要的陣列運算模組,幾乎所有表現得好像「頗有智慧」的程式,背後都會用到陣列運算啊。

你不把開發環境弄好,就不會有很多開發者在你的系統上寫程式,做軟體。你的系統上沒有什麼好玩的程式,好用的軟體,那就不會有使用者被吸引,沒有使用者被吸引,你就只好讓執行長下台,然後再去抱微軟的大腿了。

就這樣,在網海中浮浮沉沉了兩天,找到其他人的提供的方法對系統做了一些 hacking 以後,終於瞞過系統,裝上了 numpy。 (類似的故事還也發生在 scipy 和 matplotlib 兩個模組上,但其中的心酸我就不再提了)

最後,終於在手機裡跑出了和桌機一樣的波形圖和頻譜圖。在高興了一秒以後,我又要開始認真思考,那我是不是要為了「跨平台」這個考量,把所有用到 audiolab 的地方,都改成用 numpy 搭配 wave 的做法了…

晚點有空的話,來試看看這樣改,能不能在 RISC 架構的 Apple OSX 上跑好了!:)

0 意見:

張貼留言