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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? sound.c

?? 基于TI公司Cortex-M3的uart超級通信開發
?? C
?? 第 1 頁 / 共 3 頁
字號:

    //
    // Set the FIFO trigger limit
    //
    I2SRxFIFOLimitSet (I2S0_BASE, 4);

    //
    // Enable the I2S Rx controller.
    //
    I2SRxEnable(I2S0_BASE);

    //
    // Disable all DMA attributes.
    //
    uDMAChannelAttributeDisable(UDMA_CHANNEL_I2S0RX, UDMA_ATTR_ALL);
    }

    //
    // Enable the I2S interrupt on the NVIC
    //
    IntEnable(INT_I2S0);
}

//*****************************************************************************
//
//! Handles the I2S sound interrupt.
//!
//! This function services the I2S interrupt and will call the callback function
//! provided with the buffer that was given to the SoundBufferPlay() or
//! SoundBufferRead() functions to handle emptying or filling the buffers and
//! starting up DMA transfers again.  It is solely the responsibility of the
//! callback functions to continuing sending or receiving data to or from the
//! audio codec.
//!
//! \return None.
//
//*****************************************************************************
void
SoundIntHandler(void)
{
    unsigned long ulStatus;
    unsigned long *pulTemp;

    //
    // Get the interrupt status and clear any pending interrupts.
    //
    ulStatus = I2SIntStatus(I2S0_BASE, 1);

    //
    // Clear out any interrupts.
    //
    I2SIntClear(I2S0_BASE, ulStatus);

    //
    // Handle the RX channel interrupt
    //
    if(HWREGBITW(&g_ulDMAFlags, FLAG_RX_PENDING))
    {
        //
        // If the RX DMA is done, then start another one using the same
        // RX buffer.  This keeps the RX running continuously.
        //
        if(uDMAChannelModeGet(UDMA_CHANNEL_I2S0RX | UDMA_PRI_SELECT) ==
           UDMA_MODE_STOP)
        {
            //
            // Save a temp pointer so that the current pointer can be set to
            // zero before calling the callback.
            //
            pulTemp = g_sInBuffers[0].pulData;

            //
            // If at the mid point the refill the first half of the buffer.
            //
            if(g_sInBuffers[0].pfnBufferCallback)
            {
                g_sInBuffers[0].pulData = 0;

                g_sInBuffers[0].pfnBufferCallback(pulTemp, BUFFER_EVENT_FULL);
            }
        }
        else if(uDMAChannelModeGet(UDMA_CHANNEL_I2S0RX | UDMA_ALT_SELECT) ==
                UDMA_MODE_STOP)
        {
            //
            // Save a temp pointer so that the current pointer can be set to
            // zero before calling the callback.
            //
            pulTemp = g_sInBuffers[1].pulData;

            //
            // If at the mid point the refill the first half of the buffer.
            //
            if(g_sInBuffers[1].pfnBufferCallback)
            {
                g_sInBuffers[1].pulData = 0;
                g_sInBuffers[1].pfnBufferCallback(pulTemp, BUFFER_EVENT_FULL);
            }
        }

        //
        // If there are no more scheduled buffers then there are no more
        // pending DMA transfers.
        //
        if((g_sInBuffers[0].pulData == 0) && (g_sInBuffers[1].pulData == 0))
        {
            HWREGBITW(&g_ulDMAFlags, FLAG_RX_PENDING) = 0;
        }
    }

    //
    // Handle the TX channel interrupt
    //
    if(HWREGBITW(&g_ulDMAFlags, FLAG_TX_PENDING))
    {
        //
        // If the TX DMA is done, then call the callback if present.
        //
        if(uDMAChannelModeGet(UDMA_CHANNEL_I2S0TX | UDMA_PRI_SELECT) ==
           UDMA_MODE_STOP)
        {
            //
            // Save a temp pointer so that the current pointer can be set to
            // zero before calling the callback.
            //
            pulTemp = g_sOutBuffers[0].pulData;

            //
            // If at the mid point then refill the first half of the buffer.
            //
            if((g_sOutBuffers[0].pfnBufferCallback) &&
               (g_sOutBuffers[0].pulData != 0))
            {
                g_sOutBuffers[0].pulData = 0;
                g_sOutBuffers[0].pfnBufferCallback(pulTemp, BUFFER_EVENT_FREE);
            }
        }

        //
        // If the TX DMA is done, then call the callback if present.
        //
        if(uDMAChannelModeGet(UDMA_CHANNEL_I2S0TX | UDMA_ALT_SELECT) ==
           UDMA_MODE_STOP)
        {
            //
            // Save a temp pointer so that the current pointer can be set to
            // zero before calling the callback.
            //
            pulTemp = g_sOutBuffers[1].pulData;

            //
            // If at the mid point then refill the first half of the buffer.
            //
            if((g_sOutBuffers[1].pfnBufferCallback) &&
               (g_sOutBuffers[1].pulData != 0))
            {
                g_sOutBuffers[1].pulData = 0;
                g_sOutBuffers[1].pfnBufferCallback(pulTemp, BUFFER_EVENT_FREE);
            }
        }

        //
        // If no more buffers are pending then clear the flag.
        //
        if((g_sOutBuffers[0].pulData == 0) && (g_sOutBuffers[1].pulData == 0))
        {
            HWREGBITW(&g_ulDMAFlags, FLAG_TX_PENDING) = 0;
        }
    }
}

//*****************************************************************************
//
//! Starts playback of a song.
//!
//! \param pusSong is a pointer to the song data structure.
//! \param ulLength is the length of the song data structure in bytes.
//!
//! This function starts the playback of a song or sound effect.  If a song
//! or sound effect is already being played, its playback is canceled and the
//! new song is started.
//!
//! \return None.
//
//*****************************************************************************
void
SoundPlay(const unsigned short *pusSong, unsigned long ulLength)
{
    //
    // Set the format of the audio stream.
    //
    SoundSetFormat(48000, 16, 2);

    //
    // Save the music buffer.
    //
    g_ulMusicCount = 0;
    g_ulMusicSize = ulLength * 2;
    g_pusMusic = pusSong;
    g_ulPlaying = 0;

    g_sOutBuffers[0].pulData = 0;
    g_sOutBuffers[1].pulData = 0;

    if(SoundNextTone() != 0)
    {
        SoundBufferPlay(g_pulTxBuf, g_ulSize, BufferCallback);
        SoundBufferPlay(g_pulTxBuf, g_ulSize, BufferCallback);
    }
}

//*****************************************************************************
//
//! Configures the I2S peripheral for the given audio data format.
//!
//! \param ulSampleRate is the sample rate of the audio to be played in
//! samples per second.
//! \param usBitsPerSample is the number of bits in each audio sample.
//! \param usChannels is the number of audio channels, 1 for mono, 2 for stereo.
//!
//! This function configures the I2S peripheral in preparation for playing
//! and recording audio data of a particular format.
//!
//! \return None.
//
//*****************************************************************************
void
SoundSetFormat(unsigned long ulSampleRate, unsigned short usBitsPerSample,
               unsigned short usChannels)
{
    unsigned long ulFormat;
    unsigned long ulDMASetting;

    //
    // Save these values for use when configuring I2S.
    //
    g_usChannels = usChannels;
    g_usBitsPerSample = usBitsPerSample;

    I2SMasterClockSelect(I2S0_BASE, 0);

    //
    // Always use have the controller be an I2S Master.
    //
    ulFormat = I2S_CONFIG_FORMAT_I2S | I2S_CONFIG_CLK_MASTER;

    //
    // Mono or Stereo formats.
    //
    if(g_usChannels == 1)
    {
        if(g_usBitsPerSample == 8)
        {
            ulFormat |= I2S_CONFIG_WIRE_SIZE_8 | I2S_CONFIG_MODE_MONO |
                        I2S_CONFIG_SAMPLE_SIZE_8;
        }
        else if(g_usBitsPerSample == 16)
        {
            ulFormat |= I2S_CONFIG_WIRE_SIZE_16 | I2S_CONFIG_MODE_MONO |
                        I2S_CONFIG_SAMPLE_SIZE_16;
        }
        else if(g_usBitsPerSample == 24)
        {
            ulFormat |= I2S_CONFIG_WIRE_SIZE_24 | I2S_CONFIG_MODE_MONO |
                        I2S_CONFIG_SAMPLE_SIZE_24;
        }
        else
        {
            ulFormat |= I2S_CONFIG_WIRE_SIZE_32 | I2S_CONFIG_MODE_MONO |
                        I2S_CONFIG_SAMPLE_SIZE_32;
        }
    }
    else
    {
        if(g_usBitsPerSample == 8)
        {
            ulFormat |= I2S_CONFIG_WIRE_SIZE_8 | I2S_CONFIG_MODE_COMPACT_8 |
                        I2S_CONFIG_SAMPLE_SIZE_8;
        }
        else if(g_usBitsPerSample == 16)
        {
            ulFormat |= I2S_CONFIG_WIRE_SIZE_16 | I2S_CONFIG_MODE_COMPACT_16 |
                        I2S_CONFIG_SAMPLE_SIZE_16;
        }
        else if(g_usBitsPerSample == 24)
        {
            ulFormat |= I2S_CONFIG_WIRE_SIZE_24 | I2S_CONFIG_MODE_DUAL |
                        I2S_CONFIG_SAMPLE_SIZE_24;
        }
        else
        {
            ulFormat |= I2S_CONFIG_WIRE_SIZE_32 | I2S_CONFIG_MODE_DUAL |
                        I2S_CONFIG_SAMPLE_SIZE_32;
        }
    }

    //
    // Configure the I2S TX and RX format.
    //
    I2STxConfigSet(I2S0_BASE, ulFormat);
    ulFormat = (ulFormat & ~I2S_CONFIG_FORMAT_MASK) | I2S_CONFIG_FORMAT_LEFT_JUST;
    I2SRxConfigSet(I2S0_BASE, ulFormat);

    //
    // Internally both are masters but the pins may not be driven out.
    //
    I2SMasterClockSelect(I2S0_BASE, I2S_TX_MCLK_INT | I2S_RX_MCLK_INT);

    //
    // Set the MCLK rate and save it for conversion back to sample rate.
    // The multiply by 8 is due to a 4X oversample rate plus a factor of two
    // since the data is always stereo on the I2S interface.
    //
    g_ulSampleRate = SysCtlI2SMClkSet(0, ulSampleRate * usBitsPerSample * 8);

    //
    // Convert the MCLK rate to sample rate.
    //
    g_ulSampleRate = g_ulSampleRate/(usBitsPerSample * 8);

    //
    // Configure the I2S TX DMA channel to use high priority burst transfer.
    //
    uDMAChannelAttributeEnable(UDMA_CHANNEL_I2S0TX,
                               (UDMA_ATTR_USEBURST |
                                UDMA_ATTR_HIGH_PRIORITY));

    //
    // Set the DMA channel configuration.
    //
    if(g_usChannels == 1)
    {
        //
        // Handle Mono formats.
        //
        if(g_usBitsPerSample == 8)
        {
            //
            // The transfer size is 8 bits from the TX buffer to the TX FIFO.
            //
            ulDMASetting = UDMA_SIZE_8 | UDMA_SRC_INC_8 |
                           UDMA_DST_INC_NONE | UDMA_ARB_2;
        }
        else
        {
            //
            // The transfer size is 16 bits from the TX buffer to the TX FIFO.
            //
            ulDMASetting = UDMA_SIZE_16 | UDMA_SRC_INC_16 |
                           UDMA_DST_INC_NONE | UDMA_ARB_2;
        }
    }
    else
    {
        //
        // Handle Stereo formats.
        //
        if(g_usBitsPerSample == 8)
        {
            //
            // The transfer size is 16 bits(stereo 8 bits) from the TX buffer
            // to the TX FIFO.
            //
            ulDMASetting = UDMA_SIZE_16 | UDMA_SRC_INC_16 |
                           UDMA_DST_INC_NONE | UDMA_ARB_2;
        }
        else
        {
            //
            // The transfer size is 32 bits(stereo 16 bits) from the TX buffer
            // to the TX FIFO.
            //
            ulDMASetting = UDMA_SIZE_32 | UDMA_SRC_INC_32 |
                           UDMA_DST_INC_NONE | UDMA_ARB_2;
        }
    }

    //
    // Configure the DMA settings for this channel.
    //
    uDMAChannelControlSet(UDMA_CHANNEL_I2S0TX | UDMA_PRI_SELECT, ulDMASetting);
    uDMAChannelControlSet(UDMA_CHANNEL_I2S0TX | UDMA_ALT_SELECT, ulDMASetting);
}

//*****************************************************************************
//
//! Returns the current sample rate.
//!
//! This function returns the sample rate that was set by a call to
//! SoundSetFormat().  This is needed to retrieve the exact sample rate that is

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色狠狠桃花综合| 国产精品美女久久福利网站| 久久免费看少妇高潮| 一区二区三区在线视频观看58| 人禽交欧美网站| 日本精品一区二区三区四区的功能| 精品国产一区二区三区久久久蜜月 | 国产激情视频一区二区在线观看| 欧美视频一区二区三区在线观看| 国产欧美久久久精品影院| 日韩精品成人一区二区三区| 91香蕉视频mp4| 欧美国产欧美综合| 国产久卡久卡久卡久卡视频精品| 91麻豆精品国产91久久久久| 亚洲444eee在线观看| 色婷婷久久一区二区三区麻豆| 国产精品福利电影一区二区三区四区 | 国产精品国产三级国产三级人妇 | 六月婷婷色综合| 欧美日韩精品综合在线| 亚洲精品乱码久久久久久| 成人黄色片在线观看| 欧美激情中文字幕一区二区| 国产一区二区三区不卡在线观看| 欧美成人女星排行榜| 激情综合色播激情啊| 日韩一区二区在线观看视频播放| 亚洲成人久久影院| 欧美日韩日日夜夜| 亚洲bt欧美bt精品| 51精品久久久久久久蜜臀| 丝袜a∨在线一区二区三区不卡| 在线观看91精品国产入口| 亚洲夂夂婷婷色拍ww47| 欧美性猛片aaaaaaa做受| 亚洲成精国产精品女| 欧美绝品在线观看成人午夜影视| 午夜视频一区二区| 欧美videossexotv100| 国产综合色产在线精品| 国产日产欧产精品推荐色| 福利电影一区二区| 亚洲免费av在线| 在线观看欧美精品| 日日夜夜免费精品| 精品美女被调教视频大全网站| 国产精品中文有码| 亚洲欧美一区二区三区极速播放| 色综合天天性综合| 三级精品在线观看| 久久久久97国产精华液好用吗| 粉嫩久久99精品久久久久久夜| 亚洲欧美偷拍三级| 欧美一区二区免费视频| 国产成a人亚洲| 亚洲一区二区三区四区不卡| 欧美一级专区免费大片| 成人午夜电影小说| 亚洲午夜日本在线观看| 久久综合久久综合久久综合| 99精品视频一区| 日韩激情中文字幕| 国产精品久久久久久久久久免费看| 欧美性受xxxx黑人xyx性爽| 九九久久精品视频| 亚洲伦在线观看| 日韩精品专区在线影院观看| 91看片淫黄大片一级在线观看| 日韩国产高清影视| 中文字幕中文乱码欧美一区二区 | 久久国产日韩欧美精品| 国产区在线观看成人精品| 欧美日韩国产片| av影院午夜一区| 久久国产日韩欧美精品| 亚洲午夜电影在线观看| 欧美极品另类videosde| 日韩三级伦理片妻子的秘密按摩| 91丨九色丨蝌蚪丨老版| 久久99久久99小草精品免视看| 亚洲男人的天堂在线aⅴ视频 | 国产呦萝稀缺另类资源| 亚洲一区二区三区免费视频| 中文字幕+乱码+中文字幕一区| 91精品麻豆日日躁夜夜躁| 91免费精品国自产拍在线不卡| 乱中年女人伦av一区二区| 亚洲大型综合色站| 亚洲欧美日韩国产中文在线| 国产色产综合色产在线视频| 日韩欧美国产午夜精品| 欧美日韩精品欧美日韩精品一| 99久久伊人网影院| 国产成人精品一区二区三区四区| 久久99精品久久只有精品| 亚洲国产精品久久艾草纯爱| 一区二区三区日本| 成人欧美一区二区三区黑人麻豆| 欧美国产成人精品| 国产偷国产偷精品高清尤物| 精品91自产拍在线观看一区| 日韩欧美国产1| 欧美va亚洲va香蕉在线| 日韩欧美激情四射| 日韩一本二本av| 91精品国产综合久久国产大片 | 国产成人免费9x9x人网站视频| 久久99国产精品久久99果冻传媒| 青娱乐精品在线视频| 奇米在线7777在线精品| 日本欧美一区二区三区| 免费观看91视频大全| 紧缚捆绑精品一区二区| 久久www免费人成看片高清| 精品在线一区二区| 国产一区二区三区电影在线观看| 国产精品一区二区在线观看网站| 国产在线不卡一卡二卡三卡四卡| 国产美女精品一区二区三区| 国产+成+人+亚洲欧洲自线| 丁香婷婷深情五月亚洲| 成人涩涩免费视频| 色婷婷综合久久久中文一区二区| 欧美视频一区二| 日韩亚洲欧美一区二区三区| 日韩色在线观看| 国产欧美日韩一区二区三区在线观看| 久久九九99视频| 亚洲视频香蕉人妖| 午夜伦欧美伦电影理论片| 蜜桃精品视频在线| 成年人午夜久久久| 欧美在线视频全部完| 欧美一级xxx| 国产片一区二区三区| 亚洲精品成人天堂一二三| 三级一区在线视频先锋| 国产sm精品调教视频网站| 91黄视频在线| 日韩欧美你懂的| 中文字幕亚洲一区二区av在线| 亚洲图片欧美视频| 国产乱子伦视频一区二区三区 | 欧美主播一区二区三区| 日韩欧美一级精品久久| 国产精品久久久久精k8| 婷婷综合久久一区二区三区| 韩国女主播一区| 在线亚洲人成电影网站色www| 91精品国模一区二区三区| 日本一区二区三区四区| 亚洲成人三级小说| 国产99久久久精品| 5566中文字幕一区二区电影| 国产三级一区二区| 青青草91视频| 色哟哟日韩精品| 国产日产欧美一区| 日韩av在线播放中文字幕| 99久久免费精品高清特色大片| 日韩午夜在线影院| 亚洲特级片在线| 国产美女一区二区| 欧美一区二区三区视频在线观看| 中文字幕一区二区三区在线观看| 日本vs亚洲vs韩国一区三区 | 亚洲精品乱码久久久久久久久 | 3d动漫精品啪啪1区2区免费| 中文字幕精品一区二区精品绿巨人| 日韩激情一二三区| 色综合 综合色| 国产精品视频第一区| 九一久久久久久| 欧美日韩成人综合在线一区二区| 中文字幕一区二区三区蜜月| 极品少妇xxxx精品少妇偷拍| 91麻豆精品国产91久久久使用方法 | 一区二区三区丝袜| 国产成人精品亚洲777人妖| 欧美tickle裸体挠脚心vk| 亚洲h在线观看| 91黄色小视频| 亚洲一区二区三区在线播放| 91免费在线看| 中文字幕一区二区在线观看| 成人爱爱电影网址| 欧美国产一区二区| 成人手机电影网| 中文字幕亚洲电影| 不卡一二三区首页| 国产精品三级电影| 成人性生交大片免费看在线播放 | 精品处破学生在线二十三| 日本不卡1234视频| 日韩一区二区三区观看| 视频一区视频二区中文字幕| 欧美久久久久久久久久| 日本不卡一二三区黄网| 欧美精品一区二区高清在线观看|