XMMS2 採用 server/client 架構,server 負責音樂的播放與管理,平常是一個 daemon,等有 clients 傳來命令時,再依命令行事。

1. 啟動 XMMS2

xmms2d (xmms2 daemon) 是 XMMS2 的核心,它的任務是接受來自各種 XMMS2 clients 的指令,負責處理音樂的播放與樂庫資料的儲存。當 client 告訴它要放音樂,它就會放音樂,當你離開 client 時,如果沒有告訴 xmms2d 要停止播放,它就會一直播音樂,直到你再由 client 傳命令給 xmms2d,要求它停止播放為止。所以說,播放音樂時,只有 xmms2d 在消耗資源,clients 可以關掉沒關係。

xmms2d 可分成三個部分:

可用 xmms2d 或 xmms2-launcher 來啟動 xmms2 daemon。

使用 xmms2-launcher 與直接執行 xmms2d 的差別在於:xmms2-launcher 會在背景啟動 xmms2d。xmms2-launcher 在 xmms2d 所需的 IPC 是 unavailable 時,不會馬上離開,會撐到指定的 IPC 可用時才會離開,離開後,xmms2d 就準備好可以接受命令了。

一般執行時,直接執行 xmms2-launcher 比較方便;若需要 debug,可用 xmms2d -v

2. XMMS2 的重要檔案與設定

XMMS2 的 clients 使用 IPC sockets 來與 xmms2d 溝通,指定的格式類似 url,有三種傳輸方式 (transport method) 可指定:tcp、tcp6 與 unix 。

一般如只想在本機控制音樂的播放,只要指定 unix socket 即可:

$ xmms2 config core.ipcsocket = unix:///tmp/xmms-ipc-USERNAME

上面的 USERNAME 要改成你的帳號。

除了以命令指定 ipc,也可以直接編設定檔,xmms2d 的個人設定檔位於 $HOME/.config/xmms2/xmms2.conf

如果有遠端控制的需求,才需要設定 tcp://ip:port。也可指定多個 IPC,以分號 ; 隔開,例如:

$ xmms2 config core.ipcsocket = unix://tmp/xmms-ipc-USERNAME;tcp://192.168.0.101:9667

如此,xmms2d 會監聽本機在 LAN 上的 IP 192.168.0.101 之 Port 9667,可由遠端連到本機來控制本機 xmms2 的播放。

遠端使用 client 時,要設定好 XMMS_PATH 才能控制 server,例如:

$ export XMMS_PATH=tcp://192.168.0.101
$ ./xmms2 list

3. xmms2 的命令類型

xmms2 是 XMMS2 內附的命令列,

4. xmms2 音樂資料庫

xmms2 可將使用者指定位置內所有的音樂檔案整理成一個 sqlite3 的資料庫,內含音樂檔案的 metadata 資訊、播放清單、與播放統計資訊 (如專輯名稱、樂手、音軌、播放次數……等等),通常儲存在 $HOME/.config/xmms2/medialib.db ,以下簡單介紹如何管理與使用自己的音樂資料庫:

  1. 把音樂資料夾的路徑加入 media library

    $ xmms2 mlib addpath 'PATH'
  2. 強制更新 media library 內的資料

    $ xmms2 mlib rehash
  3. 搜尋 media library 中的資料

    xmms2 mlib search [field1:val1 [field2:val2 ...]]
    
    $ xmms2 mlib search artist:"Nina Simone" (大小寫沒關係)
    $ xmms2 mlib search artist:"To?" (問號代表一個任意字元)
    $ xmms2 mlib search artist:* (星號代表零或多個任意字元)
    $ xmms2 mlib search album:*by* (搜尋 album 名稱中包含 'by' 的樂曲)
    $ xmms2 mlib search title:*love* (歌名包含 'love' 的樂曲)
    $ xmms2 mlib search genre:electronic artist:a*
    $ xmms2 mlib search tracknr:*22 (搜尋 tracknumber 比較怪,前面要加星號)
    $ xmms2 mlib search tracknr \<= 3 (使用 > 或 < 要先用 \ 跳脫)
    $ xmms2 mlib search 'tracknr<=3' (tracknr 與 <、= 與 3 之間不可有空白)
    $ xmms2 mlib search bitrate:*64000 (單位是 bit/s,即 bps)
    $ xmms2 mlib search bitrate \> 320000
    $ xmms2 mlib search bitrate \<= 64000
    $ xmms2 mlib search size \>= 50000000 (單位是 bytes)
    $ xmms2 mlib search size \<= 5000000 (單位是 bytes)
    $ xmms2 mlib search artist:"ennio*" date:2001 (用 > < >= <= 無效)
    $ xmms2 mlib search samplerate:*22050
    $ xmms2 mlib search samplerate \>= 48000
    $ xmms2 mlib search timesplayed:*5 (被播過 5 次)
    $ xmms2 mlib search timesplayed \>=5
    $ xmms2 mlib search timesplayed \<2
    $ xmms2 mlib search artist:"Nina Simone" OR artist:"Bj?rk" (可使用 "OR" 操作子,一定要用大寫)
    $ xmms2 mlib search genre:jazz AND 'bitrate>=192000' (可使用 "AND" 操作子,一定要用大寫)
    $ xmms2 mlib search artist~no (artist 含有 no 的曲目,~ 代表部分符合)
    $ xmms2 mlib search artist:"bjork" +date (搜尋 date 這個 field 有任何字元的歌曲)
    $ xmms2 mlib search '#18' (找 id 為 18 的曲子,不能用 ?*)
    $ xmms2 mlib search in:bjork (在名稱為 bjork 的 collection 中搜尋)
    $ xmms2 mlib search in:NinaSimone album:"a single woman" NOT title:"a single woman"
    (在名稱為 NinaSimone 的 collection 中搜尋 a single woman 這張專輯中
    除了 a single woman 這首歌外,還有那些歌。NOT 操作子要大寫。)
    $ xmms2 mlib search '(' artist:Bjork AND title~o ')' OR '(' artist:"nina simone" AND title:o* ')'
    (找 artist 為 Bjork 且 title 包含字母 o 的曲目,
    或者 artist 為 Nina Simone 且 title 是以字母 o 開頭的曲目)
    

    其他可用的 field 包含 id (id 指的是音樂檔案在資料庫中的 id 數字)、url (歌曲的路徑)、added (加入 media library 的時間,自 1970 年 1 月 1 日起算的秒數)、mime、lmod (上次修改時間,同樣是從 1970-01-01 起算的秒數)、laststarted(上次播放時間)、duration (歌曲長度,以 miniseconds 計算)、{album, artist, track}_id (歌曲的 MusicBrainz 的 ID number)。

    其實 media library 允許任何 field (有時稱 key 或 properties) 儲存在內,所以要提供完整的 field 清單是蠻困難的,以上所提到的,只是一些比較常見的 field,並不完整。

    url 的格式,在本機是 file:///media/e/Bjork/flac/audio_04.flac ,若用 daap,則為 daap://192.168.0.101:9999/2818.mp3 ,daap 的樂曲都被編號並放到虛擬的目錄了,所以遠端音樂檔案實際的路徑無法用於搜尋。

  4. 將搜尋結果加入播放清單

    搜尋到想要加入播放清單的歌曲後,將 search 改成 searchadd,即可將搜尋結果加入播放清單。

    $ xmms2 mlib searchadd artist:"keith*"

5. xmms2 播放清單

5.1. 管理播放清單內容

5.2. 排序播放清單中的內容

5.3. 管理播放清單

5.4. 播放方式

$ xmms2 play (播放)
$ xmms2 stop (停止)
$ xmms2 seek +120 (前進 120 秒) (使用 daap 或 http streaming 時無效)
$ xmms2 seek -31 (倒帶 31 秒)
$ xmms2 seek 100 (跳到 100 秒處)
$ xmms2 next (下一首)
$ xmms2 prev (前一首)
$ xmms2 toggleplay (切換播放/停止)
$ xmms2 jump PLAYLIST_POSITION (跳到清單中的某個編號)
$ xmms2 volume_list (列出所有 channel 的音量)
$ xmms2 volume [CHANNEL] VOLUME
 (設定 CHANNEL 的音量為 VOLUME,值可為 0-100,若無指定 CHANNEL,就全部一起改)

5.5. 顯示 Server 或曲目資訊

$ xmms2 stats (列出 uptime 與 version)
$ xmms2 info [id] (列出指定 id、或目前播放樂曲在 mlib 中的相關資訊)
$ xmms2 status (進入顯示樂曲播放狀態的模式)
$ xmms2 current PATTERN (以自訂的格式來顯示目前播放曲目的資訊)
(PATTERN 可用 "${album} - ${tracknr}" 的型式指定,請注意 shell 的 substitution 功能)
(實測發現,需將 $ 跳脫,才能正常顯示曲目資訊)
$ xmms2 current "\${artist} > \${album}: \${tracknr} - \${title}"
$ xmms2 current "【\${artist}: \${album}】 \${tracknr} - \${title}"

5.6. 播放清單的類型

6. Collection

所謂 Collection,就是 Media Library 內某些曲目的集合,譬如:

以 Collection 的性質來看,前兩項是動態的,可藉由向 media library 資料庫發出 query 來取得符合的曲目清單,例如:我剛剛將一張周杰倫的專輯加入資料庫,那麼現在再搜尋 artist 為周杰倫的專輯,找出來的結果就會比之前多出剛剛新加入的這張專輯的資料。

第三項 (我最愛的幾首歌) 是一份靜態的清單,也就是說我喜歡的歌是一首一首指定的,除非我自己增減,否則這份清單不會改變。

第四項則混合了動態與靜態的清單。

表面上看,這似乎類似於 Playlist,或者 Dynamic Playlist,但其實 XMMS2 對 playlist 與 collection 的處理是非常不同的。

XMMS2 的 collection,是沒有排順序的,不可用來播放,它只是用來將 media library 中的某些曲目分出來成為一個小組(subset),讓聆聽者容易取得這個小組內的曲目而已。如果想聽 collection 內的曲目,必需依 collection 的內容建立 playlist,才可播放。簡單講,collection 是 a set of media,又稱 mediaset,就技術上來講,是 unordered collection。也可將 collection 看成是用 filter 篩選過的 media library,也就是向資料庫 query 的結果。

XMMS2 的 playlist,是一份有順序的曲目清單,是可用來依序播放的。就技術上來講,是 a list of media,又稱 medialist,其實還是一種 collection,只不過它是 ordered collection。

Collection 存在的目的,是為了讓使用者可以更容易、更方便地從龐大的 media library 中取出某一部分 (collection),依據這個部分,或是這個部分的某一部分,來建立播放清單,讓 playlist 的建立更簡便。

XMMS2 可以有許多 collections,這些 collections 可放到不同的 namespace 中來分類,這些 namespace 彼此不會重疊,如果一個 collection 在某個 namespace,它就不會同時存在於另一個 namespace,但某個 namespace 內的 collection 仍可 reference 到另一個 namespace 內的 collection。

預設有兩個 namespace,一個是 Playlists,專門用來放播放清單;一個是 Collections,用來放一般使用者自己定義的 collections。

XMMS2 在指定 collname 時,有時必需加上所屬的 namespace,此時只要在 collection name 前加上所屬的 namespace 即可,譬如:

Playlist/collname
Collections/collname

6.1. Collection 的用法

如需更多資訊,可見 Collections Concept

7. XMMS2 的設定

8. 參考資料