alsa編程
A. 蘋果手機是什麼系統,安卓系統又是什麼
蘋果是自己開發的IOS系統,安卓是谷歌推出的用於移動設備的系統。
iOS是由蘋果公司開發的移動操作系統。蘋果公司最早於2007年1月9日的Macworld大會上公布這個系統,最初是設計給iPhone使用的,後來陸續套用到iPod touch、iPad上。
安卓(Android)是一種基於linux內核(不包含GNU組件)的自由及開放源代碼的操作系統。主要使用於移動設備,如智能手機和平板電腦,由美國Google公司和開放手機聯盟領導及開發。
iOS系統的優勢
1、軟體與硬體整合度高
iOS系統的軟體與硬體的整合度相當高,使其分化大大降低。這樣也增加了整個系統的穩定性,手機很少出現死機、無響應的情況。
2、界面美觀、易操作
蘋果在界面設計上投入了很多精力,無論是從外觀性還是到易用性,iOS都致力於為使用者提供最直觀的用戶體驗。
3、安全性強
蘋果對iOS生態採取了封閉的措施,並建立了完整的開發者認證和應用審核機制,因而惡意程序基本上沒有登台亮相的機會。iOS設備使用嚴格的安全技術和功能,並且使用方便。
4、應用數量多、品質高
iOS平台擁有數量龐大的app和第三方開發者,幾乎每類app都有數千款。
B. alsa音效卡編程怎麼改變聲音大小
首先,如果機器有多於一個音效卡,可以...最後,alsa設置了一個defaults設備,音頻播放軟體默認使用defaults設備
C. 安卓與Linux有什麼關系
安卓不是linux
引用:
Linux Kernel的維護者Greg Kroah-Hartman宣布,將Android 代碼從 Linux kernel 代碼庫中刪除。這意味著,Linux Kernel的開發小組不認可Android的貢獻,兩者產生了沖突。
Greg Kroah-Hartman寫了一篇詳細的文章,解釋這個決定。下面就來看看,他是怎麼說的,以及Android到底是一個什麼樣的系統。在這之前,你最好知道Greg Kroah-Hartman是誰。他是目前Linux Kernel的核心開發人員,負責stable軟體包的發布。就是說,每一個新版本的Linux Kernel,都是經過他的手流出來的。此外,他還負責硬體驅動的部署。而他的手機就是HTC G1,每天都在使用。所以,他是絕對有資格談論這個問題的,他的看法代表了Linux社區對Android的看法。首先,他指出Android和其他的Linux發行版不一樣:「Google has taken the Linux kernel, and nothing else from a 「traditional」 Linux system.
Google只用了kernel,別的東西都沒用。」這就是說,與Ubuntu、Debian、Redhat這樣的傳統Linux發行版相比,只有系統的底層結構是一樣的,其他東西在Android里都不一樣,尤其是程序員的編程介面是完全不同的。因此,Android應用程序都必須重新寫過,現存的Linux程序無法移植上去。所以,從嚴格意義上說,Android是一種全新的系統,它與Linux的距離,比Mac OS與Linux的距離還要遠。然後,Greg Kroah-Hartman肯定了Android這樣做的積極意義:
「Android also solves the problem that the phone manufacturers had been having for many years: a free version of java and a unified application layer that programmers can write to that will work on all phone platforms that integrate it.
它解決了長期令手機製造商頭痛不已的問題:業界缺乏一個開源的Java虛擬機,以及統一的應用程序介面。現在,程序員只要寫一次程序,就能在各種手機硬體平台之上使用。」這段話解釋了,為什麼Android的應用程序,都必須用Java語言開發。因為不這樣做的話,沒法讓程序做到硬體無關。且慢,這真的是理由嗎?傳統的Linux系統,也並不依賴特定的硬體啊!只要把源代碼根據不同的平台,分別編譯一下,同一個程序不也照樣可以在不同的硬體架構、不同的Linux發行版中使用嗎?那麼,Android只採用kernel、只允許用java編程的真正原因,到底是什麼?台灣的科技網志MMDays一語道破真相:「Linux kernel的版權是GPL。
這下問題來了:如果你是硬體廠商,希望你的硬體能在 Linux kernel 下運作,那麼就必須要有驅動程序。如果驅動程序的程序代碼公開,等於硬體規格也公開的差不多了。許多廠商不願意這么做,所以就提供編好的驅動程序,但不提供原始碼。Android 的重點就是商業應用,Google採用了一些手法來繞過這問題。他們把驅動程序移到 「userspace」,也就是說,把驅動程序變成在 Linux kernel 上頭跑,而不是一起跑的東西,這樣就可以避過GPL。然後,在 kernel 這邊開個小門,讓本來不能直接控制到硬體的 「userspace」 程序也可以碰得到,這樣只要把」開個小門」的程序代碼公布就行啦。」看明白了嗎?這段話的意思是說,Google玩了一個花招,在kernel和應用程序之間,自己做了一個中間層,這樣就既不違反GPL許可,又能不讓外界看到廠商的硬體驅動和應用程序的源碼。這樣做或許有利於推廣Android,吸引廠商和軟體開發商的加入,但是也給Linux Kernel帶來了麻煩。Greg Kroah-Hartman直截了當說出了自己的不滿。「…any drivers written for Android hardware platforms, can not get merged into the main kernel tree because they have dependencies on code that only lives in Google』s kernel tree, causing it to fail to build in the kernel.org tree.
所有為Android寫的硬體驅動,都不能合並入kernel。因為它們只在Google的代碼里有效,在kernel里根本沒法用。
Because of this, Google has now prevented a large chunk of hardware drivers and platform code from ever getting merged into the main kernel tree. Effectively creating a kernel branch that a number of different vendors are now relying on.
由於這個原因,Google也從不把大量的硬體驅動程序和平台源碼向kernel提交。實際上,它創造出了一個kernel的分支,大量的開發者都依賴那個分支。」這就是Android乾的事情:它修改了Kernel,但是又不提供修改的細節,自己搞了一個封閉的系統。說得難聽一點,它利用了開源社區,要求開源社區為它做貢獻,卻又不願提供回報。所以,Linux Kernel就把Android踢出去了,真是再正常不過了。完整的文章在這里: http://hi..com/dongfengxiao/blog/item/5722821e3418da12403417e6.html/cmtid/a8b7f61b52f892dbad6e75a0
D. 安卓手機是什麼意思/
安卓手機是指Android操作系統。
Android是一種基於Linux的自由及開放源代碼的操作系統。主要使用於移動設備,如智能手機和平板電腦,由Google(谷歌)公司和開放手機聯盟領導及開發。尚未有統一中文名稱,中國大陸地區較多人使用「安卓」或「安致」。
Android操作系統最初由Andy Rubin開發,主要支持手機。2005年8月由Google收購注資。2007年11月,Google與84家硬體製造商、軟體開發商及電信營運商組建開放手機聯盟共同研發改良Android系統。
(4)alsa編程擴展閱讀:
系統特點
1、界面
Android的默認用戶界面主要基於直接操作,透過觸控鬆散地對應現實動作以作出輸入,例如滑動、點擊、捏動和反向擠壓,隨著虛擬鍵盤,以操控屏幕上的對象。游戲控制器及物理鍵盤都能透過藍牙或USB得到支持。
2、應用程序
應用程序(簡稱apps)是擴展設備功能的軟體,都是利用Android軟體開發工具包(SDK)編寫的,通常是Java編程語言。Java可以與C語言或C++結合使用,並且可以選擇非默認的運行時庫共享,以允許獲得更好的C++支持。
3、內存管理
於Android設備通常採用電池供電,因此Android旨在管理流程以將耗電降至最低。當應用程序未使用時,系統會暫停其操作,雖然可以在關閉期間立即使用,但它並不會使用電池電源或CPU資源。
參考資料來源:網路-安卓手機
E. 如何在Linux平台下開發實際的音頻應用程序
一、數字音頻音頻信號是一種連續變化的模擬信號,但計算機只能處理和記錄二進制的數字信號,由自然音源得到的音頻信號必須經過一定的變換,成為數字音頻信號之後,才能送到計算機中作進一步的處理。數字音頻系統通過將聲波的波型轉換成一系列二進制數據,來實現對原始聲音的重現,實現這一步驟的設備常被稱為模/數轉換器(A/D)。A/D轉換器以每秒鍾上萬次的速率對聲波進行采樣,每個采樣點都記錄下了原始模擬聲波在某一時刻的狀態,通常稱之為樣本(sample),而每一秒鍾所采樣的數目則稱為采樣頻率,通過將一串連續的樣本連接起來,就可以在計算機中描述一段聲音了。對於采樣過程中的每一個樣本來說,數字音頻系統會分配一定存儲位來記錄聲波的振幅,一般稱之為采樣分辯率或者采樣精度,采樣精度越高,聲音還原時就會越細膩。數字音頻涉及到的概念非常多,對於在Linux下進行音頻編程的程序員來說,最重要的是理解聲音數字化的兩個關鍵步驟:采樣和量化。采樣就是每隔一定時間就讀一次聲音信號的幅度,而量化則是將采樣得到的聲音信號幅度轉換為數字值,從本質上講,采樣是時間上的數字化,而量化則是幅度上的數字化。下面介紹幾個在進行音頻編程時經常需要用到的技術指標:1. 采樣頻率采樣頻率是指將模擬聲音波形進行數字化時,每秒鍾抽取聲波幅度樣本的次數。采樣頻率的選擇應該遵循奈奎斯特(Harry Nyquist)采樣理論:如果對某一模擬信號進行采樣,則采樣後可還原的最高信號頻率只有采樣頻率的一半,或者說只要采樣頻率高於輸入信號最高頻率的兩倍,就能從采樣信號系列重構原始信號。正常人聽覺的頻率范圍大約在20Hz~20kHz之間,根據奈奎斯特采樣理論,為了保證聲音不失真,采樣頻率應該在40kHz左右。常用的音頻采樣頻率有8kHz、11.025kHz、22.05kHz、16kHz、37.8kHz、44.1kHz、48kHz等,如果採用更高的采樣頻率,還可以達到DVD的音質。2. 量化位數量化位數是對模擬音頻信號的幅度進行數字化,它決定了模擬信號數字化以後的動態范圍,常用的有8位、12位和16位。量化位越高,信號的動態范圍越大,數字化後的音頻信號就越可能接近原始信號,但所需要的存貯空間也越大。3. 聲道數聲道數是反映音頻數字化質量的另一個重要因素,它有單聲道和雙聲道之分。雙聲道又稱為立體聲,在硬體中有兩條線路,音質和音色都要優於單聲道,但數字化後占據的存儲空間的大小要比單聲道多一倍二、音效卡驅動出於對安全性方面的考慮,Linux下的應用程序無法直接對音效卡這類硬體設備進行操作,而是必須通過內核提供的驅動程序才能完成。在Linux上進行音頻編程的本質就是要藉助於驅動程序,來完成對音效卡的各種操作。對硬體的控制涉及到寄存器中各個比特位的操作,通常這是與設備直接相關並且對時序的要求非常嚴格,如果這些工作都交由應用程序員來負責,那麼對音效卡的編程將變得異常復雜而困難起來,驅動程序的作用正是要屏蔽硬體的這些底層細節,從而簡化應用程序的編寫。目前Linux下常用的音效卡驅動程序主要有兩種:OSS和ALSA。最早出現在Linux上的音頻編程介面是OSS(Open Sound System),它由一套完整的內核驅動程序模塊組成,可以為絕大多數音效卡提供統一的編程介面。OSS出現的歷史相對較長,這些內核模塊中的一部分(OSS/Free)是與Linux內核源碼共同免費發布的,另外一些則以二進制的形式由4Front Technologies公司提供。由於得到了商業公司的鼎力支持,OSS已經成為在Linux下進行音頻編程的事實標准,支持OSS的應用程序能夠在絕大多數音效卡上工作良好。雖然OSS已經非常成熟,但它畢竟是一個沒有完全開放源代碼的商業產品,ALSA(Advanced Linux Sound Architecture)恰好彌補了這一空白,它是在Linux下進行音頻編程時另一個可供選擇的音效卡驅動程序。ALSA除了像OSS那樣提供了一組內核驅動程序模塊之外,還專門為簡化應用程序的編寫提供了相應的函數庫,與OSS提供的基於ioctl的原始編程介面相比,ALSA函數庫使用起來要更加方便一些。ALSA的主要特點有:支持多種音效卡設備模塊化的內核驅動程序支持SMP和多線程提供應用開發函數庫兼容OSS應用程序ALSA和OSS最大的不同之處在於ALSA是由志願者維護的自由項目,而OSS則是由公司提供的商業產品,因此在對硬體的適應程度上OSS要優於ALSA,它能夠支持的音效卡種類更多。ALSA雖然不及OSS運用得廣泛,但卻具有更加友好的編程介面,並且完全兼容於OSS,對應用程序員來講無疑是一個更佳的選擇。三、編程介面如何對各種音頻設備進行操作是在Linux上進行音頻編程的關鍵,通過內核提供的一組系統調用,應用程序能夠訪問音效卡驅動程序提供的各種音頻設備介面,這是在Linux下進行音頻編程最簡單也是最直接的方法。3.1 訪問音頻設備無論是OSS還是ALSA,都是以內核驅動程序的形式運行在Linux內核空間中的,應用程序要想訪問音效卡這一硬體設備,必須藉助於Linux內核所提供的系統調用(system call)。從程序員的角度來說,對音效卡的操作在很大程度上等同於對磁碟文件的操作:首先使用open系統調用建立起與硬體間的聯系,此時返回的文件描述符將作為隨後操作的標識;接著使用read系統調用從設備接收數據,或者使用write系統調用向設備寫入數據,而其它所有不符合讀/寫這一基本模式的操作都可以由ioctl系統調用來完成;最後,使用close系統調用告訴Linux內核不會再對該設備做進一步的處理。· open系統調用系統調用open可以獲得對音效卡的訪問權,同時還能為隨後的系統調用做好准備,其函數原型如下所示: int open(const char *pathname, int flags, int mode);參數pathname是將要被打開的設備文件的名稱,對於音效卡來講一般是/dev/dsp。參數flags用來指明應該以什麼方式打開設備文件,它可以是O_RDONLY、O_WRONLY或者O_RDWR,分別表示以只讀、只寫或者讀寫的方式打開設備文件;參數mode通常是可選的,它只有在指定的設備文件不存在時才會用到,指明新創建的文件應該具有怎樣的許可權。如果open系統調用能夠成功完成,它將返回一個正整數作為文件標識符,在隨後的系統調用中需要用到該標識符。如果open系統調用失敗,它將返回-1,同時還會設置全局變數errno,指明是什麼原因導致了錯誤的發生。· read系統調用系統調用read用來從音效卡讀取數據,其函數原型如下所示: int read(int fd, char *buf, size_t count);參數fd是設備文件的標識符,它是通過之前的open系統調用獲得的;參數buf是指向緩沖區的字元指針,它用來保存從音效卡獲得的數據;參數count則用來限定從音效卡獲得的最大位元組數。如果read系統調用成功完成,它將返回從音效卡實際讀取的位元組數,通常情況會比count的值要小一些;如果read系統調用失敗,它將返回-1,同時還會設置全局變數errno,來指明是什麼原因導致了錯誤的發生。write系統調用系統調用write用來向音效卡寫入數據,其函數原型如下所示: size_t write(int fd, const char *buf, size_t count);系統調用write和系統調用read在很大程度是類似的,差別只在於write是向音效卡寫入數據,而read則是從音效卡讀入數據。參數fd同樣是設備文件的標識符,它也是通過之前的open系統調用獲得的;參數buf是指向緩沖區的字元指針,它保存著即將向音效卡寫入的數據;參數count則用來限定向音效卡寫入的最大位元組數。如果write系統調用成功完成,它將返迴向音效卡實際寫入的位元組數;如果read系統調用失敗,它將返回-1,同時還會設置全局變數errno,來指明是什麼原因導致了錯誤的發生。無論是read還是write,一旦調用之後Linux內核就會阻塞當前應用程序,直到數據成功地從音效卡讀出或者寫入為止。ioctl系統調用系統調用ioctl可以對音效卡進行控制,凡是對設備文件的操作不符合讀/寫基本模式的,都是通過ioctl來完成的,它可以影響設備的行為,或者返回設備的狀態,其函數原型如下所示: int ioctl(int fd, int request, ...);參數fd是設備文件的標識符,它是在設備打開時獲得的;如果設備比較復雜,那麼對它的控制請求相應地也會有很多種,參數request的目的就是用來區分不同的控制請求;通常說來,在對設備進行控制時還需要有其它參數,這要根據不同的控制請求才能確定,並且可能是與硬體設備直接相關的。close系統調用當應用程序使用完音效卡之後,需要用close系統調用將其關閉,以便及時釋放佔用的硬體資源,其函數原型如下所示: int close(int fd);參數fd是設備文件的標識符,它是在設備打開時獲得的。一旦應用程序調用了close系統調用,Linux內核就會釋放與之相關的各種資源,因此建議在不需要的時候盡量及時關閉已經打開的設備。3.2 音頻設備文件對於Linux應用程序員來講,音頻編程介面實際上就是一組音頻設備文件,通過它們可以從音效卡讀取數據,或者向音效卡寫入數據,並且能夠對音效卡進行控制,設置采樣頻率和聲道數目等等。/dev/sndstat設備文件/dev/sndstat是音效卡驅動程序提供的最簡單的介面,通常它是一個只讀文件,作用也僅僅只限於匯報音效卡的當前狀態。一般說來,/dev/sndstat是提供給最終用戶來檢測音效卡的,不宜用於程序當中,因為所有的信息都可以通過ioctl系統調用來獲得。 Linux提供的cat命令可以很方便地從/dev/sndstat獲得音效卡的當前狀態: [xiaowp@linuxgam sound]$ cat /dev/sndstat /dev/dsp音效卡驅動程序提供的/dev/dsp是用於數字采樣(sampling)和數字錄音(recording)的設備文件,它對於Linux下的音頻編程來講非常重要:向該設備寫數據即意味著激活音效卡上的D/A轉換器進行放音,而向該設備讀數據則意味著激活音效卡上的A/D轉換器進行錄音。目前許多音效卡都提供有多個數字采樣設備,它們在Linux下可以通過/dev/dsp1等設備文件進行訪問。DSP是數字信號處理器(Digital Signal Processor)的簡稱,它是用來進行數字信號處理的特殊晶元,音效卡使用它來實現模擬信號和數字信號的轉換。音效卡中的DSP設備實際上包含兩個組成部分:在以只讀方式打開時,能夠使用A/D轉換器進行聲音的輸入;而在以只寫方式打開時,則能夠使用D/A轉換器進行聲音的輸出。嚴格說來,Linux下的應用程序要麼以只讀方式打開/dev/dsp輸入聲音,要麼以只寫方式打開/dev/dsp輸出聲音,但事實上某些音效卡驅動程序仍允許以讀寫的方式打開/dev/dsp,以便同時進行聲音的輸入和輸出,這對於某些應用場合(如IP電話)來講是非常關鍵的。在從DSP設備讀取數據時,從音效卡輸入的模擬信號經過A/D轉換器變成數字采樣後的樣本(sample),保存在音效卡驅動程序的內核緩沖區中,當應用程序通過read系統調用從音效卡讀取數據時,保存在內核緩沖區中的數字采樣結果將被復制到應用程序所指定的用戶緩沖區中。需要指出的是,音效卡采樣頻率是由內核中的驅動程序所決定的,而不取決於應用程序從音效卡讀取數據的速度。如果應用程序讀取數據的速度過慢,以致低於音效卡的采樣頻率,那麼多餘的數據將會被丟棄;如果讀取數據的速度過快,以致高於音效卡的采樣頻率,那麼音效卡驅動程序將會阻塞那些請求數據的應用程序,直到新的數據到來為止。在向DSP設備寫入數據時,數字信號會經過D/A轉換器變成模擬信號,然後產生出聲音。應用程序寫入數據的速度同樣應該與音效卡的采樣頻率相匹配,否則過慢的話會產生聲音暫停或者停頓的現象,過快的話又會被內核中的音效卡驅動程序阻塞,直到硬體有能力處理新的數據為止。與其它設備有所不同,音效卡通常不會支持非阻塞(non-blocking)的I/O操作。無論是從音效卡讀取數據,或是向音效卡寫入數據,事實上都具有特定的格式(format),默認為8位無符號數據、單聲道、8KHz采樣率,如果默認值無法達到要求,可以通過ioctl系統調用來改變它們。通常說來,在應用程序中打開設備文件/dev/dsp之後,接下去就應該為其設置恰當的格式,然後才能從音效卡讀取或者寫入數據。/dev/audio/dev/audio類似於/dev/dsp,它兼容於Sun工作站上的音頻設備,使用的是mu-law編碼方式。如果音效卡驅動程序提供了對/dev/audio的支持,那麼在Linux上就可以通過cat命令,來播放在Sun工作站上用mu-law進行編碼的音頻文件: [xiaowp@linuxgam sound]$ cat audio.au > /dev/audio由於設備文件/dev/audio主要出於對兼容性的考慮,所以在新開發的應用程序中最好不要嘗試用它,而應該以/dev/dsp進行替代。對於應用程序來說,同一時刻只能使用/dev/audio或者/dev/dsp其中之一,因為它們是相同硬體的不同軟體介面。/dev/mixer在音效卡的硬體電路中,混音器(mixer)是一個很重要的組成部分,它的作用是將多個信號組合或者疊加在一起,對於不同的音效卡來說,其混音器的作用可能各不相同。運行在Linux內核中的音效卡驅動程序一般都會提供/dev/mixer這一設備文件,它是應用程序對混音器進行操作的軟體介面。混音器電路通常由兩個部分組成:輸入混音器(input mixer)和輸出混音器(output mixer)。輸入混音器負責從多個不同的信號源接收模擬信號,這些信號源有時也被稱為混音通道或者混音設備。模擬信號通過增益控制器和由軟體控制的音量調節器後,在不同的混音通道中進行級別(level)調制,然後被送到輸入混音器中進行聲音的合成。混音器上的電子開關可以控制哪些通道中有信號與混音器相連,有些音效卡只允許連接一個混音通道作為錄音的音源,而有些音效卡則允許對混音通道做任意的連接。經過輸入混音器處理後的信號仍然為模擬信號,它們將被送到A/D轉換器進行數字化處理。輸出混音器的工作原理與輸入混音器類似,同樣也有多個信號源與混音器相連,並且事先都經過了增益調節。當輸出混音器對所有的模擬信號進行了混合之後,通常還會有一個總控增益調節器來控制輸出聲音的大小,此外還有一些音調控制器來調節輸出聲音的音調。經過輸出混音器處理後的信號也是模擬信號,它們最終會被送給喇叭或者其它的模擬輸出設備。對混音器的編程包括如何設置增益控制器的級別,以及怎樣在不同的音源間進行切換,這些操作通常來講是不連續的,而且不會像錄音或者放音那樣需要佔用大量的計算機資源。由於混音器的操作不符合典型的讀/寫操作模式,因此除了open和close兩個系統調用之外,大部分的操作都是通過ioctl系統調用來完成的。與/dev/dsp不同,/dev/mixer允許多個應用程序同時訪問,並且混音器的設置值會一直保持到對應的設備文件被關閉為止。為了簡化應用程序的設計,Linux上的音效卡驅動程序大多都支持將混音器的ioctl操作直接應用到聲音設備上,也就是說如果已經打開了/dev/dsp,那麼就不用再打開/dev/mixer來對混音器進行操作,而是可以直接用打開/dev/dsp時得到的文件標識符來設置混音器。/dev/sequencer目前大多數音效卡驅動程序還會提供/dev/sequencer這一設備文件,用來對音效卡內建的波表合成器進行操作,或者對MIDI匯流排上的樂器進行控制,一般只用於計算機音樂軟體中。 四、應用框架在Linux下進行音頻編程時,重點在於如何正確地操作音效卡驅動程序所提供的各種設備文件,由於涉及到的概念和因素比較多,所以遵循一個通用的框架無疑將有助於簡化應用程序的設計。4.1 DSP編程對音效卡進行編程時首先要做的是打開與之對應的硬體設備,這是藉助於open系統調用來完成的,並且一般情況下使用的是/dev/dsp文件。採用何種模式對音效卡進行操作也必須在打開設備時指定,對於不支持全雙工的音效卡來說,應該使用只讀或者只寫的方式打開,只有那些支持全雙工的音效卡,才能以讀寫的方式打開,並且還要依賴於驅動程序的具體實現。Linux允許應用程序多次打開或者關閉與音效卡對應的設備文件,從而能夠很方便地在放音狀態和錄音狀態之間進行切換,建議在進行音頻編程時只要有可能就盡量使用只讀或者只寫的方式打開設備文件,因為這樣不僅能夠充分利用音效卡的硬體資源,而且還有利於驅動程序的優化。下面的代碼示範了如何以只寫方式打開音效卡進行放音(playback)操作: int handle = open("/dev/dsp", O_WRONLY);if (handle == -1) { perror("open /dev/dsp"); return -1;} 運行在Linux內核中的音效卡驅動程序專門維護了一個緩沖區,其大小會影響到放音和錄音時的效果,使用ioctl系統調用可以對它的尺寸進行恰當的設置。調節驅動程序中緩沖區大小的操作不是必須的,如果沒有特殊的要求,一般採用默認的緩沖區大小也就可以了。但需要注意的是,緩沖區大小的設置通常應緊跟在設備文件打開之後,這是因為對音效卡的其它操作有可能會導致驅動程序無法再修改其緩沖區的大小。下面的代碼示範了怎樣設置音效卡驅動程序中的內核緩沖區的大小: int setting = 0xnnnnssss;int result = ioctl(handle, SNDCTL_DSP_SETFRAGMENT, &setting);if (result == -1) { perror("ioctl buffer size"); return -1;}// 檢查設置值的正確性 在設置緩沖區大小時,參數setting實際上由兩部分組成,其低16位標明緩沖區的尺寸,相應的計算公式為buffer_size = 2^ssss,即若參數setting低16位的值為16,那麼相應的緩沖區的大小會被設置為65536位元組。參數setting的高16位則用來標明分片(fragment)的最大序號,它的取值范圍從2一直到0x7FFF,其中0x7FFF表示沒有任何限制。接下來要做的是設置音效卡工作時的聲道(channel)數目,根據硬體設備和驅動程序的具體情況,可以將其設置為0(單聲道,mono)或者1(立體聲,stereo)。下面的代碼示範了應該怎樣設置聲道數目: int channels = 0; // 0=mono 1=stereoint result = ioctl(handle, SNDCTL_DSP_STEREO, &channels);if ( result == -1 ) { perror("ioctl channel number"); return -1;}if (channels != 0) { // 只支持立體聲} 采樣格式和采樣頻率是在進行音頻編程時需要考慮的另一個問題,音效卡支持的所有采樣格式可以在頭文件soundcard.h中找到,而通過ioctl系統調用則可以很方便地更改當前所使用的采樣格式。下面的代碼示範了如何設置音效卡的采樣格式: int format = AFMT_U8;int result = ioctl(handle, SNDCTL_DSP_SETFMT, &format);if ( result == -1 ) { perror("ioctl sample format"); return -1;}// 檢查設置值的正確性 音效卡采樣頻率的設置也非常容易,只需在調用ioctl時將第二個參數的值設置為SNDCTL_DSP_SPEED,同時在第三個參數中指定采樣頻率的數值就行了。對於大多數音效卡來說,其支持的采樣頻率范圍一般為5kHz到44.1kHz或者48kHz,但並不意味著該范圍內的所有頻率都會被硬體支持,在Linux下進行音頻編程時最常用到的幾種采樣頻率是11025Hz、16000Hz、22050Hz、32000Hz和44100Hz。下面的代碼示範了如何設置音效卡的采樣頻率: int rate = 22050;int result = ioctl(handle, SNDCTL_DSP_SPEED, &rate);if ( result == -1 ) { perror("ioctl sample format"); return -1;}// 檢查設置值的正確性 4.2 Mixer編程音效卡上的混音器由多個混音通道組成,它們可以通過驅動程序提供的設備文件/dev/mixer進行編程。對混音器的操作是通過ioctl系統調用來完成的,並且所有控制命令都由SOUND_MIXER或者MIXER開頭,表1列出了常用的幾個混音器控制命令:名稱作用SOUND_MIXER_VOLUME主音量調節SOUND_MIXER_BASS低音控制SOUND_MIXER_TREBLE高音控制SOUND_MIXER_SYNTHFM合成器SOUND_MIXER_PCM主D/A轉換器SOUND_MIXER_SPEAKERPC喇叭SOUND_MIXER_LINE音頻線輸入SOUND_MIXER_MIC麥克風輸入SOUND_MIXER_CDCD輸入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); 對於只有一個混音通道的單聲道設備來說,返回的增益大小保存在低位位元組中。而對於支持多個混音通道的雙聲道設備來說,返回的增益大小實際上包括兩個部分,分別代表左、右兩個聲道的值,其中低位位元組保存左聲道的音量,而高位位元組則保存右聲道的音量。下面的代碼可以從返回值中依次提取左右聲道的增益大小�4.3 音頻錄放框架下面給出一個利用音效卡上的DSP設備進行聲音錄制和回放的基本框架,它的功能是先錄制幾秒種音頻數據,將其存放在內存緩沖區中,然後再進行回放,其所有的功能都是通過讀寫/dev/dsp設備文件來完成的: /* * sound.c */#include #include #include #include #include #include #include #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 #include #include #include #include #include /* 用來存儲所有可用混音設備的名稱 */const char *sound_device_names[] = SOUND_DEVICE_NAMES; int fd; /* 混音設備所對應的文件描述符 */int devmask, stereodevs; /* 混音器信息對應的點陣圖掩碼 */char *name; /* 顯示命令的使用方法及所有可用的混音設備 */void usage(){ int i; fprintf(stderr, "usage: %s \n" " %s \n\n" "Where is one of:\n", name, name); for (i = 0 ; i < SOUND_MIXER_NRDEVICES ; i++) if ((1
F. 跳舞時怎麼讓屏幕隨著節奏晃動
實現屏幕隨節奏晃動的效果,可以通過編程來實現。使用C++或Python等編程語言,結合圖形庫或游戲引擎,編寫程序捕捉音頻節奏,通過調整屏幕位置或大小來實現動態的晃動效果。音頻處理庫可以分析音頻節奏,從而精準控制屏幕的響應。
此外,也可以利用現有的軟體或應用程序。很多音樂播放器、視頻編輯軟體和跳舞游戲都內置了節奏感應功能。通過調整設置或載入插件,您可以輕松實現屏幕的自動晃動,與音樂或舞蹈的節奏同步。
另一種選擇是使用音頻可視化軟體。這類軟體能夠實時分析音頻,並將其轉化為圖形或動畫效果。通過監測音頻節奏,您可以將其表現為屏幕的動態晃動效果。無論是編程實現還是利用現有軟體,關鍵在於確保屏幕晃動與音樂節奏保持一致,以提升表演效果。
編程實現時,首先需要通過音頻處理庫捕捉音頻文件的節奏信息。然後,根據節奏信息,調整屏幕的位置或大小,實現隨節奏晃動的效果。這需要編寫相應的演算法來解析音頻數據,並將其轉化為視覺反饋。
利用現有軟體時,可以找到那些支持節奏感應功能的軟體。例如,一些音樂播放器和跳舞游戲通常會提供這種功能。您只需在設置中啟用相應的選項,或者下載並安裝插件,即可實現屏幕的自動晃動效果。這種方式相對簡單,適合不具備編程經驗的用戶。
使用音頻可視化軟體時,這類軟體通常能夠分析音頻文件,並將其轉化為圖形或動畫效果。通過監測音頻節奏,您可以將這種效果轉化為屏幕的動態晃動。這類軟體通常提供實時分析功能,能夠即時響應音頻變化,從而實現流暢的視覺效果。
無論採用哪種方法,都需要確保屏幕晃動與音樂或舞蹈的節奏保持一致,這樣才能達到最佳的視覺效果。無論是編程實現還是使用現有軟體,關鍵在於精確捕捉節奏信息,並將其轉化為屏幕動態效果。
在編程實現過程中,可以藉助第三方庫和框架來簡化開發工作。例如,使用OpenCV或PIL庫處理圖像,使用PyAudio或alsa庫處理音頻數據。這樣可以節省開發時間,專注於實現屏幕隨節奏晃動的核心功能。
對於不具備編程經驗的用戶,利用現有的音樂播放器和跳舞游戲軟體是一個不錯的選擇。這類軟體通常提供了易於使用的界面,使得用戶能夠快速設置和調整屏幕隨節奏晃動的效果。通過簡單的設置,用戶可以享受到與音樂或舞蹈同步的視覺體驗。
總之,實現屏幕隨節奏晃動的效果可以通過編程、使用現有軟體或音頻可視化軟體等多種途徑來實現。無論是哪種方法,關鍵在於確保屏幕晃動與音樂或舞蹈的節奏保持一致,以提升整體的視覺體驗。