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

正文內(nèi)容

第8章linux下音頻設(shè)備編程(編輯修改稿)

2025-03-16 22:41 本頁面
 

【文章內(nèi)容簡介】 D = (08) + (16) + (05) + (04) + (13) + (02) + (10)。 rIISPSR = (25) + 2。 //Prescaler_A/B=2 FCLK (1:2:4),(256fs), rIISCON = (05) + (14) + (13) + (02) + (11)。 //Tx DMA disable,Rx DMA enable,Tx idle,Rx not idle,prescaler enable,stop rIISFCON = (114) + (112)。 //Rx DMA,Rx FIFO start piling.... 開始錄音: //Rx start rIISCON |= 0x1。 錄音完畢將引發(fā) DMA2中斷,如下代碼等待錄音結(jié)束: while(!Rec_Done)。 rINTMSK = BIT_DMA2。 Rec_Done = 0。 //IIS Stop Delay(10)。 //For end of H/W Rx rIISCON = 0x0。 //IIS stop rDMASKTRIG2 = (12)。 //DMA2 stop rIISFCON = 0x0。 //For FIFO flush 錄音完畢,然后播放聲音: Uart_Printf(End of Record!!!\n)。 Uart_Printf(Press any key to play recorded data\n)。 Uart_Printf(If you want to mute or no mute push the 39。EIN039。 key repeatedly\n)。 Uart_Getch()。 size = REC_LEN * 2。 Uart_Printf(Size = %d\n,size)。 Init1341(PLAY)。 pISR_DMA2 = (unsigned)DMA2_Done。 rINTMSK = ~(BIT_DMA2 | BIT_EINT0)。 //DMA2 Initialize rDISRCC2 = (01) + (00)。 //AHB, Increment rDISRC2 = (int)rec_buf。 //0x31000000 rDIDSTC2 = (11) + (10)。 //APB, Fixed rDIDST2 = ((U32)IISFIFO)。 //IISFIFO rDCON2 = (131)+(030)+(129)+(028)+(027)+(024) +(123)+(022)+(120)+(size/2)。 //Handshake, sync PCLK, TC int, single tx, single service, I2SSDO, I2S request, //Autoreload, halfword, size/2 rDMASKTRIG2 = (02)+(11)+0。 //Nostop, DMA2 channel on, Nosw trigger //IIS Initialize //Master,Tx,Lch=low,iis,16bit ch.,CDCLK=256fs,IISCLK=32fs rIISMOD = (08) + (26) + (05) + (04) + (13) + (02) + (10)。 // rIISPSR = (45) + 4。 //Prescaler_A/B=4 for rIISCON = (15)+(04)+(03)+(12)+(11)。 //Tx DMA enable,Tx DMA disable,Tx not idle,Rx idle,prescaler enable,stop rIISFCON = (115) + (113)。 //Tx DMA,Tx FIFO start piling.... Uart_Printf(Press any key to exit!!!\n)。 rIISCON |= 0x1。 //IIS Tx Start while(!Uart_GetKey())。 //IIS Tx Stop Delay(10)。 //For end of H/W Tx rIISCON = 0x0。 //IIS stop rDMASKTRIG2 = (12)。 //DMA2 stop rIISFCON = 0x0。 //For FIFO flush size = 0。 rGPBCON = save_B。 rGPECON = save_E。 rGPBUP = save_PB。 rGPEUP = save_PE。 rINTMSK = (BIT_DMA2 | BIT_EINT0)。 ChangeMPllValue(0xa1,0x3,0x1)。 // FCLK= Uart_Init(0,115200)。 mute = 1。 } 音頻設(shè)備程序的實現(xiàn) 在 Linux下,音頻設(shè)備程序的實現(xiàn)與文件系統(tǒng)的操作密切相關(guān)。 Linux將各種設(shè)備以文件的形式給出統(tǒng)一的接口,這樣的設(shè)計使得對設(shè)備的編程與對文件的操作基本相同,對 Linux內(nèi)核的系統(tǒng)調(diào)用也基本一致,從而簡化了設(shè)備編程。 如何對各種音頻設(shè)備進(jìn)行操作是在 Linux上進(jìn)行音頻編程的關(guān)鍵,通過內(nèi)核提供的一組系統(tǒng)調(diào)用,應(yīng)用程序能夠訪問聲卡驅(qū)動程序提供的各種音頻設(shè)備接口,這是在Linux下進(jìn)行音頻編程最簡單也是最直接的方法。 聲卡不是 Linux控制臺的一部分,它是一個特殊的設(shè)備。聲卡主要提供 3個重要的特征: ? 數(shù)字取樣輸入 /輸出; ? 頻率調(diào)制輸出; ? MIDI接口。 這 3個特征都有它們自己的設(shè)備驅(qū)動程序接口,數(shù)字取樣的接口是 /dev/dsp,頻率調(diào)制的接口 /dev/sequencer,而 MIDI接口是 /dev/midi?;煲粼O(shè)備(如音量、平衡或者貝斯)可以通過 /dev/mixer接口來控制。為了滿足兼容性的需要,還提供了一個/dev/audio設(shè)備,該設(shè)備可用于讀 SUN_law的聲音數(shù)據(jù),但它是映射到數(shù)字取樣設(shè)備的。 音頻編程接口 程序員可以使用 ioctl()來操作這些設(shè)備, ioctl()請求是在 linux/,它們以 SNDCTL_開頭。首先使用 open系統(tǒng)調(diào)用建立起與硬件間的聯(lián)系,此時返回的文件描述符將作為隨后操作的標(biāo)識;接著使用 read系統(tǒng)調(diào)用從設(shè)備接收數(shù)據(jù),或者使用 write系統(tǒng)調(diào)用向設(shè)備寫入數(shù)據(jù),而其他所有不符合讀 /寫這一基本模式的操作都可以由 ioctl系統(tǒng)調(diào)用來完成;最后,使用 close系統(tǒng)調(diào)用告訴 Linux內(nèi)核不會再對該設(shè)備做進(jìn)一步的處理。 1. open系統(tǒng)調(diào)用 系統(tǒng)調(diào)用 open可以獲得對聲卡的訪問權(quán),同時還能為隨后的系統(tǒng)調(diào)用做好準(zhǔn)備,其函數(shù)原型如下所示: int open(const char *pathname, int flags, int mode)。 參數(shù) pathname是將要被打開的設(shè)備文件的名稱,對于聲卡來講一般是 /dev/dsp。參數(shù)flags用來指明應(yīng)該以什么方式打開設(shè)備文件,它可以是 O_RDONLY、 O_WRONLY或者O_RDWR,分別表示以只讀、只寫或者讀寫的方式打開設(shè)備文件;參數(shù) mode通常是可選的,它只有在指定的設(shè)備文件不存在時才會用到,指明新創(chuàng)建的文件應(yīng)該具有怎樣的權(quán)限。如果 open系統(tǒng)調(diào)用能夠成功完成,它將返回一個正整數(shù)作為文件標(biāo)志符,在隨后的系統(tǒng)調(diào)用中需要用到該標(biāo)志符。如果 open系統(tǒng)調(diào)用失敗,它將返回 ?1,同時還會設(shè)置全局變量 errno,指明是什么原因?qū)е铝隋e誤的發(fā)生。 2. read系統(tǒng)調(diào)用 read用來從聲卡讀取數(shù)據(jù): int read(int fd, char *buf, size_t count)。 參數(shù) fd是設(shè)備文件的標(biāo)志符,它是通過之前的 open系統(tǒng)調(diào)用獲得的;參數(shù) buf是指向緩沖區(qū)的字符指針,它用來保存從聲卡獲得的數(shù)據(jù);參數(shù) count則用來限定從聲卡獲得的最大字節(jié)數(shù)。如果 read系統(tǒng)調(diào)用成功完成,它將返回從聲卡實際讀取的字節(jié)數(shù),通常情況會比 count的值小一些;如果 read系統(tǒng)調(diào)用失敗,它將返回 ?1,同時還會設(shè)置全局變量 errno,來指明是什么原因?qū)е铝隋e誤的發(fā)生。 3. write系統(tǒng)調(diào)用 write用來向聲卡寫入數(shù)據(jù),其函數(shù)原型如下所示: size_t write(int fd, const char *buf, size_t count)。 系統(tǒng)調(diào)用 write和系統(tǒng)調(diào)用 read在很大程度是類似的,差別只在于 write是向聲卡寫入數(shù)據(jù),而 read則是從聲卡讀入數(shù)據(jù)。參數(shù) fd同樣是設(shè)備文件的標(biāo)志符,它也是通過之前的open系統(tǒng)調(diào)用獲得的;參數(shù) buf是指向緩沖區(qū)的字符指針,它保存著即將向聲卡寫入的數(shù)據(jù);參數(shù) count則用來限定向聲卡寫入的最大字節(jié)數(shù)。 如果 write系統(tǒng)調(diào)用成功完成,它將返回向聲卡實際寫入的字節(jié)數(shù);如果 write系統(tǒng)調(diào)用失敗,它將返回 ?1,同時還會設(shè)置全局變量 errno,來指明是什么原因?qū)е铝隋e誤的發(fā)生。無論是 read還是 write,一旦調(diào)用之后, Linux內(nèi)核就會阻塞當(dāng)前應(yīng)用程序,直到數(shù)據(jù)成功地從聲卡讀出或者寫入為止。 4. ioctl系統(tǒng)調(diào)用 系統(tǒng)調(diào)用 ioctl可以對聲卡進(jìn)行控制,凡是對設(shè)備文件的操作不符合讀 /寫基本模式的,都是通過 ioctl來完成的,它可以影響設(shè)備的行為,或者返回設(shè)備的狀態(tài),其函數(shù)原型如下所示: int ioctl(int fd, int request, ...)。 參數(shù) fd是設(shè)備文件的標(biāo)志符,它是在設(shè)備打開時獲得的;如果設(shè)備比較復(fù)雜,那么對它的控制請求相應(yīng)地也會有很多種,參數(shù) request的目的就是用來區(qū)分不同的控制請求;通常說來,在對設(shè)備進(jìn)行控制時還需要有其他參數(shù),這要根據(jù)不同的控制請求才能確定,并且可能是與硬件設(shè)備直接相關(guān)的。 5. close系統(tǒng)調(diào)用 當(dāng)應(yīng)用程序使用完聲卡之后,需要用 close系統(tǒng)調(diào)用將其關(guān)閉,以便及時釋放占用的硬件資源,其函數(shù)原型如下所示: int close(int fd)。 參數(shù) fd是設(shè)備文件的標(biāo)志符,它是在設(shè)備打開時獲得的。一旦應(yīng)用程序調(diào)用了 close系統(tǒng)調(diào)用, Linux內(nèi)核就會釋放與之相關(guān)的各種資源,因此建議在不需要的時候盡量及時關(guān)閉已經(jīng)打開的設(shè)備。 音頻設(shè)備文件 ? /dev/sndstat 設(shè)備文件 /dev/sndstat是聲卡驅(qū)動程序提供的最簡單的接口,通常它是一個只讀文件,作用也僅僅只限于匯報聲卡的當(dāng)前狀態(tài)。一般說來, /dev/sndstat是提供給最終用戶來檢測聲卡的,不宜用于程序當(dāng)中,因為所有的信息都可以通過 ioctl系統(tǒng)調(diào)用來獲得。 ? /dev/dsp 聲卡驅(qū)動程序提供的 /dev/dsp是用于數(shù)字采樣和數(shù)字錄音的設(shè)備文件,它對于 Linux下的音頻編程來講非常重要。向該設(shè)備寫數(shù)據(jù)即意味著激活聲卡上的 D/A轉(zhuǎn)換器進(jìn)行放音,而從該設(shè)備讀數(shù)據(jù)則意味著激活聲卡上的 A/D轉(zhuǎn)換器進(jìn)行錄音。目前,許多聲卡都提供有多個數(shù)字采樣設(shè)備,它們在 Linux下可以通過 /dev/dsp等設(shè)備文件進(jìn)行訪問。 ? /dev/audio /dev/audio類似于 /dev/dsp,它兼容于 Sun工作站上的音頻設(shè)備,使用的是 mulaw編碼方式。由于設(shè)備文件 /dev/audio主要出于對兼容性的考慮,所以在新開發(fā)的應(yīng)用程序中最好不要嘗試用它,而應(yīng)該以 /dev/dsp進(jìn)行替代。對于應(yīng)用程序來說,同一時刻只能使用/dev/audio或者 /dev/dsp其中之一,因為它
點擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1