日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux 音频开发之入门篇

發布時間:2023/12/31 linux 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux 音频开发之入门篇 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

? ? ? 其實為什么要采用兩種框架呢?這里就不做記錄了。只關心不同的應用場景。

? ? 從編程易用性上來講,OSS倒是簡便,然而發現ubuntu上默認不配置OSS,導致連相關設備節點都沒有。因而不得不采用ALSA,此編程接口比較啰嗦。

? ? ? 根據 arch OSS的wiki??Open Sound System - ArchWiki (archlinux.org)? ? ? 兩者的比較優缺點主要:(順便說句arch的wiki資料比較齊全?)

OSS Advantages (users)

  • Per-application volume control.
  • Some legacy (i.e. before 2002) cards can have better support.

OSS Advantages (developers)

  • Support for drivers in userspace.
  • Cross-platform (OSS runs on BSDs and Solaris).
  • Smaller and easier to use API. (這點筆者在實際使用中感受很深,主要了解清楚哪些ioctl干啥的就可以,符合驅動的編寫思路)

ALSA advantages over OSS

  • Better support for USB audio devices.
  • Support for Bluetooth audio devices.
  • Support for?AC'97?and?HD Audio?dial-up soft-modems such as Si3055.
  • Better support for MIDI devices.
  • Support for suspend.
  • Better support for jack detection.
  • Better support for modern hardware.

Note:

  • OSS has experimental output support for USB audio devices, but no input.
  • OSS supports MIDI devices with the help of a software synthesizer such as?Timidity?or?FluidSynth.

聲道

? ? ?什么是聲道? 其是個硬件概念還是軟件概念?

? ? ?最終聲道需要由物理接口輸出。而數據的產生則由軟件控制。

? ? ? 聲音的傳播分為不同頻率。一個聲卡的聲音輸出可以支持不同的頻率。例如前聲道輸入44K,后聲道輸出8K。數字數據交錯存儲在內存中,聲卡在取出數據后,將數據分別送往不同的聲道,產生不同的聲音。

? ? 寫到這里,其實交錯存儲的數據,是否也存在這種情況?即由于采用頻率不同,導致每個聲道的數據長度不一致,進而占用的空間數量不同。例如下面這種情況: 三個L數據后,才是一個R數據?

? ?

硬件接口

音頻的基本框架

編程接口

linux 下音頻編程的接口分為兩種OSS和ALSA,這是老生常談的。

OSS接口

官網說明??OSS v4.x API reference - Developing applications for Open Sound System version 4.1

通過 open? write read mmap等系統調用進行訪問。

?設備節點

?為了通過open 等相關接口對設備進行控制,首先要知道其設備節點。根據

OSS v4.x API reference - Device types supported by OSS (opensound.com)

?我們可以知道,OSS支持三種設備類型:

Open Sound System supports three kind of devices:

  • Audio devices are used to play and record digital audio such as WAV or MP3 files. See the "Audio Programming" chapter for more info. 控制音頻的輸入和輸出。也就是數據通道!此類設備對應/dev/dsp? /dev/dsp1等。此處每次重新上電后,/dev/dsp? /dev/dsp1實際對應的物理設備會發生變化!在打開設備后,我們要先查詢此設備的具體信息 ,再進行操作。
  • Mixer devices are used to change volumes and all kind of "control panel" settings. See the "OSS Mixer Programming" chapter for more info. 用于調節音量,對應的設備節點為/dev/mixer等。
  • MIDI port devices are used to access musical instruments (keyboards, samplers and synthesizer modules) as well as to control various other devices such as mixers, effect processors, on stage lightning and pyrotecnics. See the "OSS MIDI Programming" chapter for more info

IOCTL接口

參考連接:?OSS v4.x API reference - The ioctl() system call (opensound.com)

?連接中介紹各個ioctl,例如筆者想要確認當前卡的信息,可以采用

示例:?OSS v4.x API reference - The ossinfo program that is included in the OSS package. (opensound.com)

在實際使用過程中,查閱是否有合適的接口。

ALSA接口

設備節點

ALSA Library API - AlsaProject (alsa-project.org)? 根據ALSA wiki介紹,設備節點為:

he currently designed interfaces are listed below:

  • Information Interface (/proc/asound)
  • Control Interface (/dev/snd/controlCX)
  • Mixer Interface (/dev/snd/mixerCXDX)
  • PCM Interface (/dev/snd/pcmCXDX)
  • Raw MIDI Interface (/dev/snd/midiCXDX)
  • Sequencer Interface (/dev/snd/seq)
  • Timer Interface (/dev/snd/timer
  • 這里存在的問題,我們并不是是對這些設備節點進行訪問來進行錄音及播放,而是采用例如 default? 或者?plughw:0,0 等作為參數,而這些具體對應哪個物理設備,是不是我們期望的設備?這就又增加了一層不友好的屏蔽。

    例如在參考資料3)中的例程中,默認打開default設備,在x86虛擬機上運行正常;但是交叉編譯到arm嵌入式環境就不能運行,打開設備錯誤。而改成plughw:0,0就能正常打開了。

    ----》》》可以通過lsof命令查看當前哪些進程會操作上述設備節點:

    lsof |grep snd/cpulseaudi 1150 gdm 32u CHR 116,6 0t0 448 /dev/snd/controlC0 pulseaudi 1150 gdm 39u CHR 116,6 0t0 448 /dev/snd/controlC0 snapd-gli 1150 1202 gdm 32u CHR 116,6 0t0 448 /dev/snd/controlC0 snapd-gli 1150 1202 gdm 39u CHR 116,6 0t0 448 /dev/snd/controlC0 alsa-sink 1150 1338 gdm 32u CHR 116,6 0t0 448 /dev/snd/controlC0 alsa-sink 1150 1338 gdm 39u CHR 116,6 0t0 448 /dev/snd/controlC0 alsa-sour 1150 1356 gdm 32u CHR 116,6 0t0 448 /dev/snd/controlC0 alsa-sour 1150 1356 gdm 39u CHR 116,6 0t0 448 /dev/snd/controlC0

    信息接口設備節點示例:

    1)獲取單板上的卡的數目及名稱

    cat /proc/asound/cards0 [audiocodec ]: audiocodec - audiocodecaudiocodec1 [sndhdmi ]: sndhdmi - sndhdmisndhdmi

    ?2)獲取某塊聲卡的軟硬件參數??梢钥吹侥壳坝布禌]有配置,沒有在使用此聲卡。

    cat /proc/asound/card0/pcm0p/info 播放參數 card: 0 device: 0 subdevice: 0 stream: PLAYBACK id: SUNXI-CODEC sun8iw11codec-0 name: subname: subdevice #0 class: 0 subclass: 0 subdevices_count: 1 subdevices_avail: 1 root@T3/A40i-Tronlong:~# cat /proc/asound/card0/pcm0p/sub0/ hw_params info status sw_params root@T3/A40i-Tronlong:~# cat /proc/asound/card0/pcm0p/sub0/hw_params 硬件參數 closed

    當運行speaker-test 命令再查看硬件參數信息如下:

    cat /proc/asound/card0/pcm0p/sub0/statusstate: RUNNING owner_pid : 3829 (當前進程信息都有) trigger_time: 5889.590491875 tstamp : 0.000000000 delay : 32768 avail : 0 avail_max : 24576 ----- hw_ptr : 15196160 appl_ptr : 15228928$ cat /proc/asound/card0/pcm0p/sub0/hw_paramsaccess: RW_INTERLEAVED format: S16_LE subformat: STD channels: 1 rate: 48000 (1572864000/32768) period_size: 8192 buffer_size: 32768

    設備名稱

    ALSA 分了幾層,每層都有一個設備名稱,通過配置文件指定其下一層的具體設備信息

    通過配置文件建立關聯。(配置文件示例及分層結構待補充

    如果沒有配置文件,則直接指定物理設備,類似于下面 -D后的參數:

    aplay -t raw -r 8000 -q -D hw:/dev/snd/controlC0 -f u8 -c 1

    open接口

    ? 參數含義: 這里最難以填寫的參數是 name。針對播放錄音,很多例程都填寫default,在我們實際測試中,也可以填寫?plughw:0,0? 和 hw:/dev/snd/controlC0。

    ? ? 但是不能填寫?hw:/dev/snd/pcmC0D0p,填寫此設備節點時,運行時報錯:?
    ALSA lib pcm_hw.c:1713:(_snd_pcm_hw_open) Invalid value for card
    unable to open pcm device: Inappropriate ioctl for device

    這里理論上這個節點是pcm 的播放節點,理論上設置這個才OK的嘛!!一團糟糕的設計!!!

    snd_pcm_open() int snd_pcm_open ( snd_pcm_t ** pcmp, const char * name, snd_pcm_stream_t stream, int mode ) Opens a PCM.Parameters pcmp Returned PCM handle name ASCII identifier of the PCM handle stream Wanted stream mode Open mode (see SND_PCM_NONBLOCK, SND_PCM_ASYNC) Returns 0 on success otherwise a negative error code Examples /test/latency.c, /test/pcm.c, and /test/pcm_min.c.

    常見錯誤

    ? ? ? 設備可以打開play ,但是打開record時失敗,由如下代碼知,錯誤信息為resource busy,即設備被占用。

    if ((err = snd_pcm_open (&handle,"hw:/dev/snd/controlC0" , type, 0)) < 0) {fprintf (stderr, "cannot open (%s)\n",snd_strerror (err));return NULL;}

    ? ? ? 這時,由于我們還不熟悉,以為第二個參數傳遞的有問題,實際上是由于代碼中存在while死循環一直接收數據或者發生數據,在用戶按ctrl+C時,沒有調用接口釋放 設備節點導致。

    獲取硬件參數能力值

    ? ?不能配置不在能力范圍內的值。

    ? 具體接口參數? 待補充!!!!!!!!!!!!!!!

    配置硬件參數

    硬件參數包括(參考資料3 中描述)

    采樣率 Rate

    ?An analog-to-digital converter (ADC) converts the analog voltages into discrete values, called samples, at regular intervals in time, known as the sampling rate

    ?樣本長度 Format

    The size of the samples, expressed in bits, is one factor that determines how accurately the sound is represented in digital form

    采用用多少位數據表示,部分宏定義如下圖,詳細的參見:?ALSA project - the C library reference: PCM Interface (alsa-project.org)

    參數需要硬件支持,例如在T3板子上配置U8,則提示配置不了。而在X86虛擬機上則配置正常。

    強行配置U8,報如下錯誤:

    cannot set sample format (Invalid argument)

    那么通過哪個接口來獲取當前硬件支持的情況呢?!!
    ?

    問題:不同的采樣率 是否需要不同的采樣數據長度?例如44.1K的采樣是否能用 8位數據表示?

    ?通道數 Channels

    我們常說的左聲道、右聲道,可以理解為左右各來一個 mic 采樣,左 mic 采樣出來的樣本就是左聲道數據,右邊 mic 采樣出來的樣本就是右聲道數據。而一個音頻既可以只有1個聲道,也可以有左右兩個聲道,后者也稱為立體聲。而這個音頻究竟有幾個聲道,就是我們說的通道數。

    ?幀 Frame

    我們每一次采樣出來的結果,就是一幀。很明顯,一幀數據有多大,取決于我們采樣的精度以及通道數。

    ?交錯模式 Interleaved

    我們每一次采樣出的音頻幀,怎么保存呢?提供了兩種保存思路,也就是我們說的交錯模式和非交錯模式。我們常用的也是交錯模式。

    周期 Period

    我們總不可能一次處理1幀數據吧,太低效了,那就做成批量處理吧。而一次處理多少幀就是我們說的周期。

    一次周期結束切到下一次周期,都是需要額外處理損耗的,就類似于進程切換。周期大,一次處理數據量就多,每次連續處理時間長,切換損耗就少,但也因為數據要滿一個周期后才處理,導致數據處理延時長。反之,如果周期設置的小,延時短了,但周期切換更頻繁,損耗就更大,更容易出現卡頓。

    緩存大小 Buffer Size

    這里說的是 alsa 底層 DMA 搬運數據的緩存大小,這是一個環形的緩存空間。我們設置 DMA 一次連續搬運 1 個周期的數據,搬運期間如果又來數據怎么辦?我們就需要更大的緩存空間來保存更多的數據。緩存空間往往是周期的整數倍,例如設置了緩存 8 個周期,每個周期 6000 幀,那么最多可以緩存 8 * 6000 = 48000 幀的數據。

    系統命令

    OSS shell命令

    ossinfo

    ALSA shell命令

    root執行報錯問題

    錯誤信息類似:

    ./x86csdn MoTTY X11 proxy: Unsupported authorisation protocol xcb_connection_has_error() returned true XDG_RUNTIME_DIR (/run/user/1000) is not owned by us (uid 0), but by uid 1000! (This could e g happen if you try to connect to a non-root PulseAudio as a root user, over the native protocol. Don't do that.) ALSA lib pcm_dsnoop.c:618:(snd_pcm_dsnoop_open) unable to open slave cannot open for capture

    pulseaudio來管理音頻設備的,而pulseaudio不允許在root用戶下運行,這樣會導致安全問題。

    解決方法:跨用戶調用命令 【可用】

    su - username -c "aplay sample.wav"

    ?同樣的命令,root下直接./x86csdn報如上錯誤。而采用如下形式就可以正常運行了!!?

    su - xiehj -c "/home/user/sound/x86csdn"

    amixer

    音量調控

    1)amixer ?info
    Card default 'audiocodec'/'audiocodec'
    ? Mixer name ? ?: ''
    ? Components ? ?: ''
    ? Controls ? ? ?: 48
    ? Simple ctrls ?: 48

    子命令

    Available commands:
    ? 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
    ? controls ? ? ? ?show all controls for given card? (是否mixer simple controls只是controls中的一個類型?!
    ? 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
    root@T3/A40i-Tronlong:~# amixer scontrols (此命令輸出與controls命令輸出類似)
    Simple mixer control 'Headphone',0
    Simple mixer control 'Headphone volume',0
    Simple mixer control 'FM gain volume',0
    Simple mixer control 'Phone Out Mixer LOMIX',0
    Simple mixer control 'Phone Out Mixer MIC1 Boost',0
    Simple mixer control 'Phone Out Mixer MIC2 Boost',0
    Simple mixer control 'Phone Out Mixer ROMIX',0
    Simple mixer control 'Phoneout Speaker',0
    Simple mixer control 'ADC gain volume',0
    Simple mixer control 'HPL Mux',0
    Simple mixer control 'HPR Mux',0
    Simple mixer control 'LINEIN Mixer volume',0
    Simple mixer control 'LINEIN gain volume',0
    Simple mixer control 'Left Input Mixer FML',0
    Simple mixer control 'Left Input Mixer LINEINL',0
    Simple mixer control 'Left Input Mixer LINEINLR',0
    Simple mixer control 'Left Input Mixer LOMIX',0
    Simple mixer control 'Left Input Mixer MIC1 Boost',0
    Simple mixer control 'Left Input Mixer MIC2 Boost',0
    Simple mixer control 'Left Input Mixer ROMIX',0
    Simple mixer control 'Left Output Mixer DACL',0
    Simple mixer control 'Left Output Mixer DACR',0
    Simple mixer control 'Left Output Mixer FML',0
    Simple mixer control 'Left Output Mixer LINEINL',0
    Simple mixer control 'Left Output Mixer LINEINLR',0
    Simple mixer control 'Left Output Mixer MIC1 Boost',0
    Simple mixer control 'Left Output Mixer MIC2 Boost',0
    Simple mixer control 'MIC gain volume',0
    Simple mixer control 'MIC1 boost volume',0
    Simple mixer control 'MIC2 Mux',0
    Simple mixer control 'MIC2 boost volume',0
    Simple mixer control 'Right Input Mixer FMR',0
    Simple mixer control 'Right Input Mixer LINEINLR',0
    Simple mixer control 'Right Input Mixer LINEINR',0
    Simple mixer control 'Right Input Mixer LOMIX',0
    Simple mixer control 'Right Input Mixer MIC1 Boost',0
    Simple mixer control 'Right Input Mixer MIC2 Boost',0
    Simple mixer control 'Right Input Mixer ROMIX',0
    Simple mixer control 'Right Output Mixer DACL',0
    Simple mixer control 'Right Output Mixer DACR',0
    Simple mixer control 'Right Output Mixer FMR',0
    Simple mixer control 'Right Output Mixer LINEINLR',0
    Simple mixer control 'Right Output Mixer LINEINR',0
    Simple mixer control 'Right Output Mixer MIC1 Boost',0
    Simple mixer control 'Right Output Mixer MIC2 Boost',0
    Simple mixer control 'codec hub mode',0
    Simple mixer control 'digital volume',0
    Simple mixer control 'phoneout volume',0
    root@T3/A40i-Tronlong:~# amixer controls (如果支持其他iface,可能會和scontrols的輸出有所不同。那么這些controls具體有物理器件對應?
    numid=3,iface=MIXER,name='Headphone volume'
    numid=47,iface=MIXER,name='Headphone Switch'
    numid=5,iface=MIXER,name='FM gain volume'
    numid=15,iface=MIXER,name='Phone Out Mixer LOMIX Switch'
    numid=18,iface=MIXER,name='Phone Out Mixer MIC1 Boost Switch'
    numid=17,iface=MIXER,name='Phone Out Mixer MIC2 Boost Switch'
    numid=16,iface=MIXER,name='Phone Out Mixer ROMIX Switch'
    numid=48,iface=MIXER,name='Phoneout Speaker Switch'
    numid=11,iface=MIXER,name='ADC gain volume'
    numid=13,iface=MIXER,name='HPL Mux'
    numid=14,iface=MIXER,name='HPR Mux'
    numid=4,iface=MIXER,name='LINEIN Mixer volume'
    numid=6,iface=MIXER,name='LINEIN gain volume'
    numid=28,iface=MIXER,name='Left Input Mixer FML Switch'
    numid=29,iface=MIXER,name='Left Input Mixer LINEINL Switch'
    numid=30,iface=MIXER,name='Left Input Mixer LINEINLR Switch'
    numid=27,iface=MIXER,name='Left Input Mixer LOMIX Switch'
    numid=32,iface=MIXER,name='Left Input Mixer MIC1 Boost Switch'
    numid=31,iface=MIXER,name='Left Input Mixer MIC2 Boost Switch'
    numid=26,iface=MIXER,name='Left Input Mixer ROMIX Switch'
    numid=41,iface=MIXER,name='Left Output Mixer DACL Switch'
    numid=40,iface=MIXER,name='Left Output Mixer DACR Switch'
    numid=42,iface=MIXER,name='Left Output Mixer FML Switch'
    numid=43,iface=MIXER,name='Left Output Mixer LINEINL Switch'
    numid=44,iface=MIXER,name='Left Output Mixer LINEINLR Switch'
    numid=46,iface=MIXER,name='Left Output Mixer MIC1 Boost Switch'
    numid=45,iface=MIXER,name='Left Output Mixer MIC2 Boost Switch'
    numid=7,iface=MIXER,name='MIC gain volume'
    numid=9,iface=MIXER,name='MIC1 boost volume'
    numid=12,iface=MIXER,name='MIC2 Mux'
    numid=10,iface=MIXER,name='MIC2 boost volume'
    numid=21,iface=MIXER,name='Right Input Mixer FMR Switch'
    numid=23,iface=MIXER,name='Right Input Mixer LINEINLR Switch'
    numid=22,iface=MIXER,name='Right Input Mixer LINEINR Switch'
    numid=19,iface=MIXER,name='Right Input Mixer LOMIX Switch'
    numid=25,iface=MIXER,name='Right Input Mixer MIC1 Boost Switch'
    numid=24,iface=MIXER,name='Right Input Mixer MIC2 Boost Switch'
    numid=20,iface=MIXER,name='Right Input Mixer ROMIX Switch'
    numid=33,iface=MIXER,name='Right Output Mixer DACL Switch'
    numid=34,iface=MIXER,name='Right Output Mixer DACR Switch'
    numid=35,iface=MIXER,name='Right Output Mixer FMR Switch'
    numid=37,iface=MIXER,name='Right Output Mixer LINEINLR Switch'
    numid=36,iface=MIXER,name='Right Output Mixer LINEINR Switch'
    numid=39,iface=MIXER,name='Right Output Mixer MIC1 Boost Switch'
    numid=38,iface=MIXER,name='Right Output Mixer MIC2 Boost Switch'
    numid=1,iface=MIXER,name='codec hub mode'
    numid=2,iface=MIXER,name='digital volume'
    numid=8,iface=MIXER,name='phoneout volume'

    amixer 設備選擇示例

    ? ?例如針對一個聲卡設備,其設備節點為/dev/snd/controlC0,即支持front microphone 又支持rear microphone,也就是存在兩個capture設備。那么我們如何選擇其中一個呢?

    ? ? 讓我們再來看下mixer的功能:

    • Mixer interface: controls the devices on sound cards that route signals and control volume levels. It is built on top of the control interface.

    ? ? ?此處講明了 mixer 除了控制音量的功能,還有一個控制信號路由的功能,用此功能,我們可以選擇具體哪個設備對應 /dev/snd/controlC0的capture 功能。

    ? ? 示例:

    ? ? ?1) 首先查詢當前mixer的信息? ? ??

    amixer contents 通過如下命令的輸出,我們可以看到 input source 對應又兩個選項: front mic和rear mic 而values = 1,表示此時采用rear mic numid=10,iface=MIXER,name='Input Source'; type=ENUMERATED,access=rw------,values=1,items=2; Item #0 'Front Mic'; Item #1 'Rear Mic': values=1numid=17,iface=MIXER,name='Rear Mic Boost Volume'; type=INTEGER,access=rw---R--,values=2,min=0,max=3,step=0: values=2,2| dBscale-min=0.00dB,step=10.00dB,mute=0numid=16,iface=MIXER,name='Front Mic Boost Volume'; type=INTEGER,access=rw---R--,values=2,min=0,max=3,step=0: values=0,0| dBscale-min=0.00dB,step=10.00dB,mute=0

    2) 更改輸入硬件源:

    amixer cset numid=10 0 最后一個參數即選項的索引numid=10,iface=MIXER,name='Input Source'; type=ENUMERATED,access=rw------,values=1,items=2; Item #0 'Front Mic'; Item #1 'Rear Mic': values=0

    音量調節示例

    ? 英文漢語

    volume

    音量
    unmute取消靜音

    amixer -c 1 sset Line,0 80%,40% unmute cap

    will set the second soundcard's left line input volume to 80% and right line input to 40%, unmute it, and select it as a source for capture (recording).

    這里 Line,0 表示左側輸入音量,那么右側輸入音量是Line,1 ?

    amixer -c 1 -- sset Master playback -20dB

    will set the master volume of the second card to -20dB. If the master has multiple channels, all channels are set to the same value.

    amixer -c 1 set PCM 2dB+

    will increase the PCM volume of the second card with 2dB. When both playback and capture volumes exist, this is applied to both volumes.

    amixer -c 2 cset iface=MIXER,name='Line Playback Volume",index=1 40%

    will set the third soundcard's second line playback volume(s) to 40%

    amixer -c 2 cset numid=34 40%

    will set the 34th soundcard element to 40%

    音量調節實戰

    環境基于ubuntu 虛擬機 x86

    amixer info
    Card default 'AudioPCI'/'Ensoniq AudioPCI ENS1371 at 0x2040, irq 16'
    ? Mixer name ? ?: 'Cirrus Logic CS4297A rev 3'
    ? Components ? ?: 'AC97a:43525913'
    ? Controls ? ? ?: 26
    ? Simple ctrls ?: 13

    amixer scontents
    Simple mixer control 'Master',0
    ? Capabilities: pvolume pswitch pswitch-joined
    ? Playback channels: Front Left - Front Right
    ? Limits: Playback 0 - 63
    ? Mono:
    ? Front Left: Playback 63 [100%] [0.00dB] [on]
    ? Front Right: Playback 63 [100%] [0.00dB] [on]
    Simple mixer control 'PCM',0
    ? Capabilities: pvolume pswitch pswitch-joined
    ? Playback channels: Front Left - Front Right
    ? Limits: Playback 0 - 63
    ? Mono:
    ? Front Left: Playback 48 [76%] [37.50dB] [on]
    ? Front Right: Playback 48 [76%] [37.50dB] [on]
    Simple mixer control 'Line',0
    ? Capabilities: pvolume pswitch pswitch-joined cswitch cswitch-exclusive
    ? Capture exclusive group: 0
    ? Playback channels: Front Left - Front Right
    ? Capture channels: Front Left - Front Right
    ? Limits: Playback 0 - 63
    ? Front Left: Playback 0 [0%] [-34.50dB] [off] Capture [off]
    ? Front Right: Playback 0 [0%] [-34.50dB] [off] Capture [off]

    初始音量信息

    ?

    更改音量操作

    在圖形界面更改音量,然后通過命令查詢

    amixer scontents,通過命令可以看到pcm的音量值發生變化,
    Simple mixer control 'Master',0
    ? Capabilities: pvolume pswitch pswitch-joined
    ? Playback channels: Front Left - Front Right
    ? Limits: Playback 0 - 63
    ? Mono:
    ? Front Left: Playback 63 [100%] [0.00dB] [on]
    ? Front Right: Playback 63 [100%] [0.00dB] [on]
    Simple mixer control 'PCM',0
    ? Capabilities: pvolume pswitch pswitch-joined
    ? Playback channels: Front Left - Front Right
    ? Limits: Playback 0 - 63
    ? Mono:
    ? Front Left: Playback 56 [89%] [49.50dB] [on]
    ? Front Right: Playback 56 [89%] [49.50dB] [on]
    ?

    輸入音量的控制

    注意下面這個圖,和上面輸入音量的截圖相比,設備也更換了,因為microphone這個設備調節了后,命令查不出改變。

    Simple mixer control 'Capture',0
    ? Capabilities: cvolume cswitch cswitch-joined
    ? Capture channels: Front Left - Front Right
    ? Limits: Capture 0 - 15
    ? Front Left: Capture 4 [27%] [6.00dB] [on]
    ? Front Right: Capture 4 [27%] [6.00dB] [on]
    ?

    經過上述的實戰,我們依然不能明了當前系統使用的是哪個設備!!

    不過對于某開發板:

    ?其絲印標識 H/P OUT? 和LINE IN ,看起來可以和amixer 獲取到的上圖信息對應。

    master、PCM等的關系

    ?調節不同節點影響的范圍是怎么樣的?

    alsactl ?monitor

    主要功能監控 alsa ,通過再界面操作,我們可以了解到界面具體操控了哪些設備,這樣我們就可以用amixer等命令進行配置了
    node hw:0, #4 (2,0,0,Headphone Playback Switch,0) VALUE
    node hw:0, #3 (2,0,0,Headphone Playback Volume,0) VALUE
    node hw:0, #18 (2,0,0,Master Playback Volume,0) VALUE
    node hw:0, #62 (2,0,0,PCM Playback Volume,0) VALUE
    node hw:0, #4 (2,0,0,Headphone Playback Switch,0) VALUE
    node hw:0, #4 (2,0,0,Headphone Playback Switch,0) VALUE
    node hw:0, #3 (2,0,0,Headphone Playback Volume,0) VALUE
    node hw:0, #18 (2,0,0,Master Playback Volume,0) VALUE
    node hw:0, #62 (2,0,0,PCM Playback Volume,0) VALUE

    編程實踐

    OSS編程實踐

    聲卡信息獲取

    ? ?為什么我們需要這個功能,因為我們要區分哪個設備節點為我們期望操作的?

    音量調節

    ? 為什么我們需要這個功能,因為不同的音量導致輸出 、輸入數據的變化。?

    輸入輸出

    ?為什么我們需要這個功能,因為這個是音頻的數據通道。

    ALSA編程實踐

    錄音與播放

    ? ? ? 分離的錄音與播放功能,參見 參考資料3 中的示例,比較清晰。同時,參考資料3 中的另外一篇實現了邊播邊放,本質是將 設備節點作為play 、capture同時打開,然后分別對play和capture句柄分別進行寫 、讀操作。

    實驗要求及代碼

    ? ? ?以上的示例中,通常都將rate 設置為44.1K, channel 為2,以及采用精度設置為S16。

    ? ? 本文實驗將rate改成8K, channel改為1,精度改為U8。示例代碼如下,主體代碼為參考資料3中,主要修改 硬件參數進行測試。

    #include <stdio.h> #include <stdlib.h> #include <alsa/asoundlib.h>snd_pcm_t *open_sound_dev(snd_pcm_stream_t type) {int err;snd_pcm_t *handle;snd_pcm_hw_params_t *hw_params;//unsigned int rate = 44100;unsigned int rate = 8000; /* int snd_pcm_open(snd_pcm_t **pcmp, const char *name, snd_pcm_stream_t stream, int mode)pcmp 打開的pcm句柄 name 要打開的pcm設備名字,默認default,或者從asound.conf或者asoundrc里面選擇所要打開的設備 stream SND_PCM_STREAM_PLAYBACK 或 SND_PCM_STREAM_CAPTURE,分別表示播放和錄音的PCM流 mode 打開pcm句柄時的一些附加參數 SND_PCM_NONBLOCK 非阻塞打開(默認阻塞打開), SND_PCM_ASYNC 異步模式打開 返回值 0 表示打開成功,負數表示失敗,對應錯誤碼 "plughw:0,0" */if ((err = snd_pcm_open (&handle,"hw:/dev/snd/controlC0" , type, 0)) < 0) {fprintf (stderr, "cannot open (%s)\n",snd_strerror (err));return NULL;} /* snd_pcm_hw_params_malloc( ) 在棧中分配 snd_pcm_hw_params_t 結構的空間,然后使用 snd_pcm_hw_params_any( ) 函數用聲卡的全配置空間參數初始化已經分配的 snd_pcm_hw_params_t 結構。snd_pcm_hw_params_set_access ( ) 設置訪問類型,常用訪問類型的宏定義有:SND_PCM_ACCESS_RW_INTERLEAVED 交錯訪問。在緩沖區的每個 PCM 幀都包含所有設置的聲道的連續的采樣數據。比如聲卡要播放采樣長度是 16-bit 的 PCM 立體聲數據,表示每個 PCM 幀中有 16-bit 的左聲道數據,然后是 16-bit 右聲道數據。SND_PCM_ACCESS_RW_NONINTERLEAVED 非交錯訪問。每個 PCM 幀只是一個聲道需要的數據,如果使用多個聲道,那么第一幀是第一個聲道的數據,第二幀是第二個聲道的數據,依此類推。函數 snd_pcm_hw_params_set_format() 設置數據格式,主要控制輸入的音頻數據的類型、無符號還是有符號、是 little-endian 還是 bit-endian。比如對于 16-bit 長度的采樣數據可以設置為: */ if ((err = snd_pcm_hw_params_malloc (&hw_params)) < 0) {fprintf (stderr, "cannot allocate hardware parameter structure (%s)\n",snd_strerror (err));return NULL;}if ((err = snd_pcm_hw_params_any (handle, hw_params)) < 0) {fprintf (stderr, "cannot initialize hardware parameter structure (%s)\n",snd_strerror (err));return NULL;}if ((err = snd_pcm_hw_params_set_access (handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) {// 交錯訪問fprintf (stderr, "cannot set access type (%s)\n",snd_strerror (err));return NULL;}if ((err = snd_pcm_hw_params_set_format (handle, hw_params, SND_PCM_FORMAT_U8)) < 0) { // SND_PCM_FORMAT_U8 SND_PCM_FORMAT_S16_LE 有符號16 bit Little Endianfprintf (stderr, "cannot set sample format (%s)\n",snd_strerror (err));return NULL;}if ((err = snd_pcm_hw_params_set_rate_near (handle, hw_params, &rate, 0)) < 0) { //snd_pcm_hw_params_set_rate_near () 函數設置音頻數據的最接近目標的采樣率fprintf (stderr, "cannot set sample rate (%s)\n",snd_strerror (err));return NULL;}if ((err = snd_pcm_hw_params_set_channels (handle, hw_params, 1)) < 0) {fprintf (stderr, "cannot set channel count (%s)\n",snd_strerror (err));return NULL;} //snd_pcm_hw_params( ) 從設備配置空間選擇一個配置,讓函數 snd_pcm_prepare() 準備好 PCM 設備,以便寫入 PCM 數據。if ((err = snd_pcm_hw_params (handle, hw_params)) < 0) {fprintf (stderr, "cannot set parameters (%s)\n",snd_strerror (err));return NULL;}snd_pcm_hw_params_free (hw_params);return handle; }void close_sound_dev(snd_pcm_t *handle) {snd_pcm_close (handle); }snd_pcm_t *open_playback(void) {return open_sound_dev(SND_PCM_STREAM_PLAYBACK); }snd_pcm_t *open_capture(void) {return open_sound_dev(SND_PCM_STREAM_CAPTURE); }int main (int argc, char *argv[]) {int err;unsigned char buf[512];unsigned char recv_buf[512];snd_pcm_t *playback_handle;snd_pcm_t *capture_handle;int i=0;playback_handle = open_playback();if (!playback_handle){fprintf (stderr, "cannot open for playback\n");return -1;}//snd_pcm_close (playback_handle);capture_handle = open_capture();if (!capture_handle){fprintf (stderr, "cannot open for capture\n");snd_pcm_close (playback_handle);return -1;}if ((err = snd_pcm_prepare (playback_handle)) < 0) {fprintf (stderr, "cannot prepare audio interface for use (%s)\n",snd_strerror (err));snd_pcm_close (playback_handle);snd_pcm_close (capture_handle);return -1;}if ((err = snd_pcm_prepare (capture_handle)) < 0) {fprintf (stderr, "cannot prepare audio interface for use (%s)\n",snd_strerror (err));return -1;} #if 1while (1) {if ((err = snd_pcm_readi (capture_handle, recv_buf, 128)) != 128) {fprintf (stderr, "read from audio interface failed (%s)\n",snd_strerror (err));snd_pcm_close (playback_handle);snd_pcm_close (capture_handle);return -1;}printf("recv data:");for(i=0;i<64;i++)printf("0x%x ",recv_buf[i]);printf("\n");memset(buf,0x55,128);memset(buf,0x0,128);if ((err = snd_pcm_writei (playback_handle, buf, 128)) != 128) { //snd_pcm_writei() 用來把交錯的音頻數據寫入到音頻設備。fprintf (stderr, "write to audio interface failed (%s)\n",snd_strerror (err));snd_pcm_close (playback_handle);snd_pcm_close (capture_handle);return -1;}} #endif snd_pcm_close (playback_handle);snd_pcm_close (capture_handle);return 0; }

    運行結果及問題

    運行后,很快出現 broken pipe,而原先未修改硬件配置參數的代碼則未出現此問題。異常信息如下:

    ./x86csdn MoTTY X11 proxy: Unsupported authorisation protocol xcb_connection_has_error() returned true XDG_RUNTIME_DIR (/run/user/1000) is not owned by us (uid 0), but by uid 1000! (This could e g happen if you try to connect to a non-root PulseAudio as a root user, over the native protocol. Don't do that.) recv data:0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 recv data:0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 0x9 write to audio interface failed (Broken pipe)

    問題分析 之 設備恢復及統計

    ?如下,通過接口pcm_prepare恢復設備狀態。并通過增加計數,我們看到在發生16或者20次后,會進入一次broken pipe 異常

    if ((err = snd_pcm_writei (playback_handle, buf, 128)) != 128) { fprintf (stderr, "write to audio interface failed (%s) %d\n",snd_strerror (err),count); //這里打印正常輸出了多少次count// snd_pcm_close (playback_handle);//snd_pcm_close (capture_handle);snd_pcm_prepare(playback_handle); // 這里恢復設備狀態// return -1;count = 0;}}

    period size大小的影響

    /* Set period size to 32 frames. */capture_frames = 64;snd_pcm_hw_params_set_period_size_near(capture_handle,capture_params, &capture_frames, &dir);/* Write the parameters to the driver */rc = snd_pcm_hw_params(capture_handle, capture_params);if (rc < 0) {fprintf(stderr,"unable to set hw parameters: %s\n",snd_strerror(rc));exit(1);}/* Use a buffer large enough to hold one period */snd_pcm_hw_params_get_period_size(capture_params, &capture_frames,&dir);capture_size = capture_frames* 4;// * 4; /* 2 bytes/sample, 2 channels */capture_buffer = (char *) malloc(capture_size);

    ? ? ? ?在音頻的編程中,period size大小是比較重要的,也就是一次發送或者接收的幀數。

    ? ? ? ?設置的不合適,容易出現 underrun或者overrun的情況。通過如下的設備節點,可以看到當前采用的參數,尤其注意,查看這些參數需要音頻程序在運行時查看,否則查到的信息為設備closed

    ? ? ??

    cat /proc/asound/card0/pcm2c/sub0/hw_params access: RW_INTERLEAVED format: S16_LE subformat: STD channels: 2 rate: 44100 (44100/1) period_size: 32 buffer_size: 1024cat /proc/asound/card0/pcm2c/sub0/sw_params tstamp_mode: NONE period_step: 1 avail_min: 32 start_threshold: 1 stop_threshold: 1024 silence_threshold: 0 silence_size: 0 boundary: 4611686018427387904

    ? ? ? ? 此外,注意代碼中是否存在 阻塞等待的接口。例如在作為capture時,默認是阻塞的,如果沒有讀到數據,則進程會等待,導致后續發送數據的接口沒有運行,進而出現,underrun的信息。

    ? ? ? ? 將capture 打開時,改為非阻塞可以解決此問題,只是在處理后續的讀取操作時,要針對返回值進行異常處理? ? ?

    rc = snd_pcm_open(&capture_handle, "hw:/dev/snd/controlC0" ,SND_PCM_STREAM_CAPTURE, SND_CTL_NONBLOCK); // 采用非阻塞模式,不然在下面寫的時候,堵塞導致寫的過程很慢,而INTEL HDA速率快很多,導致一直 underrun.

    period 時長

    這個單板相關,通過如下接口進行獲取,其中第二個為輸出參數,單位為us,即period的長度

    ?

    snd_pcm_hw_params_get_period_time() int snd_pcm_hw_params_get_period_time ( const snd_pcm_hw_params_t * params, unsigned int * val, int * dir ) Extract period time from a configuration space.Parameters params Configuration space val Returned approximate period duration in us //period的時長,以us為單位 dir Sub unit direction

    如果我們以此為基準進行一些計算,則要注意單板的差異。例如,筆者采用T3評估板,采用頻率設置為8K,查詢此參數為1000 000 ,即1s,也就是1s鐘才完成一次數據的發送或者接收。

    參考資料

    Open Sound System - ArchWiki (archlinux.org)? arch oss wiki百科信息,shell命令等的介紹都源自于此。

    2)OSS v4.x API reference - The open() system call (opensound.com)OSS 編程接口。接口參數等不清楚的時候,都可以查閱此文檔。

    3)ALSA 編程入門 ,這篇寫的非常詳細,優質文章。只是唯一缺點是 播放和錄音是分開的,沒有合入到一起。Introduction to Sound Programming with ALSA | Linux Journal

    邊播邊放的代碼:(9條消息) alsa框架編寫應用層,實現邊播放邊錄音_aningxiaoxixi的博客-CSDN博客_alsa 邊錄邊播?5.ALSA錄放音 - 簡書 (jianshu.com)

    官網簡化版本例程,短小精悍,結構清晰:?ALSA project - the C library reference: /test/pcm_min.c (alsa-project.org)?

    4)ALSA wiki :?AlsaProject (alsa-project.org)

    5)arch ALSA wiki:?Advanced Linux Sound Architecture - ArchWiki (archlinux.org)

    6) amixer 命令行解釋及示例:?amixer: command-line mixer for ALSA soundcard driver - Linux Man Pages (1) (systutorials.com)?

    7) ALSA 官方API 接口說明:?ALSA project - the C library reference: Index, Preamble and License (alsa-project.org)

    8) ALSA 的設計哲學圖譜??ALSA topology - AlsaProject (alsa-project.org)

    9)設備名稱:?DeviceNames - AlsaProject (alsa-project.org)?

    10) mixer 命令help信息及示例??amixer: command-line mixer for ALSA soundcard driver - Linux Man Pages (1) (systutorials.com)

    11) 輸入接口 Line in 和mic in 的區別:?Line In vs Mic In (Line Level Explained For Dummies) (producerhive.com)?

    (9條消息) MICIN、LINEIN、LINEOUT、HPOUT、麥克風、耳機、揚聲器一次說明白_【ql君】qlexcel的博客-CSDN博客_hpout

    12)硬件配圖不錯??ALSA overview - stm32mpu (stmicroelectronics.cn)?

    總結

    以上是生活随笔為你收集整理的Linux 音频开发之入门篇的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    国产一区在线观看免费 | 成人久久久久久久久久 | 黄色在线免费观看网址 | 91成人网在线播放 | 国产91精品在线观看 | 日本性生活免费看 | 国产免费小视频 | 99热播精品 | 国产精品精品久久久久久 | 97国产大学生情侣酒店的特点 | 99视频导航 | 98福利在线 | 69视频在线播放 | 国产精品久久久久久久久久了 | 成人黄色片免费看 | 亚洲精品xx | 激情综合站 | 国产最新在线视频 | 国产精品永久久久久久久久久 | 精品色999| 一区二区三区在线观看免费视频 | 欧美最爽乱淫视频播放 | 午夜美女wwww| 国产999视频 | 国产日韩精品一区二区三区 | 91激情在线视频 | 天天天射 | 国产精品免费观看网站 | 亚洲另类在线视频 | 中文字幕电影高清在线观看 | 成人精品一区二区三区中文字幕 | 久久综合精品国产一区二区三区 | 久久精品久久久久久久 | 国产精品12 | 国产精品久久久久久久久久久久午夜 | 日韩中文字幕免费看 | 国产在线精品区 | 在线观看免费日韩 | 天天干天天做 | 亚洲一区二区高潮无套美女 | 中文字幕在线播放av | 在线免费观看的av网站 | 麻豆视频在线播放 | 综合精品久久久 | 国内视频1区 | 国产群p | 欧美日韩在线观看不卡 | 午夜精品久久久久久久99水蜜桃 | 成人黄在线 | 激情五月在线 | 国产一区高清在线观看 | 久久av福利| 在线黄色av电影 | 97精品一区二区三区 | 夜夜高潮夜夜爽国产伦精品 | 在线观看不卡视频 | 一级黄色大片在线观看 | 久久精品欧美一区 | www.888av | 天天操天天爱天天干 | 国产精品女人网站 | 日本精a在线观看 | 久久久精品视频成人 | 一级α片 | 国产精品欧美日韩在线观看 | 久久99精品国产99久久6尤 | 中文字幕麻豆 | 观看免费av| 国产一及片 | 99视频久久 | 久久亚洲影视 | 黄色特一级片 | 亚洲a在线观看 | 国产午夜精品一区二区三区在线观看 | 久久艹国产视频 | 美女福利视频网 | 一级一片免费观看 | 中文字幕av免费 | 一级精品视频在线观看宜春院 | 日韩av在线资源 | 日韩免费一二三区 | 福利视频一区二区 | 中文字幕精品一区二区精品 | 狠狠色丁香婷婷综合视频 | 国产精品爽爽久久久久久蜜臀 | 色姑娘综合天天 | 91在线www| 99国产精品久久久久久久久久 | 人人操日日干 | 国产高清 不卡 | 中文字幕在线看视频 | 西西www444| 国产69精品久久99的直播节目 | 国产中文字幕免费 | 国产黄a三级三级三级三级三级 | 欧美analxxxx | 久久久久看片 | 97视频总站 | 日本精品中文字幕在线观看 | 亚洲日本va午夜在线电影 | 美女视频黄免费 | 91久久精品日日躁夜夜躁国产 | 日日干夜夜草 | 69绿帽绿奴3pvideos | 超碰免费97 | 久久久不卡影院 | 在线视频麻豆 | 欧美性猛片| 日日摸日日添日日躁av | 91av视频免费在线观看 | 91高清免费观看 | 黄色在线观看污 | 久久国产精品偷 | 看国产黄色片 | 欧美污网站 | 亚洲永久字幕 | 日日夜夜网站 | 狠狠操综合 | www.亚洲视频 | 精品国产伦一区二区三区 | 黄色毛片网站在线观看 | 91丨九色丨高潮 | 又黄又刺激视频 | 日韩av电影免费在线观看 | 蜜臀aⅴ国产精品久久久国产 | 久久婷婷一区二区三区 | 麻豆视频免费在线 | 国产精选在线观看 | 黄色片免费看 | 久久亚洲影视 | 99久久精品免费一区 | 午夜 在线 | 欧美日韩在线免费观看 | 亚洲人成影院在线 | 日日操天天操夜夜操 | 特级a毛片 | 欧美另类tv | 97在线视频免费看 | 亚洲精品男女 | av夜夜操 | 国产成人高清在线 | 亚洲精品国产成人av在线 | 日韩欧美精选 | 黄色成人91 | 最近中文字幕免费 | 久久精品香蕉 | 国产99中文字幕 | 亚洲va欧美va | 日韩在线播放欧美字幕 | 99热精品国产一区二区在线观看 | 国产中文字幕一区二区三区 | 日本中文字幕在线一区 | 亚洲va欧美va国产va黑人 | 久久精品3 | 99视频在线免费观看 | 精品999在线观看 | 韩国av免费看 | 国产亚洲综合性久久久影院 | 黄色av影视| 特片网久久| 狠狠成人 | 不卡精品 | 日韩免费高清在线 | 欧美精品免费一区二区 | 日韩特级黄色片 | av福利在线导航 | 欧美狠狠操 | 久草综合在线观看 | 日韩69视频 | 99久久精品免费看国产麻豆 | 成人免费ⅴa | 精品国产片| 亚洲精品9| 色综合网 | 激情av在线播放 | 婷婷色网 | 伊人官网 | 日韩精品一区二区三区在线播放 | 一本一本久久a久久精品综合妖精 | 久草在线在线精品观看 | 久久久国产精品视频 | 国产精品久久久视频 | 97超级碰 | 久草热久草视频 | 久久精品网站免费观看 | 伊人婷婷 | 伊人影院99| 亚洲电影免费 | av在线免费播放 | 天天色天天综合网 | 精品久久精品 | 精品伊人久久久 | 97在线免费 | 97超碰国产精品 | 亚洲乱码中文字幕综合 | 夜夜躁日日躁狠狠久久88av | 久久精品国产亚洲精品2020 | 亚洲成人资源网 | 婷婷色5月 | 国产亚洲人 | 日韩欧美在线第一页 | 久草视频2| 五月婷影院 | 天天干,天天射,天天操,天天摸 | 草在线视频 | 久草在线看片 | 日韩精品一区二区三区在线播放 | av在线免费网 | 欧美日韩1区 | 欧美经典久久 | 五月香视频在线观看 | 婷婷在线不卡 | 午夜av激情 | 国产护士在线 | 91麻豆高清视频 | 久久综合久色欧美综合狠狠 | 国产一区二区在线播放视频 | 在线观看一级视频 | 色欲综合视频天天天 | 国产一区91 | 成人av在线网址 | 久久国产高清 | 在线激情影院一区 | 国精产品永久999 | 婷婷午夜天 | 97av色| 日韩专区在线观看 | 97电影手机 | 国产精品久久人 | 久久99精品久久久久久 | www.夜夜操.com | 激情电影影院 | 超碰97人人爱 | 激情五月五月婷婷 | 九9热这里真品2 | 欧美亚洲免费在线一区 | 97福利在线观看 | 2017狠狠干| 精品免费在线视频 | 欧美另类sm图片 | 久久免费国产 | 少妇精品久久久一区二区免费 | 99精品视频中文字幕 | 欧美日韩1区 | 一区二区视频免费在线观看 | 色五婷婷 | 伊人午夜| 久久精品一区二区三 | 久久草 | 伊人久久一区 | av短片在线| 91视频在线免费下载 | av亚洲产国偷v产偷v自拍小说 | 国产成人久久精品77777综合 | 亚洲视频专区在线 | 99热国产在线观看 | 久草在线99| 欧美一区视频 | 国产伦理剧 | 黄色h在线观看 | 999成人精品| 狠狠色丁香久久婷婷综合五月 | 国产亚洲一区二区三区 | 97综合在线 | 五月天久久 | 超碰com | 大胆欧美gogo免费视频一二区 | 午夜精品视频免费在线观看 | 色是在线视频 | 蜜臀久久99精品久久久无需会员 | 最新日韩在线观看 | 亚洲天堂网在线视频观看 | 久99久中文字幕在线 | 免费看黄在线 | 国产高清视频在线 | 精品麻豆入口免费 | a黄色一级片 | 91爱爱中文字幕 | 在线韩国电影免费观影完整版 | 97精品免费视频 | 久久亚洲精品国产亚洲老地址 | 免费观看版 | 国产在线播放一区二区三区 | 成人av在线看 | 三上悠亚一区二区在线观看 | 欧美国产日韩一区 | 97视频免费 | 毛片的网址 | 久久国产精品久久久久 | 日本色小说视频 | 精品a级片 | 亚洲欧美va | 亚洲激情在线观看 | 黄色软件在线观看视频 | 五月婷婷操 | 国产精品久久久久国产精品日日 | 日韩激情第一页 | 日韩福利在线观看 | 欧美不卡视频在线 | 欧美一区二区三区激情视频 | 亚洲综合一区二区精品导航 | 日韩成人在线一区二区 | 亚洲影院国产 | 亚洲夜夜综合 | 国产麻豆精品久久 | 视频在线观看一区 | 成人综合日日夜夜 | 日本中出在线观看 | 干亚洲少妇 | 久久久久激情 | 香蕉久久久久久久 | 操操操操网 | 狠狠干婷婷色 | 久久综合国产伦精品免费 | 国产精品久久久久av福利动漫 | 久久精品中文字幕少妇 | 一区二区av | 国产热re99久久6国产精品 | 国产91国语对白在线 | 亚洲国产影院av久久久久 | 欧美日韩视频精品 | 免费情趣视频 | 久久成人在线视频 | 欧美国产日韩在线视频 | 2019中文字幕第一页 | 91漂亮少妇露脸在线播放 | 欧美欧美 | 中文字幕人成乱码在线观看 | 日p在线观看 | 亚洲黄色激情小说 | 久热精品国产 | 日韩欧美视频在线免费观看 | 亚洲黄色免费在线 | a天堂最新版中文在线地址 久久99久久精品国产 | 91精品国产乱码 | 美国人与动物xxxx | 亚洲春色奇米影视 | 免费黄色av. | 久草在线资源观看 | 日韩成人在线一区二区 | 久久婷婷一区 | 在线观看韩国av | 97成人免费视频 | 在线成人免费电影 | 国产精品免费视频久久久 | 久久久久久美女 | 国产精品第10页 | 欧美成年人在线观看 | 国产在线精品区 | 亚洲91精品在线观看 | 99麻豆视频 | 欧美精品免费在线 | 欧美日产一区 | 91高清一区 | 国产日韩视频在线 | 成人一级片免费看 | 日韩婷婷 | 亚洲亚洲精品在线观看 | 91精品人成在线观看 | 国产成人精品久久 | 亚洲一区精品人人爽人人躁 | 国产日韩欧美在线一区 | av在线电影网站 | 国产精品久久久久一区二区三区共 | 亚洲一区二区三区四区精品 | 国产精品麻豆果冻传媒在线播放 | 久久伊人精品一区二区三区 | 午夜电影久久 | 亚洲无吗av| 精品在线免费观看 | 久久久久久高潮国产精品视 | 九九热免费视频在线观看 | 丁香花在线观看视频在线 | 免费观看国产精品 | 五月婷婷综合久久 | 亚洲在线视频网站 | 精品国模一区二区 | 久草在线视频国产 | 亚洲成人动漫在线观看 | 99久高清在线观看视频99精品热在线观看视频 | 国产精品一区二区三区在线看 | 日韩免费在线视频观看 | 最近中文字幕免费av | 亚洲精品一区二区精华 | 日韩精品视频在线观看网址 | 在线 高清 中文字幕 | 黄色a级片在线观看 | 久久精品国产亚洲精品2020 | 日韩a级黄色| 久久99久久99精品免观看软件 | 麻豆免费在线视频 | 久久国产精品免费 | 欧美日韩aa | 91天堂素人约啪 | 亚洲精品国精品久久99热一 | 国产在线小视频 | a级国产乱理论片在线观看 伊人宗合网 | 激情开心色 | 午夜性生活 | 成年人视频在线免费观看 | 中文字幕在线人 | 色老板在线 | 狠狠色丁婷婷日日 | 91麻豆精品国产91久久久使用方法 | 久久成人综合 | 99热国产在线 | 一区中文字幕在线观看 | 97在线免费 | 成人h在线播放 | 国产xvideos免费视频播放 | 超碰九九 | 色婷婷亚洲婷婷 | 免费大片av| 国产高清视频在线播放一区 | 成人啊 v| 日韩免费看片 | 欧美人人爱| 国产人成看黄久久久久久久久 | 亚洲精品国产精品国自产 | 成人免费共享视频 | 国产视频1区2区3区 久久夜视频 | 国产精品一区二区三区视频免费 | 久久视频免费观看 | 97精品欧美91久久久久久 | 成人性生爱a∨ | 麻豆一区在线观看 | 黄色成年| 99免费在线| 国产高清一级 | 婷婷视频在线 | 西西4444www大胆视频 | 玖玖视频在线 | 久久久在线| 成人一级片在线观看 | 精品在线不卡 | www.91成人 | 在线观看黄色免费视频 | 97超碰中文字幕 | 91热这里只有精品 | 久久免费毛片 | 亚洲视频 中文字幕 | 在线看片日韩 | 中文字幕制服丝袜av久久 | av免费在线网站 | 色婷婷狠狠五月综合天色拍 | 一区二区三区久久 | 99精品国产99久久久久久97 | 香蕉久草在线 | 免费在线观看国产黄 | 国产区精品视频 | 91亚洲国产成人 | 色婷婷综合久久久久中文字幕1 | 国内精品久久久久影院日本资源 | 91视频一8mav | 久久久久国产精品视频 | 91精品小视频 | 97超碰人人模人人人爽人人爱 | 国内精品久久久久久中文字幕 | 欧美精品v国产精品 | 久久精品视频免费播放 | 免费亚洲黄色 | 久久亚洲影视 | 五月综合在线观看 | 四虎在线观看精品视频 | 国产资源在线播放 | 99久久精品国产免费看不卡 | 日韩精品免费一线在线观看 | 成人a级黄色片 | 91精品爽啪蜜夜国产在线播放 | 大胆欧美gogo免费视频一二区 | 国产成人av | 99久久99热这里只有精品 | 韩国av在线| 亚洲四虎影院 | 黄色网www| 国产一级免费观看 | 精品国产成人 | 久久国产精品小视频 | 91香蕉久久| 香蕉一区 | 亚洲天堂精品视频在线观看 | 97热在线观看 | 就色干综合 | 成人av在线播放网站 | 国产麻豆精品一区二区 | 欧美成人高清 | 国产精品99久久久久久有的能看 | 六月丁香激情网 | 91久久爱热色涩涩 | 日日夜日日干 | 四虎永久网站 | 久久国产精品成人免费浪潮 | 国产亚洲精品久久久久久大师 | 视频成人 | 在线www色 | 日韩在线观看视频中文字幕 | 激情五月色播五月 | 中文字幕乱码在线播放 | 久久免费视频播放 | 天天艹天天操 | 亚洲国产欧美在线人成大黄瓜 | 色综合久久中文综合久久牛 | 国产精品一区一区三区 | av免费看网站 | 亚洲精品视频免费在线 | 久久久免费在线观看 | 国产中文字幕大全 | www.久久91 | 在线观看色视频 | 人人爽人人澡人人添人人人人 | 五月天激情在线 | 中文字幕第一页av | 国产日韩精品一区二区 | 亚洲成人黄色av | 综合精品在线 | 中文字幕一区二区三区久久蜜桃 | 香蕉视频免费看 | 成人午夜电影免费在线观看 | av在线永久免费观看 | 69国产在线观看 | 日韩电影中文字幕在线观看 | 天天爽夜夜爽人人爽一区二区 | 国产视频一区二区在线 | 久久艹艹 | 欧美日韩精品久久久 | 亚洲国产一区在线观看 | 日韩免费成人 | 国产丝袜网站 | 天天干夜夜爱 | av线上看| 国产一区二区视频在线播放 | 久久午夜网 | 亚洲aⅴ免费在线观看 | 亚洲精品影视 | 久久精品一二三区 | av电影一区 | 久久国产一区二区 | 久久99精品国产99久久6尤 | 久久免费播放视频 | 手机在线中文字幕 | 亚洲欧美视频一区二区三区 | 青青河边草免费观看 | 精品一二三四五区 | 日本三级香港三级人妇99 | 伊人看片 | 九九热免费精品视频 | 国产精品久久久精品 | 中文字幕二区在线观看 | 色久五月 | 国产一卡二卡在线 | 色视频成人在线观看免 | 天天爽天天搞 | 国产原创中文在线 | 免费黄色在线网址 | 又黄又刺激的视频 | 日本精品视频在线播放 | 国产在线视频一区二区三区 | 伊人影院在线观看 | 天天射天天射天天 | 国产高清中文字幕 | 观看免费av | 2023亚洲精品国偷拍自产在线 | 久久综合九色综合久99 | 国产又粗又猛又色 | 深夜福利视频在线观看 | 麻豆国产网站入口 | 中文字幕在线高清 | 亚洲自拍av在线 | 精品国产乱码久久久久久天美 | 国产高清永久免费 | 亚洲激情免费 | 国产精品久久久久久久久久东京 | 一级片视频在线 | 欧美精品一区在线 | 日韩在线观看你懂的 | 国产午夜精品一区二区三区欧美 | 国产小视频免费在线观看 | 在线视频黄 | 99精品视频观看 | 久久大片 | 99亚洲精品视频 | 日韩激情视频在线 | 一本一本久久a久久精品牛牛影视 | 91福利影院在线观看 | a级片网站 | 超碰97人人爱 | 在线看成人片 | 草免费视频| 国产三级香港三韩国三级 | 欧美日韩啪啪 | 韩国精品视频在线观看 | 91久久国产露脸精品国产闺蜜 | 中文字幕中文字幕 | 免费能看的黄色片 | 久久精品亚洲综合专区 | 97超视频在线观看 | 麻豆免费精品视频 | 日韩电影一区二区三区 | 高清不卡毛片 | 五月开心六月伊人色婷婷 | 精品国内 | 精品免费国产一区二区三区四区 | 国产女人18毛片水真多18精品 | 亚洲乱码一区 | 亚洲永久在线 | 在线小视频你懂的 | 日韩精品一区二区在线视频 | 免费成人黄色av | 在线国产一区二区 | 一区在线观看视频 | 日韩1页| 国产成人黄色网址 | 五月天久久久久久 | 国产成人黄色 | 超级碰碰碰免费视频 | 亚洲综合一区二区精品导航 | 在线国产91| 国产无套一区二区三区久久 | 国产女人18毛片水真多18精品 | 欧美 日韩 国产 成人 在线 | 天天色综合三 | 免费网址在线播放 | 精品日韩在线 | 国产亚洲日本 | 国产伦精品一区二区三区在线 | 亚洲成色777777在线观看影院 | 久久久久99精品国产片 | 99久久国产免费,99久久国产免费大片 | 天天玩天天操天天射 | 99热.com| www.久久久.com| 午夜视频在线观看欧美 | 韩国三级在线一区 | 免费av的网站 | 中文在线a√在线 | 日韩高清精品免费观看 | 国产亚洲aⅴaaaaaa毛片 | 狠狠色丁香九九婷婷综合五月 | 91日韩在线 | 视频一区亚洲 | 国产精品一区二区三区在线播放 | 日韩www在线 | 在线观看视频国产一区 | 国产一区二区三精品久久久无广告 | 日韩一区二区久久 | 99精品免费在线观看 | 国产二区视频在线 | 中文字幕第一页在线 | 婷婷色中文字幕 | 一区二区观看 | 91网址在线看| 亚洲小视频在线 | 在线a视频 | 人成午夜视频 | 久草精品视频在线播放 | www.久久爱.cn | 久久九九久久精品 | 毛片在线播放网址 | 免费av观看 | 日韩在线理论 | 免费视频一二三区 | 搡bbbb搡bbb视频| 精品久久1 | 日韩综合视频在线观看 | 国产精品久久在线 | 日本不卡久久 | 亚洲视屏 | 国产精品久久婷婷六月丁香 | 日韩大片在线免费观看 | 97视频免费在线看 | 91片黄在线观 | 日日干 天天干 | 又色又爽又激情的59视频 | 国产在线超碰 | 狠狠操操操 | 欧美一二在线 | 美女久久一区 | 免费瑟瑟网站 | 国产精品一区二区中文字幕 | 九九免费在线观看 | 九九视频网站 | 久草在线视频首页 | 婷婷狠狠操| 97视频在线观看视频免费视频 | 欧美一二三在线 | www.五月婷 | 91福利专区 | 欧美a级片网站 | 亚洲精品97 | 美女视频网站久久 | 日本久久久久久科技有限公司 | 久久一区二区三区国产精品 | 人人插超碰 | 色网站在线免费观看 | 亚洲精品成人av在线 | 亚洲国产精品久久久久婷婷884 | 夜夜夜精品 | 成人影音在线 | aaa黄色毛片 | 韩日色视频 | 日本99久久| 国产精品涩涩屋www在线观看 | 精品在线观看一区二区 | 国产日产精品久久久久快鸭 | 9992tv成人免费看片 | 有码一区二区三区 | 成人精品久久久 | 三级av小说| 一区 二区电影免费在线观看 | 免费高清av在线看 | 国产精品久久久久久妇 | 国内精品久久久久久久97牛牛 | 日日日操操 | 欧美色综合天天久久综合精品 | 91九色蝌蚪在线 | 国产网红在线观看 | 久草网免费 | 国产精品99久久久久久小说 | 国产精品久久久久久久av电影 | 日本久久精品 | 日韩成年视频 | 久久女同性恋中文字幕 | 在线国产精品视频 | 狠狠色丁香婷综合久久 | 欧美a级在线免费观看 | 免费日韩 精品中文字幕视频在线 | 免费观看www7722午夜电影 | 国产高清不卡av | 亚洲精品视频在 | 欧美精品免费视频 | 日韩动漫免费观看高清完整版在线观看 | 92精品国产成人观看免费 | 欧美一区二区三区免费观看 | 天天干天天在线 | 亚洲成人中文在线 | 久久这里只有精品23 | 精品一区精品二区 | 国产精品久久久久久久久久免费 | 国产亚洲成人网 | 久久99国产精品自在自在app | 久久桃花网 | 91免费看片黄 | av中文字幕剧情 | 久久精品一二三区白丝高潮 | 国产又粗又猛又黄又爽的视频 | 日韩视频一二三区 | 国内精品久久久精品电影院 | 中文字幕韩在线第一页 | 91精品视频免费在线观看 | 欧美a级在线 | 91丨九色丨首页 | 日韩网站一区二区 | 麻豆精品国产传媒 | 四虎影视8848aamm | 天天操天天综合网 | 亚洲成人精品 | 有码中文字幕在线观看 | 国产精品一区二区三区久久 | av电影在线观看完整版一区二区 | 在线视频观看亚洲 | 91在线蜜桃臀 | 国产视频中文字幕在线观看 | 精品久久久久久久久中文字幕 | 人人爽人人爽人人片 | 国产高清在线免费观看 | 久久久久久毛片精品免费不卡 | 日韩有色 | 日韩v在线91成人自拍 | 日本在线观看中文字幕 | 狠狠色丁香久久婷婷综合丁香 | 女人高潮一级片 | 国产精品高清免费在线观看 | 亚洲精品影视 | www色,com| 国产91精品在线播放 | 亚洲免费在线看 | 亚洲黄色小说网 | 97超碰国产精品女人人人爽 | av手机在线播放 | 国产精品久久久久久久久久ktv | 日韩成人xxxx | 美女视频是黄的免费观看 | 久久99国产精品免费网站 | 99高清视频有精品视频 | 日日干激情五月 | 毛片随便看 | 2019中文字幕网站 | 免费成人黄色 | 干干操操| 91在线在线观看 | 成人永久免费 | 亚洲日本精品 | www.com在线观看 | 手机成人在线电影 | 色国产视频| 亚洲精品午夜久久久久久久久久久 | 在线观看国产日韩欧美 | 激情视频免费在线观看 | 美女免费网站 | 亚洲精品久久久蜜桃直播 | 五月婷婷丁香激情 | av网站在线免费观看 | 超碰在线成人 | 欧美日韩免费在线视频 | 91中文字幕永久在线 | 在线播放精品一区二区三区 | 久久久久国产精品视频 | 欧美午夜寂寞影院 | 精品国产伦一区二区三区观看说明 | 99re国产视频 | 国产一区在线免费观看 | 综合久久久久久久 | 成人毛片在线视频 | 免费在线观看不卡av | 91九色九色| 国产精品爽爽久久久久久蜜臀 | 色无五月 | 国产视频欧美视频 | 99在线高清视频在线播放 | 久久精品国产成人精品 | 成人中文字幕在线 | 亚洲黄色免费观看 | 97麻豆视频| 天天干天天摸 | 在线免费高清一区二区三区 | 一区二区三区污 | www.色就是色| 在线色亚洲 | 91福利区一区二区三区 | 操操操人人人 | 91在线视频精品 | 成人黄色小说网 | 欧美激情精品久久久久久免费印度 | 黄色avwww| 99视频在线精品免费观看2 | 亚洲播放一区 | 91麻豆精品国产91 | 久久综合九色欧美综合狠狠 | 在线亚洲高清视频 | 日本久久视频 | 81国产精品久久久久久久久久 | 成人av直播 | 久久国产经典视频 | 91女神的呻吟细腰翘臀美女 | av片一区二区 | 国产免费人成xvideos视频 | 日韩理论电影网 | 精品一区免费 | 国产91精品看黄网站在线观看动漫 | 免费视频国产 | 久久99国产精品久久99 | 精品国产乱码久久久久 | 精品久久中文 | 一区二区av | 一区二区精品国产 | 欧美一级看片 | 天天爽人人爽夜夜爽 | 亚洲精品色视频 | 久久综合九色综合久久久精品综合 | 色婷婷综合久久久中文字幕 | 中文字幕在线一区观看 | 精品国产视频一区 | 激情欧美日韩一区二区 | 99久久精品久久久久久动态片 | 欧美日韩一区二区视频在线观看 | 中文在线字幕免费观 | 欧美激情另类 | 天天操天天摸天天爽 | av电影亚洲 | 在线视频 一区二区 | 日韩精品一区不卡 | 欧美电影在线观看 | 亚洲美女精品视频 | 国产淫片免费看 | 九九精品视频在线观看 | 丁香五月亚洲综合在线 | 夜色资源站wwwcom | 九九九九精品 | 国产成人av网 | 日韩黄在线观看 | 国产免费大片 | 精品国产电影一区 | 成人一区在线观看 | 日韩免费视频在线观看 | 国产成人久久久久 | 狂野欧美激情性xxxx | 色噜噜噜 | 国产成人一区三区 | av高清一区二区三区 | 在线欧美中文字幕 | 99精品国产一区二区三区麻豆 | 天堂av影院 | 天堂中文在线播放 | 中文字幕欲求不满 | 国产一区二区三区高清播放 | 9999在线观看 | 一区二区精品在线视频 | 久久爱www. | 韩日成人av | 国产一区免费看 | 中文伊人 | 天操夜夜操 | 久久久久蜜桃 | 日韩午夜视频在线观看 | 在线观看成人av | www.少妇 | 亚洲成人资源 | 97精品国自产拍在线观看 | 在线免费观看国产精品 | 99精品在线视频播放 | 狠狠精品 | 99视频在线观看免费 | 在线影视 一区 二区 三区 | 天天插狠狠干 | 色五月激情五月 | 久久艹久久 | 国产精品九九久久久久久久 | 日韩午夜大片 | 97av免费视频 | av福利网址导航 | 丁香婷婷综合激情五月色 | 欧美少妇的秘密 | 国产免费视频一区二区裸体 | 香蕉视频在线免费 | 国产精品美女在线 | av免费在线网站 | 国产精品麻豆果冻传媒在线播放 | 99久久精品免费看国产免费软件 | 久久久精品国产一区二区 | 久久视影 | 麻豆网站免费观看 | 国产在线国产 | 国产专区精品视频 | 人人射人人 | 字幕网av | 国产精品自在线 | 中午字幕在线 | 亚洲精品国产精品国产 | 成人久久免费 | 在线亚洲午夜片av大片 | 国产精品免费久久久久久 | 久久久久久久久久久高潮一区二区 | 综合伊人av | 天堂av在线中文在线 | 91精彩视频在线观看 | 国产精品免费视频观看 | 黄色成人影视 | 丁香六月欧美 | 日韩在线一二三区 | 亚洲无人区小视频 | 亚洲狠狠操 | 国产视频中文字幕在线观看 | 免费av在线网 | 97精品国产一二三产区 | 美女视频黄的免费的 | 国产在线a| 亚洲精品国产精品国自产观看浪潮 | 天堂av免费在线 | 四虎在线影视 | www.黄色片网站 | 久久女教师| 中文字幕资源站 | 国产精品 中文在线 | 国产精品视频在线观看 | 久久久久久不卡 | 91av在线播放 | 午夜精品电影 | 美女中文字幕 | 欧美怡红院 | 丁香午夜| 成人av网页 | 国产精品精品国产 | 国产成人在线一区 | 日本黄色大片儿 | 91人人爽久久涩噜噜噜 | 香蕉影视 | 伊人永久在线 | av一级网站| 青青草国产精品 | 亚洲jizzjizz日本少妇 | 日本中文字幕观看 | 久久久精品小视频 | 一区二区精品在线观看 | 亚洲永久字幕 | 国产999精品视频 | www黄| www.久久爱.cn| 欧美日韩一区三区 | 在线天堂v| 天天搞夜夜骑 | 在线视频1卡二卡三卡 | 天天操天天操天天 | 亚洲久久视频 | 日韩一区二区三免费高清在线观看 | 国产精品原创 | 久久视频这里只有精品 | 在线看黄网站 | 中文字幕av影院 |