2017年4月27日 星期四

ALSA

ALSA音频工具amixer,aplay,arecord

ALSA音频工具编译安装
========================================================================
1.官网http://www.alsa-project.org下载alsa-lib和alsa-utils
我的版本:alsa-lib-1.0.27.2.tar.bz2 和alsa-utils-1.0.27.2.tar.bz2
2.创建/home/m/3rd/alsa目录,并在目录下创建install目录,接着把压缩包拷到alsa目录下
3.编译alsa-lib步骤
tar -xvf alsa-lib-1.0.27.2.tar.bz2   
cd alsa-lib-1.0.27.2  
CC=arm-none-linux-gnueabi-gcc ./configure --host=arm-linux  --prefix=/home/m/3rd/alsa/install/  
make  
make install 
4.编译alsa-utils步骤
tar -xvf alsa-utils-1.0.27.2.tar.bz2  
cd alsa-utils-1.0.27.2  
CC=arm-none-linux-gnueabi-gcc ./configure --prefix=/home/m/3rd/alsa/install/ --host=arm-linux --with-alsa-inc-prefix=/home/m/3rd/alsa/install/include --with-alsa-prefix=/home/m/3rd/alsa/install/lib --disable-alsamixer --disable-xmlto --disable-nls  
make  
5.简单说明
--prefix指定了alsa-lib编译后的安装目录,包含库和头文件,编译alsa-utils时候要指明它的库lib和头文件include的目录.
alsamixer是图形化的amixer工具,需要ncurses的支持,在secure CRT中乱码,怕麻烦用--disable-alsamixer禁用了它.
--disable-xmlto和--disable-nls去掉编译都不通过,没去研究为啥.
aplay和arecord是同一个东东改下名字就可以了
复制代码
if (strstr(argv[0], "arecord")) {  
    stream = SND_PCM_STREAM_CAPTURE;  
    file_type = FORMAT_WAVE;  
    command = "arecord";  
    start_delay = 1;  
    direction = stdout;  
} else if (strstr(argv[0], "aplay")) {  
    stream = SND_PCM_STREAM_PLAYBACK;  
    command = "aplay";  
    direction = stdin;  
} else {  
    error(_("command should be named either arecord or aplay"));  
    return 1;  
}  
复制代码
========================================================================
声音录制
======================================================================
arecord帮助提示信息
arecord -l列出声卡和数字音频设备
-D参数用于指定音频设备PCM
以hwx,x开头
根据上面l列出的设备,如果选择tvp5158来录制声音的话那么pcm设备就位hw0,0,如果是tlv320aic3x则pcm设备为hw0,1,sii9135则pcm设备为hw0,2。
声卡号,设备号
-r指定采样频率:5512/8000/11025/16000/22050/32000/44100/48000/64000/88200/96000/176400/192000
-f指定采样格式上面列出了:cd/cdr/dat/S16_LE/S32_LE/...
arecord -D default:CARD=mcasp0 -d 100000   -f cd -t raw mysong15.raw
arecord -D default:CARD=mcasp0 -d 100000   -f dat -t raw mysong10.raw
arecord -D default:CARD=mcasp0 -d 100000   -f S16_LE -r 16000 -t raw mysong10.raw
arecord -Dhw:0,1 -r8000 -f cd /a/1.wmv
arecord -Dhw:0,0 -r8000 -f S16_LE -c 2 /a/1.wmv
arecord -Dhw:0,2 -r48000 -f S32_LE -c 2 /a/1.wmv 
========================================================================
声音播放
========================================================================
aplay帮助提示信息和aplay -l 列出声卡和数字音频设备

-D参数用于指定音频设备PCM
以hwx,x开头
根据上面l列出的设备,如果选择tlv320aic3x来播放声音的话那么pcm设备就位hw0,1,如果是hdmi则pcm设备为hw0,0。
声卡号,设备号
-r指定采样频率:5512/8000/11025/16000/22050/32000/44100/48000/64000/88200/96000/176400/192000
-f指定采样格式上面列出了:cd/cdr/dat/S16_LE/S32_LE/...
aplay -Dhw:0,1 -r8000 -f cd /a/1.wmv
aplay -Dhw:0,1 -r48000 -f cd /a/1.wmv
arecord -Dhw:0,2 -r48000 -f S32_LE -c 2 | aplay -Dhw:0,1 -r48000//一边采集一边播放
========================================================================
简述amixer及其用法
alsamixer是Linux 音频架构ALSA中的Alsa工具的其中一个,用于配置音频的各个参数。
alsamixer是基于文本下的图形界面的,可以通过键盘的上下键,左右键等,很方便地设置需要的音量,开关某个switch(开关)等等操作。
amixer,是alsamixer的文本模式,即命令行模式,需要用amixer命令的形式去配置你的声卡的各个选项。
对于amixer的使用,你首先需要搞懂你要设置的参数是哪些,然后才可能去了解,如何去配置对应的值,整体来说,相对alsamixer来说,是有点繁琐,下面简要介绍其具体用法:
1.查看amixer支持的命令
===================================================================
amixer -h
2.查看可使用的接口
===================================================================
再看看当前你的音频系统(不同的音频驱动对应不同的内容和操作接口)提供了那些供你使用的接口去操作
关于驱动里面已经提供了多少接口可以去操作,可以用命令:
amixer contents
查看,比如:
========================================================================
3.如何去设置某个参数
========================================================================
总结起来就是,先要用get系列命令去看懂有哪些接口,然后再去用set系列的命令,去设置对应你所要设置的值。
查看获取某个设置项的值用amixer cget  +控制参数
根据控制参数类型设置控制参数使用amixer cset +控制参数+" "+参数
想要针对某项设置,比如想要设置上面的的主音量,master volume,即controls中显示的:
numid=5,iface=MIXER,name=’PCM Volume’
那么,可以先看看当前的值:
# amixer cget numid=5,iface=MIXER,name=’PCM Volume’
numid=5,iface=MIXER,name=’PCM Volume’
; type=INTEGER,access=rw—R–,values=2,min=0,max=27,step=0
: values=27,27
| dBscale-min=-40.50dB,step=1.50dB,mute=0
显示的是最大的27,假设想要设置为25,那么就用cset去设置:
# amixer cset numid=5,iface=MIXER,name=’PCM Volume’ 25
numid=5,iface=MIXER,name=’PCM Volume’
; type=INTEGER,access=rw—R–,values=2,min=0,max=27,step=0
: values=25,25
| dBscale-min=-40.50dB,step=1.50dB,mute=0
再比如,去将’Mic Supply 的switch关闭:
# amixer cset numid=12,iface=MIXER,name=’Mic Supply Switch’ Off
numid=12,iface=MIXER,name=’Mic Supply Switch’
; type=ENUMERATED,access=rw——,values=1,items=2
; Item #0 ‘On’
; Item #1 ‘Off’
: values=1
总结一下用法,就是:
amixer cget    controls中所输出的某个参数
amixer cset    controls中所输出的某个参数      具体的值(比如,0,1,On,Off等)
【提示】
同上面介绍的的cget/cset系列命令:
controls        show all controls for given card
contents        show contents of all controls for given card
cset cID P      set control contents for one control
cget cID        get control contents for one control
类似的,还有另外一套sget/sset系列的命令:
scontrols       show all mixer simple controls
scontents       show contents of all mixer simple controls (default command)
sset sID P      set contents for one mixer simple control
sget sID        get contents for one mixer simple control
也是同样做法,比如:
通过查看当然有哪些选择可以控制:
# amixer scontrols
Simple mixer control ‘Master’,0
Simple mixer control ‘Master Mode’,0
Simple mixer control ‘Master Mux’,0
Simple mixer control ‘Master Quality’,0
。。。
同理,amixer scontents,可以查看当前所有的值,具体就不在这列举了。
另外,去查看或者配置用sget,比如:
# amixer sget ‘Microphone Input’,0
Simple mixer control ‘Microphone Input’,0
Capabilities: pswitch pswitch-joined
Playback channels: Mono
Mono: Playback [off]
如果想要修改对应设置,用amixer sset ,具体用法是:
amixer sset sID(控制字符串) P(支持的某个值)
其中sID,就是上面的Simple mixer control后面的那个字符串,比如’Master Mux’,0
而对其设置就是,先看看其提供了哪些供你设置的值:
# amixer sget ‘Master Mux’,0
Simple mixer control ‘Master Mux’,0
Capabilities: enum
Items: ‘Sum’ ‘DAC’ ‘Line’ ‘Mic’
Item0: ‘DAC’
然后比如要设置成Line的,就可以这样:
# amixer sset ‘Master Mux’,0 Line
Simple mixer control ‘Master Mux’,0
Capabilities: enum
Items: ‘Sum’ ‘DAC’ ‘Line’ ‘Mic’
Item0: ‘Line’
=======================================================================
amixer设置音量:
=======================================================================
1.设置声卡0左声道音量为200
amixer cset numid=6,iface=MIXER,name='L ADC VOLUME' 200
2.获取声卡0左声道音量值
root@dvr:~# amixer cget numid=6,iface=MIXER,name='L ADC VOLUME'
numid=6,iface=MIXER,name='L ADC VOLUME'
  ; type=INTEGER,access=rw------,values=1,min=0,max=255,step=0
  : values=200
3.设置声卡0右声道音量为200
amixer cset numid=5,iface=MIXER,name='PCM Volume' 200
4.获取声卡0右声道音量值值
root@dvr:~# amixer cget numid=5,iface=MIXER,name='PCM Volume'
numid=5,iface=MIXER,name='R ADC VOLUME'
  ; type=INTEGER,access=rw------,values=1,min=0,max=255,step=0
  : values=200
5.设置声卡1右声道音量为200
amixer -c 1 cset numid=5,iface=MIXER,name='PCM Volume' 200
6.获取声卡1右声道音量值
root@dvr:~# amixer -c 1 cget numid=5,iface=MIXER,name='PCM Volume'
numid=5,iface=MIXER,name='R ADC VOLUME'
  ; type=INTEGER,access=rw------,values=1,min=0,max=255,step=0
  : values=200
7.设置声卡1左声道音量为200
amixer -c 1 cset numid=6,iface=MIXER,name='L ADC VOLUME' 200
8.获取声卡1左声道音量值
root@dvr:~# amixer -c 1 cget numid=6,iface=MIXER,name='L ADC VOLUME'
numid=6,iface=MIXER,name='L ADC VOLUME'
  ; type=INTEGER,access=rw------,values=1,min=0,max=255,step=0
  : values=200
========================================================================

[Ubuntu] 網路設定 - 於 DHCP 環境下重新取得 IP

原文:http://note.drx.tw/2010/10/network-dhcp.html
正常而言,不管是插上網路線或者是連上無線網路時 X Window 都會自動尋找 DHCP Server 並自動取得 IP;若取得失敗,可透過簡單的指令重新跟 DHCP Server 討 IP,但前題是在同一個區網(LAN)裡有台 DHCP Server 才行。

在開始之前得先了解所謂的網路裝置代號,舉例來說,一般 PC 只有一張 Ethernet 網卡,那代號必為 eth0,而 Server 這種有第二張網卡的設備就會多了一個 eth1;但 Notebook 除了有線網路(eth0)以外,還會有張無線網卡,這時就可能為 wlan0 或 eth1,不確定的伙伴可以使用 ifconfig 指令來察看網卡相關資訊。

1. 有線網路:學術網路、IP 分享器、無線基地台
jonny@linux ~ ]
$ sudo dhclient eth0 Enter

2. 無線網路:無線基地台。
jonny@wheezy ~ ]
$ sudo dhclient wlan0 Enter

# 一般無線網卡的裝置代號為 wlan0 或 eth1。

[Ubuntu] NTP網路校時

原文:https://gavaee.wordpress.com/2010/10/27/ubuntuntp%E7%B6%B2%E8%B7%AF%E6%A0%A1%E6%99%82/
  • 整理一下NTP Client,NTP Server建置及Linux有關時間的一些資料。

Linux與時間有關的指令

  • /bin/date
    顯示Linux系統日期及時間
    # date MMDDhhmmYYYY
  • /sbin/hwclock
    這是一個 root 才能執行的指令,因為 Linux 系統上面 BIOS 時間與 Linux 系統時間是分開的,所以使用 date 這個指令調整了時間之後,還需要使用 hwclock 才能將修改過後的時間寫入 BIOS 當中!
    # hwclock -r  顯示BIOS內的時間
    # hwclock -w  將系統時間寫入BIOS
  • /usr/share/zoneinfo
    Linux系統提供的世界主要時區的時間設定檔,如:/usr/share/zoneinfo/Asia/Taipei即為台灣時時區檔
  • /etc/localtime
    Linux系統實際使用的時區檔,從/usr/share/zoneinfo內複製過來,所以若要變更時區,只要到…../zoneinfo內把需要的時區檔複到這裡並改名成localtime即可

NTP Client操作

  • # sudo ntpdate time.stdtime.gov.tw
    立即與time.stdtime.gov.tw校時,使用前須先停用ntpd
    同步結果:
    27 Oct 21:55:46 ntpdate[2683]: adjust time server 192.168.255.130 offset -0.023068 sec
  • 校時後,建議執行hwclock -w

NTP Server操作

  • 時間基本概念:
    • GMT:格林威治時間為標準時間(Greenwich Mean Time, GMT 時間)
    • UTC:協和標準時間(Coordinated Universal Time, UTC時間),用原子鐘(Atomic Clock)為基準所定義出來的正確時間
    • UTC 標準時間是以 GMT 這個時區為主,所以本地時間與 UTC 時間的時差就是本地時間與 GMT 時間的時差
    • 電腦的 BIOS 內部就含有一個原子鐘在紀錄與計算時間的進行!不過由於原子鐘主要是利用計算晶片 (crystal) 的原子震盪週期去計時的,且每種晶片都有自己的獨特的震盪週期,因為不同的晶片震盪週期多多少少都會有點差異性, 甚至同一批晶片也可能會或多或少有些許的差異(就連溫度也可能造成這樣的誤差呢!),因此也就造成了 BIOS 的時間會三不五時的給他快了幾秒或者慢了幾秒
  • NTP Server基本概念:
    • NTP Server使用Port 123 UDP封包,可用# netstat -tlunp觀察
    • 台灣常見的 Time Server 有:
      • tock.stdtime.gov.tw
      • time.stdtime.gov.tw
      • clock.stdtime.gov.tw
      • freq_f.stdtime.gov.tw
      • tick.stdtime.gov.tw
    • NTP與DNS一樣有階層概念,第一層NTP Server叫stratum-1,第二層叫stratum-2依此類推,共可建立15層!
    • 台灣stratum-2:
      • tock.stdtime.gov.tw (prefer)
      • tick.stdtime.gov.tw
      • time.stdtime.gov.tw
    • NTP Server套件
      • ntp
        NTP Server主要套件
      • tzdata
        時區套件
  • NTP 檔案:
    • /etc/ntp.conf
      NTP Server的設定檔
    • /usr/sbin/ntpd
      NTP Server主要daemon
    • /etc/init.d/ntp star/stop/restart
      啟動NTP Service的Script
    • /usr/sbin/ntptrace
      追蹤某部時間伺服器的時間對應關係

ntp.conf設定檔

  • 主要內容
    driftfile /var/lib/ntp/ntp.driftserver tock.stdtime.gov.tw prefer
    server tick.stdtime.gov.tw
    server time.stdtime.gov.tw
    restrict default nomodify notrap noquery
    restrict 192.168.100.11            <==底下這三行在開放主機進入的權限
    restrict 192.168.200.11
    restrict 192.168.210.11
    restrict 127.0.0.1       mask 255.0.0.0          <==內部與 LAN 的使用權限
    restrict 192.168.1.0  mask 255.255.255.0   nomodify    <==192.168.1.0網段可校時,但不能修改
  • driftfile /var/lib/ntp/ntp.drift
    • 紀錄本機時間與上層NTP Server的時間差異(本機時間預設依據BIOS計算而來)
    • driftfile 後面接的檔案需要使用完整路徑檔名
    • 該檔案不能是連結檔
    • 該檔案需要設定成 ntpd 這個 daemon 可以寫入的權限
    • 該檔案所記錄的數值單位為:百萬分之一秒 (ppm)
  • server [IP or hostname] [prefer]
    • 設定上層 NTP 伺服器
    • perfer 表示『優先使用』的主機
  • restrict [你的IP] mask [netmask_IP] [parameter]
    • 用restrict控制存取權限
    • 參數:
      • ignore
        拒絕所有類型的 NTP 連線
      • nomodify
        用戶端不能更改 NTP 伺服器的時間參數,這即表示用戶端不能使用 ntpc 與 ntpq 這兩支程式來修改伺服器囉。 但用戶端仍可透過這部主機來進行網路校時的
      • noquery
        用戶端不能夠使用 ntpq, ntpc 等指令來查詢時間伺服器,等於不提供 NTP 的網路校時囉
      • notrap
        不提供 trap 這個遠端事件登錄 (remote event logging) 的功能
      • notrust
        拒絕沒有認證的用戶端
      • 若沒有在 parameter 的地方加上任何參數的話,這表示『該 IP 或網段不受任何限制』的意思喔
      • 通常會先關閉 NTP 的使用權限,然後在一個一個的啟用允許登入的網段
      • restrict更多說明:ntpd access restrictions

啟動/重開/停止NTP Server

  • 啟動:# sudo /etc/init.d/ntp start
  • 重開:# sudo /etc/init.d/ntp restart
  • 停止:# sudo /etc/init.d/ntp stop

NTP指令

  • # netstat -tlunp
    主要看UDP 123的port
  • # netstat
    synchronised to NTP server (10.252.0.200) at stratum 3
       time correct to within 84 ms
       polling server every 1024 s
    表示本機對10.252.0.200校時,校正了84 ms時間,每1024秒校正一次
  • # ntptrace
    localhost: stratum 3, offset -0.002099, synch distance 0.171925
    tock.stdtime.gov.tw: stratum 2, offset 0.002473, synch distance 0.136901
    192.5.41.41: stratum 1, offset 0.000005, synch distance 0.000000, refid ‘USNO’
    列出目前我們的 NTP 伺服器與上層 NTP 伺服器彼此之間的關係
    由於我們已經和第二層連接上,但第二層與第一層就不是我們能管理的,所以若出現第一層time out也是正常的
  • # ntpq -p
    remote           refid      st t when poll reach   delay   offset  jitter
    ==============================================================================
    *tock.stdtime.go 192.5.41.41      2 u   16   64  377   30.108    1.177   6.881
    +tick.stdtime.go 129.6.15.29      2 u   14   64  377   31.045   -6.446   6.410
    +time.stdtime.go 192.5.41.41      2 u    6   64  347   29.788   -1.144   8.233 列出目前我們的 NTP 與相關的上層 NTP 的狀態
  • ntpq -p欄位定義
    • remote:亦即是 NTP 主機的 IP 或主機名稱囉~注意最左邊的符號, 如果有『+』代表目前正在作用當中的上層 NTP ,如果是『*』代表也有連上線,不過是作為次要連線的 NTP 主機。
    • refid:參考的上一層 NTP 主機的位址
    • st:就是 stratum 階層囉!
    • when:幾秒鐘前曾經做過時間同步化更新的動作;
    • poll:下一次更新在幾秒鐘之後;
    • reach:已經向上層 NTP 伺服器要求更新的次數
    • delay:網路傳輸過程當中延遲的時間,單位為 10^(-6) 秒
    • offset:時間補償的結果,單位與 10^(-3) 秒
    • jitter:Linux 系統時間與 BIOS 硬體時間的差異時間, 單位為 10^(-6) 秒。