freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

第8章linux下音頻設(shè)備編程-資料下載頁

2025-02-26 22:41本頁面
  

【正文】 對混音器的編程包括如何設(shè)置增益控制器的增益,以及怎樣在不同的音源間進(jìn)行切換,這些操作通常是不連續(xù)的,而且不會(huì)像錄音或者放音那樣需要占用大量的計(jì)算機(jī)資源。由于混音器的操作不符合典型的讀 /寫操作模式,因此除了 open和close兩個(gè)系統(tǒng)調(diào)用之外,大部分的操作都是通過 ioctl系統(tǒng)調(diào)用來完成的。與 /dev/dsp不同, /dev/mixer允許多個(gè)應(yīng)用程序同時(shí)訪問,并且混音器的設(shè)置值會(huì)一直保持到對應(yīng)的設(shè)備文件被關(guān)閉為止。 為了簡化應(yīng)用程序的設(shè)計(jì), Linux上的聲卡驅(qū)動(dòng)程序大多都支持將混音器的 ioctl操作直接應(yīng)用到聲音設(shè)備上,也就是說,如果已經(jīng)打開了 /dev/dsp,那么就不用再打開/dev/mixer來對混音器進(jìn)行操作,而是可以直接用打開 /dev/dsp時(shí)得到的文件標(biāo)志符來設(shè)置混音器。聲卡上的混音器由多個(gè)混音通道組成,它們可以通過驅(qū)動(dòng)程序提供的設(shè)備文件 /dev/mixer進(jìn)行編程。對混音器的操作是通過 ioctl系統(tǒng)調(diào)用來完成的,并且所有控制命令都由 SOUND_MIXER或者 MIXER開頭,表 。 對聲卡的輸入增益和輸出增益進(jìn)行調(diào)節(jié)是混音器的一個(gè)主要作用,目前大部分聲卡采用的是 8位或者 16位的增益控制器,但作為程序員來講并不需要關(guān)心這些,因?yàn)槁暱?qū)動(dòng)程序會(huì)負(fù)責(zé)將它們變換成百分比的形式,也就是說,無論是輸入增益還是輸出增益,其取值范圍都是從 0到 100。在進(jìn)行混音器編程時(shí),可以使用SOUND_MIXER_READ宏來讀取混音通道的增益大小,例如,在獲取麥克風(fēng)的輸入增益時(shí),可以使用如下的代碼: int vol。 ioctl(fd, SOUND_MIXER_READ(SOUND_MIXER_MIC), vol)。 printf(Mic gain is at %d %%\n, vol)。 對于只有一個(gè)混音通道的單聲道設(shè)備來說,返回的增益大小保存在低位字節(jié)中。而對于支持多個(gè)混音通道的雙聲道設(shè)備來說,返回的增益大小實(shí)際上包括兩個(gè)部分,分別代表左、右兩個(gè)聲道的值,其中低位字節(jié)保存左聲道的音量,而高位字節(jié)則保存右聲道的音量。下面的代碼可以從返回值中依次提取左右聲道的增益大小。 int left, right。 left = vol 0xff。 right = (vol 0xff00) 8。 printf(Left gain is %d %%, Right gain is %d %%\n, left, right)。 類似地,如果想設(shè)置混音通道的增益大小,則可以通過SOUND_MIXER_WRITE宏來實(shí)現(xiàn),此時(shí)遵循的原則與獲取增益值時(shí)的原則基本相同,例如,下面的語句可以用來設(shè)置麥克風(fēng)的輸入增益。 vol = (right 8) + left。 ioctl(fd, SOUND_MIXER_WRITE(SOUND_MIXER_MIC), vol)。 在編寫實(shí)用的音頻程序時(shí),混音器是在涉及兼容性時(shí)需要重點(diǎn)考慮的一個(gè)對象,這是因?yàn)椴煌穆暱ㄋ峁┑幕煲羝髻Y源是有所區(qū)別的。聲卡驅(qū)動(dòng)程序提供了多個(gè)ioctl系統(tǒng)調(diào)用來獲得混音器的信息,它們通常返回一個(gè)整型的位掩碼( bitmask),其中每一位分別代表一個(gè)特定的混音通道,如果相應(yīng)的位為 1,則說明與之對應(yīng)的混音通道是可用的。例如,通過 SOUND_ MIXER_READ_DEVMASK返回的位掩碼,可以查詢出能夠被聲卡支持的每一個(gè)混音通道,而通過SOUND_MIXER_READ_RECMAS返回的位掩碼,則可以查詢出能夠被當(dāng)做錄音源的每一個(gè)通道。下面的代碼可以用來檢查 CD輸入是否是一個(gè)有效的混音通道。 ioctl(fd, SOUND_MIXER_READ_DEVMASK, devmask)。 if (devmask SOUND_MIXER_CD) printf(The CD input is supported)。 如果進(jìn)一步還想知道其是不是一個(gè)有效的錄音源,則可以使用如下語句: ioctl(fd, SOUND_MIXER_READ_RECMASK, recmask)。 if (recmask SOUND_MIXER_CD)printf(The CD input can be a recording source)。 目前,大多數(shù)聲卡提供多個(gè)錄音源,通過 SOUND_MIXER_READ_RECSRC可以查詢出當(dāng)前正在使用的錄音源,同一時(shí)刻能夠使用幾個(gè)錄音源是由聲卡硬件決定的。類似地,使用 SOUND_MIXER_WRITE_RECSRC可以設(shè)置聲卡當(dāng)前使用的錄音源,例如,下面的代碼可以將 CD輸入作為聲卡的錄音源使用。 devmask = SOUND_MIXER_CD。 ioctl(fd, SOUND_MIXER_WRITE_RECSRC, devmask)。 此外,所有的混音通道都有單聲道和雙聲道的區(qū)別,如果需要知道哪些混音通道提供了對立體聲的支持,可以通過 SOUND_MIXER_READ_STEREODEVS來獲得。 一個(gè)簡單的混音器控制程序,利用它可以對各種混音通道的增益進(jìn)行調(diào)節(jié),其所有的功能都是通過讀寫 /dev/mixer設(shè)備文件來完成的。 include include include include sys/ include include linux/ /* 用來存儲(chǔ)所有可用混音設(shè)備的名稱 */ const char *sound_device_names[] = SOUND_DEVICE_NAMES。 int fd。 /* 混音設(shè)備所對應(yīng)的文件描述符 */ int devmask, stereodevs。 /* 混音器信息對應(yīng)的位圖掩碼 */ char *name。 /* 顯示命令的使用方法及所有可用的混音設(shè)備 */ void usage(){ int i。 fprintf(stderr, usage: %s device leftgain%% rightgain%%\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) /* 只顯示有效的混音設(shè)備 */ fprintf(stderr, %s , sound_device_names[i])。 fprintf(stderr, \n)。 exit(1)。} int main(int argc, char *argv[]){ int left, right, level。 /* 增益設(shè)置 */ int status。 /* 系統(tǒng)調(diào)用的返回值 */ int device。 /* 選用的混音設(shè)備 */ char *dev。 /* 混音設(shè)備的名稱 */ int i。 name = argv[0]。 /* 以只讀方式打開混音設(shè)備 */ fd = open(/dev/mixer, O_RDONLY)。 if (fd == 1) { perror(unable to open /dev/mixer)。 exit(1)。 } /* 獲得所需要的信息 */ status = ioctl(fd, SOUND_MIXER_READ_DEVMASK, devmask)。 if (status == 1) perror(SOUND_MIXER_READ_DEVMASK ioctl failed)。 status = ioctl(fd, SOUND_MIXER_READ_STEREODEVS, stereodevs)。 if (status == 1) perror(SOUND_MIXER_READ_STEREODEVS ioctl failed)。 /* 檢查用戶輸入 */ if (argc != 3 argc != 4) usage()。 /* 保存用戶輸入的混音器名稱 */ dev = argv[1]。 /* 確定即將用到的混音設(shè)備 */ for (i = 0 。 i SOUND_MIXER_NRDEVICES 。 i++) if(((1 i) devmask) !strcmp(dev, sound_device_names[i])) break。 if (i == SOUND_MIXER_NRDEVICES) { /* 沒有找到匹配項(xiàng) */ fprintf(stderr, %s is not a valid mixer device\n, dev)。 usage()。 } /* 查找到有效的混音設(shè)備 */ device = i。 /* 獲取增益值 */ if (argc == 4) { /* 左、右聲道均給定 */ left = atoi(argv[2])。 right = atoi(argv[3])。 } else { /* 左、右聲道設(shè)為相等 */ left = atoi(argv[2])。 right = atoi(argv[2])。 } /* 對非立體聲設(shè)備給出警告信息 */ if ((left != right) !((1 i) stereodevs)) { fprintf(stderr, warning: %s is not a stereo device\n, dev)。 } /* 將兩個(gè)聲道的值合到同一變量中 */ level = (right 8) + left。 /* 設(shè)置增益 */ status = ioctl(fd, MIXER_WRITE(device), level)。 if (status == 1) { perror(MIXER_WRITE ioctl failed)。 exit(1)。 } /* 獲得從驅(qū)動(dòng)返回的左右聲道的增益 */ left = level 0xff。 right = (level 0xff00) 8。 /* 顯示實(shí)際設(shè)置的增益 */ fprintf(stderr, %s gain set to %d%% / %d%%\n, dev, left, right)。 /* 關(guān)閉混音設(shè)備 */ close(fd)。 return 0。} 綜合訓(xùn)練之媒體播放器移植 在解壓縮得到的 mkall,這個(gè)文件是一個(gè)編譯腳本,在該目錄下直接執(zhí)行: $ ./ mkall 該腳本將配置并編譯 mplayer,下面是該腳本所進(jìn)行的配置和編譯命令: ./configure cc=usr/local/arm/target=armlinux –withextralibdir=/usr/local/arm/–withextraincdir=/usr/ local/arm/–enablestatic –disable dvdnav –disabletv –disablegui –disablempdvdkit –enablelinuxdevfs make 編譯成功后,將在 mplayer文件,該文件為 mplayer媒體播放程序。 2.下載運(yùn)行 啟動(dòng)目標(biāo)板后,以網(wǎng)絡(luò)移動(dòng)的方式下載應(yīng)用程序。首先把 mplayer復(fù)制到 ftp共享目錄,在 PC端執(zhí)行: cp mplayer /home/ftp 在 SBC2410X端進(jìn)入 bin目錄,并登錄 ftp服務(wù)器: cd /bin ftp 然后下載 mplayer和測試視頻文件,并修改 mplayer可執(zhí)行權(quán)限: get mplayer get bye chmod a+x mplayer 最后在命令行下輸入如下命令: mplayer –vo
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1