[Synology NAS] 同步 iTunes 與 Audio Station 音樂播放清單 (新)

2019/03/14 更新 – 使用 Docker

因為個人習慣在電腦上使用 iTunes 整理音樂,在手機使用 Synology Audio Station (DS Audio) 播放音樂,透過 Synology Drive 同步音樂或是直接將 iTunes Library 設在 NAS 都可以達到 iTunes 與 Audio Station 音樂檔案保持同步,可是有個問題,那就是在 iTunes 建立的音樂播放清單如何讓 Synology Audio Station 使用呢?為了解決這個問題我寫了一個 PHP 小程式 (ilx2sasp – iTunes Library XML 2 Synology Audio Station Playlists) 來做轉換的工作。ilx2sasp 可以將 iTunes 音樂播放清單轉成 Audio Station 可用的音樂播放清單,因為 iTunes 本身的原因所以只達到單向同步 (iTunes -> Audio Station) 而無法雙向同步。

這裏簡單說明一下 ilx2sasp 的工作原理,ilx2sasp 只是單純去解析 iTunes Library XML 中的播放清單,跟據 XML 內容將其轉成 Aduio Station 的播放列表格式 m3u 檔案。 繼續閱讀 “[Synology NAS] 同步 iTunes 與 Audio Station 音樂播放清單 (新)”

[Ubuntu] 通用 I/O driver sample code

Ubuntu 18.04

通用型 I/O module source code (Makefile, giodrv.h, giodrv.c),測試程式顯示 Super I/O temperature sensor 温度 (Fintek F71889A):

# Makefile
KVERSION := $(shell uname -r)

obj-m := giodrv.o

all:
	$(MAKE) -C /lib/modules/$(KVERSION)/build M=${PWD} modules

clean:
	$(MAKE) -C /lib/modules/$(KVERSION)/build M=${PWD} clean

繼續閱讀 “[Ubuntu] 通用 I/O driver sample code”

[Ubuntu] 在 user mode 透過 sysfs 控制 gpio sample code

// gpio.h

#ifndef GPIO_H_
#define GPIO_H_

int gpio_is_requested(unsigned int gpio);
int gpio_request(unsigned int gpio);
int gpio_free(unsigned int gpio);
int gpio_direction_input(unsigned int gpio);
int gpio_direction_output(unsigned int gpio, int value);
int gpio_get_value(unsigned int gpio);
int gpio_set_value(unsigned int gpio, int value);

#endif

繼續閱讀 “[Ubuntu] 在 user mode 透過 sysfs 控制 gpio sample code”

[TC++] 在 DOS 下 read/write 4G memory sample code

DOS 下使用 Flat mode 讀寫 4G memory 的 sample code。

所謂 flat mode 就是在主程式執行在 Real Mode 下,可是卻能讀寫 4G memory space的特殊模式,要進入 flat mode 也很簡單,首先先取得 gdt_table 的線性位址 (linear address),將 linear address 填入 gdtr offset 欄位,使用 lgdt 指令載入 gdt table,再來將 cr0 register bit0 設為1進入 protect mode,然後 selector (fs, fs, es, ss…) 選擇 gdt table 中的 data group,再清掉 cr0 register bit0 返回 real mode,以後要讀寫 4G memory space 時就直接使用 fs:[address] 來讀寫即可。

繼續閱讀 “[TC++] 在 DOS 下 read/write 4G memory sample code”

[Ubuntu] Debug card (80 port) driver sample code

要編譯要先安裝 build-essential 與 libelf-dev 套件, build-essential 包含了編譯 C / C++ 所需的套件,lebelf-dev 則包含編譯 driver (kernel module) 所需的程式。

$ sudo apt-get update
$ sudo apt-get install build-essential
$ sudo apt-get install libelf-dev
// debug_card.h
#ifndef _DEBUG_CARD_H_
#define MSG(format, arg...) printk(KERN_INFO "DEBUG CARD: " format "\n", ## arg)
#include <linux/ioctl.h>
#define DEV_MAJOR 121
#define DEV_NAME "debug"
#define DEV_IOCTLID 0xD0
#define IOCTL_WRITE _IOW(DEV_IOCTLID, 10, int)
#define IOCTL_RESET _IOW(DEV_IOCTLID, 0, int)
#endif

繼續閱讀 “[Ubuntu] Debug card (80 port) driver sample code”

[VC] UAC + requireAdministrator + 開機自動執行

在 UAC 開啟的情況下,要開機自動執行需管理管權限的(requireAdministrator) 的程式,必需使用 Windows 的排程設定(schtasks)來啟動程式,才不會在開機時出現 UAC 要求權限的視窗。

範例:

 
void RegAutoRun(bool cmd)
{
  if (cmd == 1)
  {
    //加入啟動排程
    CString str;
    str.Format(L"/Create /F /TN \"AppName\" /SC ONLOGON /RL HIGHEST /TR \"\\\"%s\\App.EXE\\\"\"", GetLaunchDir());
    ShellExecute(NULL, _T("open"), _T("schtasks.exe"), str, _T(""), 0);
  }
 else
 {
  //從排程中移除
  ShellExecute(NULL, _T("open"), _T("schtasks.exe"), _T("/Delete /F /TN \"AppName\""), _T(""), 0);
  }
}

[C++] 函式指標

typedef 傳回值 (*函式指標名稱) (傳遞參數) ;

typedef int (*PFUN) (int x, int y);

int ADD(int x, int y) {
    return x+y;
}

int SUB(int x, int y) {
    return x-y;
}

main()
{
    int n;
    PFUN pf = NULL;

    pf = ADD;
    n = pf(10,5);  //n=15

    pf = SUB;
    n = pf(10, 5); //n=5
}

[VC] 結構的對齊 struct member alignment

compiler為了程式的執行效率,大都會對程式進行最佳化的動作,在結構中則會進行資料對齊以加快執行速度,作業系統、Compiler、CPU都影響資料對齊的邊界 (boundary alignment)。

Wiki – Data structure alignment 說明

來看看這個例子:

 
struct
{
 char c1;  //1 bytes
 char c2;  //1 bytes
 int  i1;  //4 bytes
 char c3;  //1 bytes
}S;

繼續閱讀 “[VC] 結構的對齊 struct member alignment”

[PHP] UTF8 簡繁轉換

UTF-8 最大的一個特點,就是它是一種長度不固定的編碼方式。它可以使用 1~6個 bytes 表示一個字元,根據不同的字元而變化 byte 長度。 

在 2003年11月UTF-8被RFC 3629重新規範,只能使用原來Unicode定義的區域,也就是最多 4 bytes ( U+0000到U+10FFFF )。

UTF-8的編碼規則很簡單,只有二條:

1)對於 1 byte 的字元,byte 的最高 bit 設為 0,後面 7 位為這個字元的 unicode碼。因此對於英語字母來說,UTF-8 編碼和 ASCII 碼是相同的。

繼續閱讀 “[PHP] UTF8 簡繁轉換”

[Synology] Synology Audio Station 歌詞外掛

自己寫的兩個歌詞外掛, 讓 Synology AudioStation 或是 DS Audio 在播放歌曲時可以顯示動態歌詞。

  1. 魔鏡歌詞外掛 (mojim1.0.aum) – 歌詞來源就是魔鏡歌詞網

2. 千千靜聽歌詞外掛 (ttplayer1.0.aum) 是- 歌詞來源為千千靜聽伺服器,外掛會將歌詞自動轉為繁體中文。外掛是參考網路上其他人的發表的歌詞外掛修改而成,因為千千靜聽伺服器會擋台灣 IP,因此加入透過 proxy 來取得歌詞的功能。

繼續閱讀 “[Synology] Synology Audio Station 歌詞外掛”