1. 程式人生 > >支援錄音的音效卡驅動程式及錄音放音測試程式

支援錄音的音效卡驅動程式及錄音放音測試程式

from :上海尚觀嵌入式培訓 http://www.uplooking.sh.cn/embedded_training/tecnews/2012/1117/1456_1.html

  說明:
1)音訊裝置只能以O_WRONLY或者O_RDONLY方式開啟,不能使用O_RDWR方式開啟,因為不支援同時錄音和放音。
2)使用方法舉例"./oss /tmp/test.wav 22050" ,會自動錄音2MB,再將其播放出來。
3)支援調整音訊取樣率:支援44100、22050、11025和8000四種取樣率。
4)驅動使用方法:將sep4020-uda1341.c替換sound/oss目錄下同名檔案。

以下為測試程式原始碼
==================================================================================
//注意!音訊裝置只能以O_WRONLY或者O_RDONLY方式開啟,不能使用O_RDWR方式開啟,因為不支援同時錄音和放音。

#include <sys/ioctl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/soundcard.h>


#define BUF_SIZE 4096
#define DEVICE_NAME "/dev/dsp"

int audio_fd;        //音效卡
FILE *file_fd;        //檔案
int file_len;        //檔案長度
const char *file_name = "test.wav";
unsigned char audio_buffer[BUF_SIZE];

unsigned char *file_name_creat;
unsigned int audio_rate;

void delay(long x)
{       
        unsigned long i;       
        for(i=0; i<x; i++);
}

int main(int argc, char *argv[])
{
        printf("This is an I2S record & play program.\n");
        printf("Please add a file name and the audio rate! such as \"./oss test.wav 44100\" \n\n\n");
        delay(100000);       
       
        file_name_creat = argv[1];
        sscanf(argv[2],"%d", &audio_rate);
       
        printf("the file name is %s audio rate is %d \n",file_name_creat,audio_rate);
        delay(100000);

        /*開啟音訊裝置,準備錄音*/       
        if ((audio_fd = open(DEVICE_NAME, O_RDONLY)) == -1)
        {
                printf("open error\n");       
                return -1;
        }

        /*設定取樣速率*/
        int speed = audio_rate;

        if (ioctl(audio_fd, SNDCTL_DSP_SPEED, &speed)==-1)
        {
                /* Fatal error */
                printf("SNDCTL_DSP_SPEED error\n");
                return -1;
        }
        printf("the wav speed is %d\n",speed);

        /*錄音*/
        int i=0;
        unsigned long loops_record = 500; //500*4KB=2MB
        file_fd = fopen(file_name_creat, "w");

        printf("recording...\n");
        for(i=0;i<loops_record;i++)
        {
                read(audio_fd,audio_buffer,4096);
                fwrite(audio_buffer, 4096, 1, file_fd);
        }
        printf("recording...over\n");
        /*關閉裝置和檔案*/
        fclose(file_fd);
        close(audio_fd);
        delay(100000);




        /*開啟音訊裝置,準備放音*/       
        if ((audio_fd = open(DEVICE_NAME, O_WRONLY)) == -1)
        {
                printf("open error\n");       
                return -1;
        }
        /*設定取樣格式*/
        int format;
        format = AFMT_S16_LE;

 if (ioctl(audio_fd, SNDCTL_DSP_SETFMT, &format) == -1)
        {
                /* fatal error */
                printf("SNDCTL_DSP_SETFMT error\n");
                return -1;               
        }

        if (format != AFMT_S16_LE)
        {
                /* 本裝置不支援選擇的取樣格式. */
                printf("sep4020 oss driver does not support AFMT_S16_LE");
        }

        /*設定通道數*/
        int channels = 2; /* 1=mono, 2=stereo */

        if (ioctl(audio_fd, SNDCTL_DSP_CHANNELS, &channels) == -1)
        {
                /* Fatal error */
                printf("SNDCTL_DSP_CHANNELS error");
                return -1;
        }

        if (channels != 2)
        {
                /* 本裝置不支援立體聲模式 ... */
                printf("sep4020 oss driver does ");
        }
       
        /*設定取樣速率*/
        speed = audio_rate;

        if (ioctl(audio_fd, SNDCTL_DSP_SPEED, &speed)==-1)
        {
                /* Fatal error */
                printf("SNDCTL_DSP_SPEED error\n");
                return -1;
        }
        printf("the wav speed is %d\n",speed);
       


        /*開啟並計算檔案長度*/
        file_fd = fopen(file_name_creat, "r");
        fseek(file_fd,0,SEEK_END);     //定位到檔案末  
        file_len = ftell(file_fd);     //檔案長度

        int loops = file_len/4096;
       
        /*重新定位到檔案頭*/
        fclose(file_fd);
        file_fd = fopen(file_name_creat, "r");
        /*播放wav檔案*/
        for(i=0;i<loops;i++)
        {
                fread(audio_buffer, 4096, 1, file_fd);
                write(audio_fd,audio_buffer,4096);
        }
        /*關閉裝置和檔案*/
        fclose(file_fd);
        close(audio_fd);

        return 0;
}


//AUTHOR("
[email protected]
"); //DESCRIPTION("sep4020 uda1341 sound card test program");


相關推薦

支援錄音音效驅動程式錄音測試程式

from :上海尚觀嵌入式培訓 http://www.uplooking.sh.cn/embedded_training/tecnews/2012/1117/1456_1.html   說明: 1)音訊裝置只能以O_WRONLY或者O_RDONLY方式開啟,不能使用O

ALSA音效驅動中的DAPM詳解之四:在驅動程式中初始化並註冊widget和route

前幾篇文章我們從dapm的資料結構入手,瞭解了代表音訊控制元件的widget,代表連線路徑的route以及用於連線兩個widget的path。之前都是一些概念的講解以及對資料結構中各個欄位的說明,從本章開始,我們要從程式碼入手,分析dapm的詳細工作原理: 如何註冊widg

解決win10音效驅動不相容問題和成功安裝戰神k650-i5-d2上的Sound Blaster Cinema2在win10系統上

安裝win10後,偶爾會出現藍屏,經過我的發現,每次聽歌用揚聲器並且長時間。都會發生藍屏 1 . 所以懷疑音效卡驅動VIA HD Audio(Win 8.1)與系統不相容。 2 .乾脆重新安裝音效卡驅動。在網上找到與win10相容的VIAHDAud_v11_1100e_01

Linux ALSA音效驅動之六:ASoC架構中的Machine

前面一節的內容我們提到,ASoC被分為Machine、Platform和Codec三大部分,其中的Machine驅動負責Platform和Codec之間的耦合以及部分和裝置或板子特定的程式碼,再次引用上一節的內容:Machine驅動負責處理機器特有的一些控制元件和音訊

ALSA音效驅動中的DAPM詳解之二:widget-具備路徑和電源管理資訊的kcontrol

上一篇文章中,我們介紹了音訊驅動中對基本控制單元的封裝:kcontrol。利用kcontrol,我們可以完成對音訊系統中的mixer,mux,音量控制,音效控制,以及各種開關量的控制,通過對各種kcontrol的控制,使得音訊硬體能夠按照我們預想的結果進行工作。同時我

ALSA音效驅動中的DAPM詳解之七:dapm事件機制(dapm event)

前面的六篇文章,我們已經討論了dapm關於動態電源管理的有關知識,包括widget的建立和初始化,widget之間的連線以及widget的上下電順序等等。本章我們準備討論dapm框架中的另一個機制:事件機制。通過dapm事件機制,widget可以對它所關心的dapm事

關於音效驅動後的madplay安裝問題以及解決

安裝madplay所需要的庫檔案的時候 遇到了zlib.h找不到的原因 按照上面的內容執行會出現libz找不到的問題 後經過網上的查詢發現是Makefile中編譯器名字出現的問題 //////////////////////////////////////////////////////

音效驅動除錯過程

 ALSA音效卡驅動 https://blog.csdn.net/droidphone/article/category/1118446 PCM(Pulse-code modulation)脈衝編碼調製,把聲音從模擬轉換成數字訊號的一種技術 https://blog.csdn.

android下除錯音效驅動之概述

      在Android中音訊系統使用的是ALSA系統架構。ASoC--ALSA System on Chip ,是建立在標準ALSA驅動層上,為了更好地支援 嵌入式處理器和移動裝置中的音訊Cod

Linux ALSA音效驅動之八:ASoC架構中的Platform

1.  Platform驅動在ASoC中的作用 前面幾章內容已經說過,ASoC被分為Machine,Platform和Codec三大部件,Platform驅動的主要作用是完成音訊資料的管理,最終通過CPU的數字音訊介面(DAI)把音訊資料傳送給Codec進行處理,最終由Co

ALSA音效驅動中的DAPM詳解之五:建立widget之間的連線關係

前面我們主要著重於codec、platform、machine驅動程式中如何使用和建立dapm所需要的widget,route,這些是音訊驅動開發人員必須要了解的內容,經過前幾章的介紹,我們應該知道如何在alsa音訊驅動的3大部分(codec、platform、machin

android 音訊系統/音效驅動 codec

0. 專用術語 1. 物理結構 2. 系統架構 本文基於Freescale IMX平臺Codec ALC5625為例。 0. 專用術語  ASLA - Advanced Sound Linux Architecture  OSS - 以前的Linux音訊體系結構,被ASL

AM335x(TQ335x)學習筆記——WM8960音效驅動移植

經過一段時間的除錯,終於調好了TQ335x的音效卡驅動。TQ335x採用的Codec是WM8960,本文來總結下WM8960驅動在AM335x平臺上的移植方法。Linux音效卡驅動架構有OSS和ALSA兩種架構,目前最常用的架構是ALSA,本文也使用ALSA架構對WM

Linux ALSA音效驅動之三:PCM裝置的建立

1. PCM是什麼         PCM是英文Pulse-code modulation的縮寫,中文譯名是脈衝編碼調製。我們知道在現實生活中,人耳聽到的聲音是模擬訊號,PCM就是要把聲音從模擬轉換成數字訊號的一種技術,他的原理簡單地說就是利用一個固定的頻率對模擬訊號進行取

android下除錯音效驅動之總結

1、在除錯中出現問題後,首先看I2C通訊有沒有問題,wm8960暫存器的設定是靠I2C來完成,另外I2C通訊不成功在開發板中是沒      有音效卡相關的裝置節點。       a、首先檢視Machi

android下除錯音效驅動之wm8960介紹二

三、LINPUT輸入通道介紹             有關LINPUT的主要配置如下:            R32的bit8(LMN1)置1:LINPUT1連線PGA;            R0

vmware Dos音效驅動安裝說明

Vmware虛擬機器中dos\win3.1音效卡驅動,Vmware使用虛擬創新SB16音效卡來實現的。在dos下執行install.exe就可以開始安裝了。同時注意檢視虛擬機器的vmx檔案,是不是有這樣幾條,如果沒有就要新增進去: sound.present = "TRU

ALSA音效驅動中的DAPM詳解之一:kcontrol

DAPM是Dynamic Audio Power Management的縮寫,直譯過來就是動態音訊電源管理的意思,DAPM是為了使基於linux的移動裝置上的音訊子系統,在任何時候都工作在最小功耗狀態下。DAPM對使用者空間的應用程式來說是透明的,所有與電源相關的開關都在A

Linux ALSA音效驅動之五:移動裝置中的ALSA

1.  ASoC的由來 ASoC--ALSA System on Chip ,是建立在標準ALSA驅動層上,為了更好地支援嵌入式處理器和移動裝置中的音訊Codec的一套軟體體系。在ASoc出現之前,核心對於SoC中的音訊已經有部分的支援,不過會有一些侷限性:  

Linux ALSA 音效驅動之一:ALSA架構簡介

一.  概述     ALSA是Advanced Linux Sound Architecture 的縮寫,目前已經成為了linux的主流音訊體系結構,想了解更多的關於ALSA的這一開源專案的資訊和知識,請檢視以下網址:http://www.alsa-project.org/。     在核心裝置驅動層,