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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? audiodriver.c

?? bf533音訊處理 使用visual audio 軟件
?? C
?? 第 1 頁 / 共 2 頁
字號:
// Copyright(c) 2005 Analog Devices, Inc. All Rights Reserved.
// This software is proprietary and confidential to Analog Devices, Inc. and its licensors.

// File    : $Id: //depot/Development/VisualAudio/Platforms/EZKit_BF533_Basic/2.5.0/AudioDriver.c#4 $ 
// Part of : VisualAudio V2.5.0 
// Updated : $Date: 2006/12/04 $ by $Author: blee $


/*****************************************************************************************************

Description:    Configures the TDM 8 channel audio mode through the AD1836 driver.
                The audio data is received from the ADC and stored into the buffer iADCdata. 
                The output data is transmitted from the buffer iDACdata.
                One dimensional buffer, rxBuffer, is provided for the ADC data, and another circular 
                buffer, txBuffer, is for the DAC data. A double buffering scheme 
                is implemented so that data in one half is available for processing while the other 
                half is used for DMA operations. The copying of data from the DMA
                buffers to/from the post-processing buffer is done by the user function
                DoProcessing().
                The Audio Handling is invoked through the separate
                interrupt thread for the function, or directly called by ProcessAudioCallback()
                depending on the RENDER_AT_LOWER_INTERRUPT_LEVEL definition.

******************************************************************************************************/

/*********************************************************************

Include files

*********************************************************************/
#include "Basic.h"
#include <drivers/codec/adi_ad1836a_ii.h>
#include <drivers/sport/adi_sport.h>
#include "AudioDriver.h"
#include <string.h>

/*********************************************************************

Local variables

*********************************************************************/

// handle to the AD1836 driver
static ADI_DEV_DEVICE_HANDLE    DriverHandle;

// device manager handle
extern ADI_DEV_MANAGER_HANDLE   DevMgrHandle;    // handle for the device manager

// DMA manager handle
extern ADI_DMA_MANAGER_HANDLE   DMAMgrHandle;    // handle for the DMA manager

// double buffer for processing SPORT TDM RX/TX data
section("slowsdata_noncached")
static ADI_DEV_1D_BUFFER   rxBuffer_1, rxBuffer_2;
section("slowsdata_noncached")
static ADI_DEV_1D_BUFFER   txBuffer_1, txBuffer_2;

// storage for audio PCM data
#if (DMA_BUFFER_IN_L1_MEMORY && Layout1_TICK_SIZE <= 32)
section("L1_dma_a")
#else
section("slowsdata_noncached")
#endif
static int iADCdata[TDM_FRAME_SIZE * Layout1_TICK_SIZE * 2];  // 2: double buffering

#if (DMA_BUFFER_IN_L1_MEMORY && Layout1_TICK_SIZE <= 32)
section("L1_dma_b")
#else
section("slowsdata_noncached")
#endif
static int iDACdata[TDM_FRAME_SIZE * Layout1_TICK_SIZE * 2];  // 2: double buffering

/*********************************************************************

Exported buffers

*********************************************************************/

// pointer array that contains base channel pointer of iDACdata for the transmit buffer
static int *pOutputSampleBasePtr[SYSAudio_MAX_OUTPUT_CHANNEL_COUNT * 2]; // 2: double buffering

// pointer array that contains base channel pointer of iADCdata for the receive buffer
static int *pInputSampleBasePtr[SYSAudio_MAX_INPUT_CHANNEL_COUNT * 2];   // 2: double buffering


#if (RENDER_AT_LOWER_INTERRUPT_LEVEL)
#include <signal.h>
#endif

static int gWhichBuffer;

/*********************************************************************

    Function:       FWRender
    
    Description:    This is the user interrupt service routine which 
                    runs on user interrupt 0 (or simple function, depending on
                    conditional compilation macro RENDER_AT_LOWER_INTERRUPT_LEVEL.
                    It simply calls the glue function
                    for the DSP to handle input data.

*********************************************************************/
#if (RENDER_AT_LOWER_INTERRUPT_LEVEL)
// user interrupt 0 ISR
ADI_INT_HANDLER(FWRender)
#else
static void FWRender(void)
#endif    
{
    // call VisualAudio layout processing function
    int **pOutputPtrs, **pInputPtrs;
    // switch ping pong variable for double buffering
    if (gWhichBuffer == 1)       // indicating first portion is transferred
    {
        // first DMA buffer
        pInputPtrs = &pInputSampleBasePtr[0];
        pOutputPtrs = &pOutputSampleBasePtr[0];
    }
    else                         // indicating second portion is transferred
    {
        // second DMA buffer
        pInputPtrs = &pInputSampleBasePtr[SYSAudio_MAX_INPUT_CHANNEL_COUNT];
        pOutputPtrs = &pOutputSampleBasePtr[SYSAudio_MAX_OUTPUT_CHANNEL_COUNT];
    }
    DoProcessing(pInputPtrs,pOutputPtrs);
#if (RENDER_AT_LOWER_INTERRUPT_LEVEL)
    return (ADI_INT_RESULT_PROCESSED);
#endif
}

/*********************************************************************

    Function:       ProcessAudioCallback
    
    Description:    Each type of callback event has it's own unique ID
                    so we can use a single callback function for all
                    callback events.  The switch statement tells us
                    which event has occurred.
                    
                    Note that in the device driver model, in order to 
                    generate a callback for buffer completion, the 
                    CallbackParameter of the buffer must be set to a non-NULL 
                    value. In the current DMA chained loopback mode, 
                    given paramter is passed to the function indicating
                    which buffer has been completed.
                    
*********************************************************************/
#ifndef NO_OPTIMIZE
#pragma optimize_for_speed
#endif
void ProcessAudioCallback(void* AppHandle, u32 Event, void* pArg)
{
    switch (Event)
    {
        // CASE (DMA buffer processed)
        case ADI_DEV_EVENT_BUFFER_PROCESSED:
///////////////////////////////////////////////////////////////////////////////////////////////    
// FIXME : used temporarily until the service library fixes this problem
            // in case we are in the middle of fetching descriptor
            while ((*pDMA1_IRQ_STATUS & 0x0004) != 0) asm ("nop;");
            // read next descriptor and get the callback parameter to identify which buffer
            gWhichBuffer = (int)(((ADI_DEV_1D_BUFFER*)(*pDMA1_NEXT_DESC_PTR))->CallbackParameter);
///////////////////////////////////////////////////////////////////////////////////////////////

#if (RENDER_AT_LOWER_INTERRUPT_LEVEL)
            // call other interrupt for rendering
            raise(USER_ISR0);
#else
            // call VisualAudio layout processing function
            FWRender();
#endif
            break;
        case ADI_DEV_EVENT_SUB_BUFFER_PROCESSED:
            break;
        
        case ADI_DEV_EVENT_DMA_ERROR_INTERRUPT:
            ErrorMessage("DMA error interrupt\n");
            break;
    }
}

/*********************************************************************

    Function:       resolveChannelPointers
    
    Description:    To simplify the process of reformatting DMA ADC or DAC data
                    into/from the working buffer, it assign each element
                    of an pointer array with valid base channel pointers
                    to iDACdata and iADCdata buffer.
    
*********************************************************************/

// initialize the pointers to the DMA ADC/DAC buffer for double buffering
#ifndef NO_OPTIMIZE
#pragma optimize_for_space
#endif
static void resolveChannelPointers(void)
{
    int i;
    
    //=====================================================
    // Output channels
    //=====================================================
    // Analog channels
    pOutputSampleBasePtr[0] = &iDACdata[INTERNAL_DAC_L1];
    pOutputSampleBasePtr[1] = &iDACdata[INTERNAL_DAC_R1];
    pOutputSampleBasePtr[2] = &iDACdata[INTERNAL_DAC_L2];
    pOutputSampleBasePtr[3] = &iDACdata[INTERNAL_DAC_R2];
    pOutputSampleBasePtr[4] = &iDACdata[INTERNAL_DAC_L3];
    pOutputSampleBasePtr[5] = &iDACdata[INTERNAL_DAC_R3];
    
    // set up the buffer pointers for the second half of the double buffer
    for (i = 0; i < SYSAudio_MAX_OUTPUT_CHANNEL_COUNT; i++)
        pOutputSampleBasePtr[SYSAudio_MAX_OUTPUT_CHANNEL_COUNT + i] = 
            pOutputSampleBasePtr[i] + (TDM_FRAME_SIZE * Layout1_TICK_SIZE);
            
    //=====================================================
    // Input channels
    //=====================================================            
    // Analog channels
    pInputSampleBasePtr[0] = &iADCdata[INTERNAL_ADC_L1];
    pInputSampleBasePtr[1] = &iADCdata[INTERNAL_ADC_R1];
    pInputSampleBasePtr[2] = &iADCdata[INTERNAL_ADC_L2];
    pInputSampleBasePtr[3] = &iADCdata[INTERNAL_ADC_R2];
    
    // set up the buffer pointers for the second half of the double buffer
    for (i = 0; i < SYSAudio_MAX_INPUT_CHANNEL_COUNT; i++)
        pInputSampleBasePtr[SYSAudio_MAX_INPUT_CHANNEL_COUNT + i] = 
            pInputSampleBasePtr[i] + (TDM_FRAME_SIZE * Layout1_TICK_SIZE);

}

//////////////////////////////////////////////////////////////////////
// workaround for audio reset
// addresses for Port B in Flash A (used for resetting the codec)
#define pFlashA_PortA_Dir    (volatile unsigned char *)0x20270006

#define pFlashA_PortA_Data    (volatile unsigned char *)0x20270004

static void reset_AD1836(void)
{
    int i;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩一区二区电影| 日韩在线播放一区二区| 色就色 综合激情| 一区二区三区四区不卡在线| 亚洲一区二区中文在线| 欧美亚洲动漫制服丝袜| 亚洲h精品动漫在线观看| 欧美专区日韩专区| 蜜桃精品视频在线观看| 国产精品短视频| 欧洲在线/亚洲| 午夜精品福利一区二区蜜股av| 欧美日韩成人激情| 蜜桃av一区二区三区电影| 久久人人爽人人爽| 99久久精品免费看国产免费软件| 成人欧美一区二区三区小说 | 国产精品视频看| 99久久国产免费看| 日韩激情中文字幕| 国产精品视频免费| 精品欧美乱码久久久久久1区2区 | 久久久99精品久久| 欧美在线免费观看亚洲| 成人视屏免费看| 蜜臀av一区二区| 天天免费综合色| 亚洲另类春色国产| 国产欧美日韩久久| 日韩欧美一级二级三级久久久| 国产伦精一区二区三区| 亚洲成av人片| 一区二区三区日韩欧美| 18成人在线观看| 中文字幕av资源一区| 久久女同精品一区二区| 国产三级精品三级| 亚洲欧洲av色图| 夜夜嗨av一区二区三区网页| 一区二区欧美视频| 亚洲精品菠萝久久久久久久| 亚洲视频香蕉人妖| 亚洲人成人一区二区在线观看| 国产精品久久久久毛片软件| 亚洲免费资源在线播放| 亚洲综合久久av| 亚洲国产精品视频| 免播放器亚洲一区| 成人精品视频一区二区三区| av福利精品导航| 8x8x8国产精品| 中文无字幕一区二区三区| 国产精品美女久久久久av爽李琼| 亚洲人xxxx| 日韩福利电影在线| 成人免费高清在线观看| 欧美精品自拍偷拍| 久久欧美中文字幕| 亚洲欧美电影一区二区| 国产一区二区三区高清播放| 欧亚洲嫩模精品一区三区| 91麻豆精品91久久久久同性| 国产精品久久久久一区| 午夜精品福利一区二区三区蜜桃| 免费高清在线视频一区·| 97久久精品人人澡人人爽| 国产三区在线成人av| 丝袜脚交一区二区| 欧美三级欧美一级| 亚洲免费观看高清| 成人午夜伦理影院| 久久久久久99久久久精品网站| 亚洲视频一区二区在线| 成人18视频日本| 国产欧美视频一区二区| 免费成人美女在线观看.| 欧美日韩精品系列| 一区二区视频在线| 国产成人在线观看免费网站| 久久亚洲综合色| 国产精品资源网站| 国产精品视频第一区| 成人福利视频网站| 玉足女爽爽91| 7777精品久久久大香线蕉| 日韩高清一区二区| 精品国产一区二区在线观看| 国精产品一区一区三区mba桃花 | 91精品午夜视频| 国产精品久久久久三级| av不卡免费电影| 一区二区三区成人| 日韩一区二区精品葵司在线| 国产一区91精品张津瑜| 亚洲色图一区二区| 6080日韩午夜伦伦午夜伦| 国产一区三区三区| 亚洲乱码日产精品bd| 欧美xxxx老人做受| 91激情五月电影| 美腿丝袜亚洲综合| 亚洲久草在线视频| 欧美电影免费观看高清完整版在线| 成人aaaa免费全部观看| 美女视频免费一区| 午夜视黄欧洲亚洲| 国产精品网友自拍| 久久久另类综合| 日韩一区二区三区电影| 91网站视频在线观看| 国产不卡高清在线观看视频| 日本成人在线网站| 一区二区国产盗摄色噜噜| 综合自拍亚洲综合图不卡区| 久久久久久久久久久久久久久99| 91麻豆精品国产综合久久久久久| 丁香网亚洲国际| 丁香啪啪综合成人亚洲小说| 精品一区二区三区日韩| 麻豆一区二区在线| 日本成人超碰在线观看| 天堂一区二区在线免费观看| 性做久久久久久免费观看欧美| 亚洲一区二区四区蜜桃| 日韩在线观看一区二区| 蜜臀久久99精品久久久画质超高清 | 蜜桃精品视频在线| 91美女福利视频| 91精品国产91久久综合桃花| 国产三级欧美三级日产三级99 | 粉嫩绯色av一区二区在线观看| 欧美日韩国产免费一区二区 | 青青草97国产精品免费观看 | 三级欧美在线一区| 国产v综合v亚洲欧| 欧美性猛交xxxx乱大交退制版| 日韩一区二区中文字幕| 亚洲欧美成人一区二区三区| 麻豆免费看一区二区三区| 国产suv精品一区二区883| 欧美日韩专区在线| 亚洲美女屁股眼交| 成人一二三区视频| 久久先锋资源网| 久久狠狠亚洲综合| 9191国产精品| 中文字幕一区二区三中文字幕| 美美哒免费高清在线观看视频一区二区 | 欧美年轻男男videosbes| 成人免费在线播放视频| 青青草原综合久久大伊人精品优势| 天堂资源在线中文精品| 日韩经典中文字幕一区| 性欧美疯狂xxxxbbbb| 成人av在线网| 7777精品伊人久久久大香线蕉完整版| 欧美xxxxxxxxx| 天天综合色天天| 精品一区二区成人精品| 91美女在线视频| 最新中文字幕一区二区三区 | 国产精品久久久久7777按摩| 激情综合亚洲精品| 欧美xfplay| 成人av电影观看| 一区二区三区在线影院| 在线免费视频一区二区| 亚洲成人免费视频| 精品少妇一区二区三区日产乱码 | 中文幕一区二区三区久久蜜桃| 国产精品夜夜爽| 亚洲激情成人在线| 91精选在线观看| 成人一区二区三区视频在线观看| 国产精品免费aⅴ片在线观看| 9色porny自拍视频一区二区| 亚洲一二三专区| 26uuu另类欧美亚洲曰本| 91在线视频网址| 久久99精品国产91久久来源| 国产精品无人区| 欧美mv日韩mv国产| 欧美亚洲尤物久久| 粉嫩欧美一区二区三区高清影视| 樱花影视一区二区| 国产日韩精品久久久| 91精品国产欧美日韩| 欧美无砖专区一中文字| 成人福利在线看| 国产美女娇喘av呻吟久久| 亚洲摸摸操操av| 中文字幕的久久| 亚洲国产精品成人综合色在线婷婷| 欧美日韩一区二区三区在线| 成人毛片在线观看| 蜜桃视频在线观看一区| 日本欧美肥老太交大片| 亚洲一二三四区| 国产精品青草综合久久久久99| 日本电影欧美片|