2011年12月13日 星期二

封鎖/移除 Google+ 熱門訊息

Google 在 l10n 上一直都是半吊子,至少台灣的正體中文語系是這樣啦。個人覺得 Google+ 這個服務本身是不錯的,只要 Google 能拿掉該死的熱門訊息的話 ...

和 Blogspot 統計資料中的地圖資訊用了簡體地名一樣,Google 在正體中文版的 Google+ 熱門訊息裡面引用了很多簡體的訊息串(幾乎全部都是),內容不外乎批判政治、時事。Google+ 一開始 Beta 的時候連縮都不能縮,實在是非常礙眼。不知道什麼時候 Google 才會意識到他們的 What's hot 功能其實非常讓人討厭,至少也提供個選項讓使用者關掉它。

在那之前,我們可以利用瀏覽器的擴充套件來移除熱門訊息列。首先你需要先裝 Adblock plus,我想這個套件應該很普遍,不管是 Firefox 還是 Google Chrome 都有支援。接下來在 Adblock plus 的偏好設定中加入兩條自訂規則:

plus.google.com##DIV[class="zhMuaf Tp6dle"]
A[class="a-j c-i-j-ua tg3b4c qQWXrb g2Lc3b dfrbjb"]

Google 最近終於在「趣事 」頁面裡面加了 scale bar,讓使用者調整熱門訊息出現在訊息串的數量,拉到最左邊就可以完全隱藏了。

2011年11月9日 星期三

[PATCH] Fix contact server for emesene-1.6.3

最近用 emesene 或其他第三方撰寫的 Windows live client 的使用者可能會遇到無法登入的問題。其原因可能是微軟有動過 MSN server 端,總之只要把 contact server url 改一下就能用了。

目前 emesene 官方只維護 v2,所以只有 v2 有官方的 patch。好在有人已經提出 v1 的解,為了方便我直接弄成 patch 比較省事。

fix_contact_server_for_emesene-1.6.3.patch


這個 patch 直接套用在 /usr/share/emesene 就可以了(Debian squeeze 是放在這裡,其他 distro 如法炮製)。

$ cd /usr/share/emesene
$ patch -p1 < /path/to/fix_contact_server_for_emesene-1.6.3.patch

patch 完可以執行以下指令重新編譯出 pyc 檔:
$ python -m compileall .

2011年10月23日 星期日

NVIDIA 顯卡 + compiz 的垂直同步(vsync)設定

Linux 要開垂直同步真不是一件容易的事情,往往某些地方 ok,另一邊就會失敗。好不容易弄出一個自己可以接受的解,趕快筆記一下 XD

原本的採用的設定是:nvidia-settings (OpenGL Vsync ON),compiz (sync to vblank)

這樣的組合的結果是:全部視窗有 vsync,但是 compiz 動畫和全螢幕視窗效能減半,全螢幕視窗效能可以靠 compiz 的 unredirect_fullscreen_windows 來加速,它可以讓全螢幕視窗不要把畫面導到 compiz 以加速顯示,所以它的 vsync 設定是純看 nvidia-settings,而且一旦有任何需要把畫面導到 compiz 的視窗出現,compiz 就會暫時取消 unredirect_fullscreen_windows,這樣才能把兩個視窗做混和,切換的瞬間會有明顯的閃爍。另外就是切換解析度的全螢幕視窗需要開啟這個選項才能解決畫面不更新問題。結論是除非切換解析度的全螢幕視窗很重要,不然不要開它。


新採用的設定是:nvidia-settings (OpenGL Vsync Off),compiz (sync to vblank)

這個設定等於是完全讓 compiz 控制 vsync,全部的視窗都有 vsync,compiz 動畫和全螢幕視窗全速,整個環境一整個順到不可思議,也不用開 unredirect_fullscreen_windows,VLC全螢幕中顯示彈出視窗不再有閃爍問題。

2011年10月22日 星期六

在 Debian 6 Squeeze 上玩 StarCraft II

雖然 AppDB 上面有人用 Squeeze 內建的 wine 成功執行 SC2,但在我機器上它只會回硬體不支援然後離開,所以還是用新的 stable v1.2.3 比較保險。

編譯 wine 需要的套件可以用以下指令:
apt-get build-dep wine
安裝完 wine 以後執行 regedit,wine 需要調整 Direct3D 一些設定才能讓 SC2 正常顯示,最明顯的瑕疵就是 SCV 會多一根長長的天線(應該是 vertex shader 的問題)。

AppDB 網頁

在網頁中搜尋 "Regedit video performance tweaks",照內容把機碼加到登錄檔就可以了。

再來是效能問題,wine 跑 D3D 程式效能大概只有 Windows 原生的一半不到(大概啦),所以必須把特效降低才玩得下去。其實只要有開 bump mapping、中等地形細節和陰影基本上畫面就不會跟全開差到哪裡去,特效全開其實只是用速度換一些微小的改進。

SC2 的選項裡有個叫材質解析度的設定,如果跑某些地圖會 crash 可以把它調到中等試試。

另外 compiz + wine-1.2.3 + SC2 這樣的組合可能會遇到螢幕邊界沒辦法捲動地圖的問題,解決的辦法是關閉 Desktop Wall、旋轉立方體特效,不然就是換掉 Window Manager。

2011年10月13日 星期四

Thunar 卸載可移除裝置時出現 Cannot remove directory 錯誤

雖然不知道這個錯誤出現的條件,不過一旦出現以後,之後每次卸載都會出現這個錯誤,真的是很討厭。把關鍵字餵狗以後,發現只要把 /media 底下的兩個隱藏檔砍掉就正常了。

sudo rm /media/.hal-mtab /media/.hal-mtab-lock

2011年10月4日 星期二

安裝 GDM 產生的問題解

從無 DM 環境切換到 GDM 環境大概會遇到以下的問題(吧?)至少在我機器上是這樣 orz

第一是 FontConfig 設定,在 gdm 登入畫面的時候不知道算哪個 user(也許是 root 吧?),原本是用家目錄的 .fonts.conf 來覆寫本機設定。我們可以改用 /etc/fonts/local.conf 讓全部 user 包含 gdm 套用 FontConfig 設定。

第二是螢幕 DPI 設定,雖然說某些 DE 會提供工具讓你設定,但我還是比較喜歡改 Xserver 的設定。原本是透過修改 xserverrc 來變更預設 DPI,裝了 GDM 以後它不走 xserverrc,為了避免讓情況更複雜,直接修改 xorg.conf 把 EDID 偵測關掉並且強制指定 DPI 值比較快。
Section "Monitor"
	Option "UseEdidDpi" "False"
	Option "DPI" "96 x 96"
EndSection

2011年9月25日 星期日

讓 Windows 系統使用遠端 CUPS 印表機

如果你要用 Windows 系統使用網路上以 CUPS 架的網路印表機的話,你需要安裝 CUPS 的 Windows driver。安裝只需要把 source tarball 解開,然後在 Windows 的控制台新增網路印表機就可以了。

新增印表機的時候請選網路連結(http://開頭的),連結內容可以到印表機伺服器的 CUPS 網頁取得(http://remote.server:631 => Administration => Manage printers => 印表機連結),印表機連結格式如下:
http://remote.server:631/printers/Remote_Printer_ID

接下來  Windows 會要你選擇 driver,請給它之前下載的 source tarball 裡的 cups6.inf,安裝 CUPS test driver 後就大功告成了。


2011年9月20日 星期二

valgrind 的其他用途

valgrind 是一個常被 programmer 拿來偵測 memory leaks 的利器。不過除了偵測記憶體錯誤以外,其實它還提供了其他有用的工具,只是 valgrind 以 memcheck 作為預設工具。

以下是 valgrind 提供的工具清單:

  1. memcheck
    偵測 runtime 記憶體錯誤與 memory leaks。
  2. callgrind
    提供類似 gprof 的 profiling 功能,記錄函數被呼叫的次數。不同的是它可以在 runtime 即時監控。
  3. cachegrind
    快取命中的 profiler,改善快取失誤可以提昇程式效能。
  4. massif
    heap 的 profiler,記錄記憶體使用量。
  5. helgrind
    thread 的 debugger,主要是用來偵測資料的 race condition。


2011年8月25日 星期四

ALSA 音量控制 sample code

以下是一段 ALSA 的程式碼片段,目的是調整某個音效卡的音量。我們會先開啟預設的 mixer,然後列舉所有的控制項並且找出 Master、將音量調整為 100%。

snd_mixer_elem_t* elem = NULL;
snd_mixer_t* mixer;

snd_mixer_open(&mixer, 0);
snd_mixer_attach(mixer, "default");
snd_mixer_selem_register(mixer, NULL, NULL);
snd_mixer_load(mixer);

for(elem=snd_mixer_first_elem(mixer);elem;elem=snd_mixer_elem_next(elem))
{
	if(!strcmp(snd_mixer_selem_get_name(elem), "Master"))
		break;
}

snd_mixer_selem_set_playback_volume_range(elem, 0, 100);  // range : 0 ~ 100
snd_mixer_selem_set_playback_switch_all(elem, 1);

下面的程式碼則是找出錄音來源的控制項並將它切換到編號一所對應的選項。這種控制項和上面的音量控制不同,它沒有百分比計和靜音開關,只能從幾個 options 中挑一個來用。

snd_mixer_elem_t* elem = NULL;
snd_mixer_t* mixer;

snd_mixer_open(&mixer, 0);
snd_mixer_attach(mixer, "default");
snd_mixer_selem_register(mixer, NULL, NULL);
snd_mixer_load(mixer);

for(elem=snd_mixer_first_elem(mixer);elem;elem=snd_mixer_elem_next(elem))
{
	if(!strcmp(snd_mixer_selem_get_name(elem), "Input Source"))
		break;
}

snd_mixer_selem_set_enum_item(elem, SND_MIXER_SCHN_MONO, 1);

2011年8月16日 星期二

PulseAudio 永遠低延遲播放來自線路輸入的訊號

像音效卡的 line-in、麥克風或 SPDIF等訊號輸入,除非你讓音效卡直接輸出錄音,不然平常應該聽不到輸入訊號才對。讓音效卡永遠播放來自錄音裝置的訊號有一些好處,這樣可以把系統播放的聲音和錄音裝置的訊號合在一起。譬如說實況 console game 的時候加入 PC 端播放的音樂,上一篇錄音的文章雖然也可以做到,但是會有只能兩邊挑一個聽的問題,不是聽音樂犧牲音效不然就是聽音效不聽音樂,對玩家來說頗不方便。不過讓音效卡永遠播放來自錄音裝置的訊號也不是沒有缺點,像 SE200PCI 這種麥克風和線路輸入混合的硬體就會有麥克風訊號被播放的問題。

底下的設定請寫到 /etc/pulse/default.pa

load-module module-loopback source=alsa_input.pci-0000_05_07.0.analog-stereo sink=alsa_output.softvol

其中 alsa_intput 是你的錄音裝置,alsa_output 是輸出(播放)裝置。如果播放有延遲的問題,請修改 /etc/pulse/daemon.conf 內的 default-fragment 系列參數。
default-fragments = 8
default-fragment-size-msec = 1

2011年7月27日 星期三

VirtualBox 自訂視窗解析度與隱藏選單、狀態列

VirtualBox 在裝了 Extension pack 以後雖然可以隨意調整解析度,但在某些時候就是想用固定解析度,偏偏可以選的標準解析度最高只有到 1280x1024(而且還沒寬螢幕可以選)。

這個時候就可以靠以下的指令指定你想要的解析度:

vboxmanage controlvm "Windows 7 x86-64" setvideomodehint "1280" "720" "32"

其中 "Windows 7 x86-64" 是虛擬機器的名稱,解析度會被設定為 1280x720 32bits。

另外,如果想要把那礙眼的選單列與狀態列隱藏、只留下純畫面的話,可以輸入下列指令:

VBoxManage setextradata global GUI/Customizations noMenuBar,noStatusBar

這樣以後啟動虛擬機器就可以得到乾淨的畫面。

VirtualBox USB隨身碟異常

正常來說 Linux user 只要確定帳號有加到 vboxusers 群組,guest OS 有裝 extension pack 的話,照理說 USB 2.0 應該是能正常工作的。但很不幸的是,在我的系統上即使照官方手冊的指示去做還是無法讓 guest OS 辨識 USB 儲存裝置。每次插上 USB 隨身碟、PSP、外接硬碟,Windows 就回我驅動程式安裝失敗,然後 USB 就掛在那裡。奇怪的是如果我是把其他 USB 裝置掛進去的話又一整個正常,像是 USB 滑鼠掛進去的話,X window 的滑鼠會消失。

經過幾天的實驗最後終於發現問題的關鍵。在實驗中我發現由官方發佈的 Linux kernel 可以正確找到 USB 儲存裝置,只有我自己編譯的 kernel 會有這樣的問題。經過 kernel configure 的交叉比對後,最後發現是 CONFIG_USB_DEBUG (USB verbose debug messages) 的問題,把它關掉以後 USB 就正常了。

說也奇怪,一樣的 kernel configure 對 VMware player 就沒影響,搞不好是 VirtualBox 的 bug   XD

2011年7月17日 星期日

FFmpeg GTK+ frontend like Flash Media Live Encoder (gtk-fmle)

這是一個簡易的 FFmpeg 前端程式,主要是針對 Twitch.tv 或 Ustream 這種實況應用而設計的。你可以用它來做 Screencast,將螢幕上的內容編碼傳送到 Flash Media Server。目前的版本算是雛型,未來也許會加入檔案、Video4Linux2 等輸入,以及檔案輸出等功能。

github 網頁: https://github.com/ryuanlu/gtk-fmle


介面:


Twitch.tv 實況測試(初音ミク Project DIVA F - Freely Tomorrow)


編碼參數:640x360@60, crf=23, preset=medium

2011年7月2日 星期六

[PATCH] Added analog video input support for Compro E650F

Compro E650(F) 是一張基於 Conexant 23885 晶片的數位/類比電視卡,它同時支援 DVB-T 數位電視、類比電視和類比端子輸入,板子上有 AV 端子、S 端子、色差端子、FM 天線輸入和紅外線接收器,和 E800(F) 差了一顆硬壓晶片,是一張軟壓的電視卡。

這張卡在 Linux 上有被支援,但僅限於 DVB-T 數位電視的部份能用。為了讓它的輸入端子能用,筆者參考了前人的實驗寫了以下的 patch:
0001-Added-analog-video-input-support-for-Compro-E650F.patch
※ 本 patch 適用於 Linux kernel 版本 2.6.35.0 ~ 3.6.11,3.7 以上使用以下 patch
0001-Added-analog-video-input-support-for-Compro-E650F-for-linux-3.10+.patch
這個 patch 可以啟用 E650(F) 的類比輸入功能,建立 /dev/video0 device node。以下是筆者用色差端子接 PS3 所擷取到的畫面:

2011年6月22日 星期三

在 Linux 下使用 FFmpeg 進行實況

除了 VLC + jtvlc 這個組合之外,FFmpeg 也可以用來進行實況。而且 FFmpeg 不只可以用在 Justin.tv,連 Ustream 也可以上傳。正確的說是可以直接當 Adobe Flash Media Live Encoder 用。

FFmpeg 和 jtvlc 不同,你只需要給 FFmpeg 你的串流密鑰,不需要帳號名稱。以下是一個實況桌面的指令範例:

ffmpeg -f x11grab -s 640x480 -framerate 60 -i :0.0+300,300 -f alsa -ac 2 -i default -vcodec libx264 -vpre medium -s 640x480 -b 800k -bt 400k -acodec libfaac -ab 128k -threads 0 -f flv "rtmp://live.justin.tv/app/live_???????_???????? flashver=FMLE/3.0%20(compatible;\20FMSc/1.0)"

這個指令會擷取從螢幕左上角算起座標 300, 300 的地方,大小 640x480 的視窗內容,並且擷取 ALSA 的 default 裝置,格式為立體聲。輸出的視訊格式為 H.264,採用 medium preset 設定值,並使用固定位元率 800kbps、可容忍的變動範圍為 400kbps,音訊格式為 AAC,位元率 128kbps。後面 live_????????_???????? 就是你的串流密鑰,請參考前面 VLC + jtvlc 的文章取得你的密鑰。

如果你要在 Ustream 實況,那麼你得先到 Dashboard >> Manage My Channel >> Advanced Settings 下載給 FME 用的 xml 檔,裡面會寫需要的 url 和密鑰。要注意的是密鑰後面連著 offair 的字串,把那六個字元去掉才是真正的密鑰。

Ustream 的完整 url 大概長這樣:

rtmp://1.1234567.fme.ustream.tv/ustreamVideo/1234567/abcdefghijklmnopqrstuvwxyzABCDEF flashver=FMLE/3.0%20(compatible;\20FMSc/1.0)

1234567代表你的 channel code,密鑰則是大小寫英文加數字共32 bytes。

個人使用的經驗是覺得 FFmpeg 用來實況桌面的 CPU 使用率遠低於 VLC,VLC在擷取大畫面的時候會造成 Xorg 的使用率滿載並造成系統反應緩慢,FFmpeg在錄影的時候雖然也很吃 CPU,但是不會影響系統操作。

2011年6月17日 星期五

PulseAudio 主音量與各聲道獨立控制

PulseAudio 在預設的情況下,調整主音量(Master)會跟著調整程式本身的音量(PCM),當你調整其中一個音量控制時,另一個就會被影響。

此時我們可以透過修改 /usr/share/pulseaudio/alsa-mixer/paths/analog-output.conf.common 與 /etc/pulse/daemon.conf 來達到用 Master 控制全域音量且不影響各程式的 PCM 音量。
  1. 在 /usr/share/pulseaudio/alsa-mixer/paths/analog-output.conf.common 中找到 [Element PCM] 這個區塊,並將 volume 從 merge 改成 ignore。
  2. 在 /etc/pulse/daemon.conf 中找到 ;flat-volumes = yes ,並將它的註解拿掉改成 flat-volumes = no。

不知道是不是 PulseAudio 實作的問題,以上的設定在 PulseAudio 剛啟動的時候會變成音量全開,一定要動過主音量以後才會變正常。一個比較醜的懶人方法是在 start-pulseaudio-x11 這個 script 裡加上這兩行:

amixer -D default sset Master "`amixer -D default | grep 'Front Left: Playback' |awk '{print $4-1}'`"
amixer -D default sset Master "`amixer -D default | grep 'Front Left: Playback' |awk '{print $4+1}'`"

這兩行會把 PulseAudio 的 Master 音量先降低 1 單位以後,再加 1 單位回去,讓 PulseAudio 的音量控制正常工作。

2011年5月29日 星期日

Linux 桌面正體中文補完

不知道為什麼在自由軟體世界中常常看到半殘的正體中文翻譯,也許比較多人用的軟體翻譯會比較完整一點,但還是多少會看到沒翻的字串。正所謂求人不如求己,當你看翻譯不順眼的時候可以用以下的方法對付。

GNU gettext

大多數的自由軟體是採用 GNU 的 i18n 架構,locale的翻譯訊息是從原始的 .po 檔編譯成程式在讀的 .mo 檔。這些檔案會隨著套件安裝到 /usr/share/locale/zh_TW/LC_MESSAGES 裡,如果你要修改翻譯,你需要 msgfmt 和 msgunfmt 這兩個工具。

我們可以先用 msgunfmt 將 .mo 檔轉成 .po 檔進行文字編輯,在將編輯過的 .po 檔用 msgfmt 輸出 .mo 檔。指令如下:

msgunfmt gtk20.mo -o gtk20.po
msgfmt gtk20.po -o gtk20.mo


除了應用程式中的字串外,選單與 MIME 也常常看到沒翻譯的字串。要編輯它們可以到以下的地方找到定義檔:

  • /usr/share/applications 選單中的應用程式項目
  • /usr/share/desktop-directories 選單中的應用程式目錄
  • /usr/share/mime/packages 檔案類型

MIME 編輯完以後需要跑 update-mime 才會生效。

2011年5月18日 星期三

將資料夾 mount 到另一個資料夾

兩種方法,一種是直接下 mount 指令:
mount --bind src_dir dest_dir

另一種是寫到 fstab:
src_dir dest_dir bind bind

雖然說用 Symbolic link 也是可以差不多的效果,不過用 Symbolic link 的話 console 下 tab 要按兩次才會出現 '/'。用 xfce4-terminal 去開那個資料夾的話,link 會被展開成絕對路徑,使得 PWD 又臭又長。

2011年5月14日 星期六

復原被 git reset --hard 洗掉的 code

利用 git reflog 可以查詢近期 git 命令的全域歷史記錄(跨 branch),你可以利用他列出來的 SHA1 值進行復原工作。不過要注意的是這個記錄是有限的,git 只會保留最近的記錄,所以如果時間拖太久就真的沒法救了。

參考資料:http://stackoverflow.com/questions/5473/undoing-a-git-reset-hard-head1

2011年5月8日 星期日

在 xorg.conf 設定 NVIDIA PowerMizer

在 Device 區段加入以下設定,啟用 PowerMizer 並且在使用 AC 電源時效能全開,使用電池電源時採用動態管理。

Option "RegistryDwords" "PowerMizerEnable=0x1;PerfLevelSrc=0x3322;PowerMizerDefaultAC=0x1"

2011年5月3日 星期二

libavcodec & libavformat 的 fps 偵測

以下的 code 利用 FFmpeg 的 API 去偵測影片檔中的 fps 值。

AVFormatContext* formatContext;

int videoStream;
int audioStream;
int i;
float fps;

av_open_input_file(&formatContext, "your_media_file", NULL, 0, NULL);
av_find_stream_info(formatContext);

videoStream=-1;

for(i=0; i<formatContext->nb_streams; ++i)
{
	if(formatContext->streams[i]->codec->codec_type == CODEC_TYPE_VIDEO)
	{
		videoStream=i;
	}
	if(formatContext->streams[i]->codec->codec_type == CODEC_TYPE_AUDIO)
	{
		audioStream=i;
	}
}

fps = formatContext->streams[videoStream]->r_frame_rate.num /
	formatContext->streams[videoStream]->r_frame_rate.den;

2011年4月18日 星期一

PulseAudio + ALSA softvol 設定

由於 Onkyo SE200PCI 的 RCA output 音量是不能調整的(純 Line-out),直接讓 PulseAudio 去管理的話會有無法調整全域音量的問題(只有靜音跟 100% 兩種)。

解決的辦法是:在 ALSA 設定檔幫 SE200PCI 加上 softvol plugin 生出新的 device,然後用這個 device 送給PulseAudio 當作預設的 sink & source 就解決了。正常來說,這樣的設定會有兩個一樣的音效卡出現在PulseAudio 的音量控制介面,一個是原來的硬體介面,一個是加上 softvol 的介面。我們可以關掉原來的硬體介面,這並不會影響新介面的運作。

ALSA的 .asoundrc 設定:
pcm.softvol
{
	type softvol
	slave.pcm "hw:0,0"
	control.name "Master"
	control.card 0
}

pcm.!default
{
	type pulse
}

ctl.!default
{
	type pulse
}

PulseAudio 的設定檔(/etc/pulse/default.pa),在 module-udev-detect.so 之前加入下面兩行
load-module module-alsa-sink device=softvol
load-module module-alsa-source device=softvol

2011年3月29日 星期二

Httptunnel 簡易架設

Server 端:

hts -F [目標主機:port]  [http port]


Client 端(網路受限制的一方):

htc -F [本機的 port]  [Server端IP:port]

本地端被封鎖的程式(如 VNC)-> 本機 htc -> Server端  hts -> 目標主機

聽說 sshtunnel 好像做法差不多 ?

2011年3月12日 星期六

PulseAudio 硬體輸入與系統聲音同時錄音

在一個 PulseAudio + ALSA 的系統上,麥克風與線路輸入是屬於實體輸入 alsa_input,而系統聲音則是某個 output的 monitor。如果系統沒有特別設定過,我們只能在錄音的時候讓錄音程式使用 input 或 monitor 其中一個來源錄音。

這對於有桌面實況需求的人來說有點麻煩,你想要用麥克風跟觀眾說話就得犧牲掉系統聲音,要讓觀眾聽音效就得停止麥克風輸入。幸好 PulseAudio 有一系列的 module 讓聲音系統變得很有彈性,解決這個問題的原理是這樣的:

我們知道一個輸出裝置會對應到一個可錄音的 monitor,要把 input 跟 monitor 混合在一起送給錄音程式,我們可以利用建立一個虛擬的輸出裝置來達成。這個虛擬的輸出裝置也會有一個對應的 monitor 可供錄音,這時候只要利用 loopback module 將 input 和原本的 monitor 這兩個 source 的聲音送給虛擬輸出裝置播放,這樣一來我們就可以從虛擬輸出裝置的 monitor 錄到全部的聲音。

上面的步驟可以靠編輯 /etc/pulse/default.pa 來達成,在檔案末端加入以下內容:

load-module module-null-sink sink_name=virtual
load-module module-loopback source=alsa_output.pci-0000_05_07.0.analog-stereo.monitor sink=virtual
load-module module-loopback source=alsa_input.pci-0000_05_07.0.analog-stereo sink=virtual

其中的 source 請改成你要的裝置

2011年2月26日 星期六

Justin.tv GTK+ frontend (version 0.2)

jtvlc 是由 Justin.tv 釋出的工具程式,它可以讓 Linux users 利用 VLC 透過 RDP 來進行實況。由於 VLC 編碼的指令很長,又常常需要調整影音同步,在懶得重複輸入落落長指令的情況下,我寫了一個簡單的 GTK 前端程式(gtk-jtvlc)來簡化實況的步驟。這支程式很小,具有以下幾個簡單功能:

  1. GTK 圖形化介面,可以輸入餵給VLC 的 x264、faac 參數還有 Justin.tv 帳號和密鑰
  2. 紀錄使用者的帳密
  3. 可以在GTK介面中啟動或停止 VLC 編碼和jtvlc串流

以下是 GTK 介面的 screenshot (version 0.2):



下載原始碼: gtk-jtvlc-0.2.tar.bz2

gtk-jtvlc 已經停止更新,請改用另一個工具 gtk-fmle

    2011年2月4日 星期五

    OpenGL text rendering: 利用 Pango Cairo

    在 OpenGL 中描繪字串有很多種方法,這裡介紹的方法是利用 Pango 的 Cairo backend 來產生 pixmap ,再將資料送給 OpenGL 當作 texture 輸出。雖然 Cairo 本身也提供很棒的文字輸出服務,但是 Pango 在 Cairo 之上再加上了 markup language,使得字型繪製更有彈性。

    以下是我寫的一支小小的 demo 程式,它簡單地展示用 Pango 畫出一個混合粗體與變色的字串。

    程式碼片段:
    cairo_t* cr = NULL;
    cairo_surface_t* surface =NULL;
    
    char string[] = "Pangoのことが<span color='red'><b>大好</b></span>きです";
    unsigned char* data = NULL;
    PangoLayout *layout;
    PangoFontDescription *desc;
    int w,h;
    
    surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, WIDTH, HEIGHT);
    cr = cairo_create(surface);
    
    layout = pango_cairo_create_layout (cr);
    pango_layout_set_markup(layout, string, -1);
    desc = pango_font_description_from_string ("Droid Sans Japanese");
    pango_font_description_set_size(desc, PANGO_SCALE * 24);
    //pango_layout_set_width(layout, 256*PANGO_SCALE);
    //pango_layout_set_wrap(layout, 1);
    pango_layout_set_font_description (layout, desc);
    pango_font_description_free (desc);
    
    cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 1.0);
    
    pango_layout_get_size(layout, &w, &h);
    printf("w:%d, h:%d \n", PANGO_PIXELS(w), PANGO_PIXELS(h));
    
    pango_cairo_show_layout (cr, layout);
    data = cairo_image_surface_get_data(surface);
    g_object_unref(layout);
    
    glEnable(GL_TEXTURE_2D);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, WIDTH, HEIGHT, 0, GL_BGRA, GL_UNSIGNED_BYTE, data);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
    
    // glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    // glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    
    cairo_destroy(cr);
    cairo_surface_destroy(surface);
    
    

    輸出結果:


    程式碼下載: pango.tar.bz2

    2011年1月27日 星期四

    linux-media 驅動程式編譯 & 安裝

    先用 git 從 linuxtv 網站上抓編譯工具,然後
    下載最新的驅動原始碼 http://linuxtv.org/downloads/drivers/linux-media-LATEST.tar.bz2

    $ git clone git://linuxtv.org/media_build.git
    $ cd media_build/linux
    $ make tar DIR=原始碼的根目錄
    $ make untar
    $ cd ..


    之後就可以用 make menuconfig、make && make install 進行設定與安裝。