亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? linux音頻編程2.txt

?? 我收集的一些關于linux(c)音頻和視頻編程的一些實例(有注釋哦)愛好linux編程的有福了
?? TXT
?? 第 1 頁 / 共 3 頁
字號:
SOUND_MIXER_SPEAKER PC喇叭 
SOUND_MIXER_LINE 音頻線輸入 
SOUND_MIXER_MIC 麥克風輸入 
SOUND_MIXER_CD CD輸入 
SOUND_MIXER_IMIX 回放音量 
SOUND_MIXER_ALTPCM 從D/A 轉換器 
SOUND_MIXER_RECLEV 錄音音量 
SOUND_MIXER_IGAIN 輸入增益 
SOUND_MIXER_OGAIN 輸出增益 
SOUND_MIXER_LINE1 聲卡的第1輸入 
SOUND_MIXER_LINE2 聲卡的第2輸入 
SOUND_MIXER_LINE3 聲卡的第3輸入 

表1 混音器命令 
對 聲卡的輸入增益和輸出增益進行調節是混音器的一個主要作用,目前大部分聲卡采用的是8位或者16位的增益控制器,但作為程序員來講并不需要關心這些,因為 聲卡驅動程序會負責將它們變換成百分比的形式,也就是說無論是輸入增益還是輸出增益,其取值范圍都是從0到100。在進行混音器編程時,可以使用 SOUND_MIXER_READ宏來讀取混音通道的增益大小,例如在獲取麥克風的輸入增益時,可以使用如下的代碼:


int vol;
ioctl(fd, SOUND_MIXER_READ(SOUND_MIXER_MIC), &vol);
printf("Mic gain is at %d %%\n", vol);


對 于只有一個混音通道的單聲道設備來說,返回的增益大小保存在低位字節中。而對于支持多個混音通道的雙聲道設備來說,返回的增益大小實際上包括兩個部分,分 別代表左、右兩個聲道的值,其中低位字節保存左聲道的音量,而高位字節則保存右聲道的音量。下面的代碼可以從返回值中依次提取左右聲道的增益大小:


int left, right;
left = vol & 0xff;
right = (vol & 0xff00) >> 8;
printf("Left gain is %d %%, Right gain is %d %%\n", left, right);


類似地,如果想設置混音通道的增益大小,則可以通過SOUND_MIXER_WRITE宏來實現,此時遵循的原則與獲取增益值時的原則基本相同,例如下面的語句可以用來設置麥克風的輸入增益:


vol = (right << 8) + left;
ioctl(fd, SOUND_MIXER_WRITE(SOUND_MIXER_MIC), &vol);


在 編寫實用的音頻程序時,混音器是在涉及到兼容性時需要重點考慮的一個對象,這是因為不同的聲卡所提供的混音器資源是有所區別的。聲卡驅動程序提供了多個 ioctl系統調用來獲得混音器的信息,它們通常返回一個整型的位掩碼(bitmask),其中每一位分別代表一個特定的混音通道,如果相應的位為1,則 說明與之對應的混音通道是可用的。例如通過SOUND_MIXER_READ_DEVMASK返回的位掩碼,可以查詢出能夠被聲卡支持的每一個混音通道, 而通過SOUND_MIXER_READ_RECMAS返回的位掩碼,則可以查詢出能夠被當作錄音源的每一個通道。下面的代碼可以用來檢查CD輸入是否是 一個有效的混音通道:


ioctl(fd, SOUND_MIXER_READ_DEVMASK, &devmask);
if (devmask & SOUND_MIXER_CD)
printf("The CD input is supported");



如果進一步還想知道其是否是一個有效的錄音源,則可以使用如下語句:


ioctl(fd, SOUND_MIXER_READ_RECMASK, &recmask);
if (recmask & SOUND_MIXER_CD)
printf("The CD input can be a recording source");


目 前大多數聲卡提供多個錄音源,通過SOUND_MIXER_READ_RECSRC可以查詢出當前正在使用的錄音源,同一時刻能夠使用幾個錄音源是由聲卡 硬件決定的。類似地,使用SOUND_MIXER_WRITE_RECSRC可以設置聲卡當前使用的錄音源,例如下面的代碼可以將CD輸入作為聲卡的錄音 源使用:


devmask = SOUND_MIXER_CD;
ioctl(fd, SOUND_MIXER_WRITE_DEVMASK, &devmask);


此外,所有的混音通道都有單聲道和雙聲道的區別,如果需要知道哪些混音通道提供了對立體聲的支持,可以通過SOUND_MIXER_READ_STEREODEVS來獲得。

4.3 音頻錄放框架

下面給出一個利用聲卡上的DSP設備進行聲音錄制和回放的基本框架,它的功能是先錄制幾秒種音頻數據,將其存放在內存緩沖區中,然后再進行回放,其所有的功能都是通過讀寫/dev/dsp設備文件來完成的:


/*
* sound.c
*/
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <stdio.h>
#include <linux/soundcard.h>

#define LENGTH 3    /* 存儲秒數 */
#define RATE 8000   /* 采樣頻率 */
#define SIZE 8      /* 量化位數 */
#define CHANNELS 1 /* 聲道數目 */

/* 用于保存數字音頻數據的內存緩沖區 */
unsigned char buf[LENGTH*RATE*SIZE*CHANNELS/8];

int main()
{
int fd; /* 聲音設備的文件描述符 */
int arg; /* 用于ioctl調用的參數 */
int status;   /* 系統調用的返回值 */

/* 打開聲音設備 */
fd = open("/dev/dsp", O_RDWR);
if (fd < 0) {
    perror("open of /dev/dsp failed");
    exit(1);
}

/* 設置采樣時的量化位數 */
arg = SIZE;
status = ioctl(fd, SOUND_PCM_WRITE_BITS, &arg);
if (status == -1)
    perror("SOUND_PCM_WRITE_BITS ioctl failed");
if (arg != SIZE)
    perror("unable to set sample size");

/* 設置采樣時的聲道數目 */
arg = CHANNELS; 
status = ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &arg);
if (status == -1)
    perror("SOUND_PCM_WRITE_CHANNELS ioctl failed");
if (arg != CHANNELS)
    perror("unable to set number of channels");

/* 設置采樣時的采樣頻率 */
arg = RATE;
status = ioctl(fd, SOUND_PCM_WRITE_RATE, &arg);
if (status == -1)
    perror("SOUND_PCM_WRITE_WRITE ioctl failed");

/* 循環,直到按下Control-C */
while (1) {
    printf("Say something:\n");
    status = read(fd, buf, sizeof(buf)); /* 錄音 */
    if (status != sizeof(buf))
      perror("read wrong number of bytes");

    printf("You said:\n");
    status = write(fd, buf, sizeof(buf)); /* 回放 */
    if (status != sizeof(buf))
      perror("wrote wrong number of bytes");

    /* 在繼續錄音前等待回放結束 */
    status = ioctl(fd, SOUND_PCM_SYNC, 0); 
    if (status == -1)
      perror("SOUND_PCM_SYNC ioctl failed");
}
}


4.4 混音器框架

下面再給出一個對混音器進行編程的基本框架,利用它可以對各種混音通道的增益進行調節,其所有的功能都是通過讀寫/dev/mixer設備文件來完成的:


/*
* mixer.c
*/
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <linux/soundcard.h>

/* 用來存儲所有可用混音設備的名稱 */
const char *sound_device_names[] = SOUND_DEVICE_NAMES;

int fd;                  /* 混音設備所對應的文件描述符 */
int devmask, stereodevs; /* 混音器信息對應的位圖掩碼 */
char *name;

/* 顯示命令的使用方法及所有可用的混音設備 */
void usage()
{
int i;

fprintf(stderr, "usage: %s <device> <left-gain%%> <right-gain%%>\n"
   "       %s <device> <gain%%>\n\n"
   "Where <device> is one of:\n", name, name);
for (i = 0 ; i < SOUND_MIXER_NRDEVICES ; i++)
    if ((1 << i) & devmask) /* 只顯示有效的混音設備 */
      fprintf(stderr, "%s ", sound_device_names[i]);
fprintf(stderr, "\n");
exit(1);
}

int main(int argc, char *argv[])
{
int left, right, level; /* 增益設置 */
int status;              /* 系統調用的返回值 */
int device;              /* 選用的混音設備 */
char *dev;               /* 混音設備的名稱 */
int i;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品国产三级国产普通话三级 | 国产99久久精品| 不卡免费追剧大全电视剧网站| 欧美主播一区二区三区美女| 2024国产精品| 亚洲成a人在线观看| 国产凹凸在线观看一区二区| 69av一区二区三区| 一区二区三区在线影院| 国产经典欧美精品| 日韩一级欧美一级| 亚洲高清免费在线| 91美女在线观看| 国产日韩av一区| 国产在线精品一区二区不卡了| 欧美性受xxxx黑人xyx| √…a在线天堂一区| 国产精品18久久久久久久久 | 国产精品一区二区三区乱码| 欧美日韩国产首页| 亚洲私人黄色宅男| 成人sese在线| 久久久777精品电影网影网| 老司机午夜精品99久久| 欧美日韩国产一二三| 亚洲激情一二三区| 在线视频亚洲一区| 亚洲精品第1页| 91国产丝袜在线播放| 亚洲天堂a在线| 91亚洲大成网污www| 国产精品灌醉下药二区| 不卡一区二区中文字幕| 亚洲国产成人一区二区三区| 国产乱子伦视频一区二区三区 | 成人精品一区二区三区中文字幕| 精品国产乱码久久久久久1区2区 | 欧美一区二区三区电影| 人人狠狠综合久久亚洲| 欧美一区二区三区喷汁尤物| 日本欧美大码aⅴ在线播放| 欧美一区二区免费| 精品一区二区三区免费观看| 精品久久久久久久久久久久久久久| 免费观看一级欧美片| 欧美一区二区三区免费在线看 | 国产精品一二三在| 日韩一区在线免费观看| 91精品1区2区| 日本午夜一本久久久综合| 91麻豆精品国产91久久久资源速度| 欧美aⅴ一区二区三区视频| 精品国产污网站| 国产ts人妖一区二区| 亚洲国产日韩精品| 日韩一区二区不卡| 国内精品嫩模私拍在线| 国产精品国产自产拍在线| 色网站国产精品| 蜜臀av一区二区在线免费观看| 欧美变态tickle挠乳网站| 成人黄页毛片网站| 性欧美疯狂xxxxbbbb| 日韩久久久精品| 99re这里都是精品| 免费看欧美美女黄的网站| 国产视频亚洲色图| 欧美日韩综合不卡| 韩国女主播一区二区三区| 亚洲欧洲精品成人久久奇米网| 91福利在线观看| 精品一区二区三区影院在线午夜 | 欧美一区二区三区思思人| 成人av在线网站| 亚洲成人一区二区| 国产日韩欧美制服另类| 欧美日韩高清影院| 成人一区在线看| 日韩国产精品久久| 国产精品电影院| 精品国产乱码久久久久久免费 | 国产黄色91视频| 一区二区三区四区视频精品免费 | 在线精品视频一区二区三四| 美女视频一区二区| 亚洲小少妇裸体bbw| 中文av一区二区| 日韩一级精品视频在线观看| 99视频有精品| 国产美女主播视频一区| 午夜精品一区二区三区免费视频| 中文字幕精品一区二区精品绿巨人 | 在线观看91视频| 不卡高清视频专区| 国产乱码精品一区二区三区忘忧草 | 亚洲精品成人在线| 欧美国产精品一区二区| 日韩精品一区二区三区在线播放| 欧美在线免费播放| 91蜜桃传媒精品久久久一区二区| 高清国产一区二区| 国产一区二区在线视频| 日韩综合小视频| 亚洲一区二区影院| 最新欧美精品一区二区三区| 国产免费观看久久| 精品福利一二区| 精品三级av在线| 日韩三级免费观看| 日韩一级片网站| 日韩精品一区二区三区三区免费 | 国产高清精品久久久久| 免费成人av在线| 人人狠狠综合久久亚洲| 日日骚欧美日韩| 美女视频网站久久| 看片网站欧美日韩| 国产在线视频精品一区| 狠狠久久亚洲欧美| 国产精品一级二级三级| 国产成人免费在线视频| 国产99久久久久| 成人免费的视频| 99r国产精品| 在线国产亚洲欧美| 欧美丝袜自拍制服另类| 欧美日韩精品系列| 91精品国产欧美一区二区| 日韩视频123| 国产日韩欧美一区二区三区综合| 国产精品素人一区二区| 亚洲欧洲精品一区二区三区 | av一本久道久久综合久久鬼色| 成人av免费观看| 91久久精品一区二区三| 欧美在线观看视频一区二区 | 日韩女优av电影在线观看| 日韩午夜在线观看| 国产喂奶挤奶一区二区三区| 国产精品久久久久影院老司| 亚洲欧美偷拍三级| 亚洲18色成人| 国产一区二区电影| 色综合久久中文综合久久97| 欧美日韩精品一区二区天天拍小说 | 欧美老肥妇做.爰bbww视频| 精品久久免费看| 中文字幕日韩一区| 日日夜夜精品视频天天综合网| 国产一区二区三区四区在线观看| 不卡av在线网| 欧美一级日韩一级| 中文字幕欧美激情| 午夜av一区二区三区| 国产在线一区二区综合免费视频| 99riav久久精品riav| 欧美一区二区三区在线看| 中文字幕一区日韩精品欧美| 日本色综合中文字幕| 国产精品丝袜久久久久久app| 欧美视频在线观看一区二区| 欧美日韩精品一区二区三区 | 另类小说欧美激情| 免费一级片91| 国产一区二区三区久久久| 国产在线视视频有精品| 成人在线一区二区三区| 91浏览器入口在线观看| 欧美亚洲动漫精品| 欧美久久一二三四区| 日韩亚洲电影在线| 中文字幕精品—区二区四季| 1024国产精品| 日韩专区在线视频| 国产高清久久久| 91亚洲精品久久久蜜桃| 51精品久久久久久久蜜臀| 99久久国产综合精品麻豆| 欧美精品日韩一本| 亚洲美女视频在线| 成人美女视频在线观看18| 精品日韩在线一区| 蜜桃视频在线一区| 91精品久久久久久久91蜜桃| 亚洲精选视频在线| 99视频国产精品| 亚洲国产成人自拍| 国产成人午夜精品5599| 精品99999| 精品午夜久久福利影院| 欧美一区二区三区男人的天堂| 亚洲午夜精品17c| 91传媒视频在线播放| 亚洲精品亚洲人成人网| www.欧美日韩| 亚洲日本在线观看| 99国产精品久久久久久久久久| 国产精品动漫网站| 91在线观看美女| 亚洲免费观看在线视频|