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

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

?? pwm.c

?? MP3 Cyclone的source code 利用FPGGA實現MP3的功能
?? C
字號:
/***********************************************************************
 *                                                                     *
 * File:     pwm.c                                                     *
 *                                                                     *
 * Purpose:  Provides an API to play audio through the PWM with FIFO   *
 *           SOPC Builder Component                                    *
 *                                                                     *
 * Author: N. Knight                                                   *
 *         Altera Corporation                                          *
 *         Aug 2005                                                    *
 **********************************************************************/

#define PWM_DEBUG 0

#include <stdio.h>
#include "system.h"
#include "pwm.h"
#include "io.h"
#include "alt_types.h"

/***********************************************************************
 * Function: PWM_SetSamplingRate                                       *
 *                                                                     *
 * Purpose: Sets the sampling period of the PWM hardware.  The period  *
 *          of the PWM should be the same as the sampling rate of the  *
 *          audio being played.  This function calculates the proper   *
 *          modulus of the PWM period counter based on the sample rate *
 *          and the period counter's clock rate                        *
 *                                                                     *
 * Input:   Sample rate of current set of audio samples                *
 *          Base address of PWM peripheral                             *
 * Output:  Writes period value to PWM hardware                        * 
 **********************************************************************/
 
void PWM_SetSamplingRate( alt_u32 new_sample_rate, alt_u32 pwm_base_addr )
{
  static alt_u32 current_sample_rate = 0;
  alt_u32 pwm_period = 0;
  
  /* Only need to change it if it's different.*/
  if ( new_sample_rate != current_sample_rate )
  {
    current_sample_rate = new_sample_rate;
    pwm_period = ( PWM_CLOCK_RATE / current_sample_rate );
  
    /* Write sampling period to the PWM peripheral */
    IOWR_16DIRECT( pwm_base_addr, PWM_PERIOD_OFFSET, pwm_period );
  }
  return;
}

/***********************************************************************
 * Function: PWM_PlaySamples                                           *
 *                                                                     *
 * Purpose: Scales and writes a sample stream to the PWM fifo.  If     *
 *          there isnt room in the FIFO, we return -1 to indicate we   *
 *          couldn't accept the samples at this time                   *
 *                                                                     *
 * Input:   Pointers to left and right channel audio sample buffers    *
 *          Number of samples currently in buffer ready for output     *
 *          Sample rate of audio                                       *
 *          PWM FIFO size                                              *
 *          PWM Base address                                           *
 * Output:  Writes playable samples to PWM FIFO hardware               *
 * Returns: Result code: 0 = Success, -1 = No room in FIFO             *
 **********************************************************************/

int PWM_PlaySamples( int *left, int *right, alt_u32 num_samples, 
                           alt_u32 sample_rate, alt_u32 fifo_size, 
                           alt_u32 pwm_base_addr )
{
  alt_u32 free_fifo_space;
  alt_u32 i;
  int ret_code = 0;
  signed int sample_l;   
  signed int sample_r;
  alt_u32 sample_period;
  alt_u32 composite_sample;
  
  /* Find out how much space is available in the pwm fifo */
  free_fifo_space = ( fifo_size - IORD_16DIRECT( pwm_base_addr, PWM_FIFO_USED_OFFSET ) );
  
  /* If there's enough room for the samples we have, scale 'em and stuff 'em */
  if( free_fifo_space >= num_samples )
  {
    sample_period = ( PWM_CLOCK_RATE / sample_rate );
    for( i = 0; i < num_samples; i++ )
    {
      /* Left channel */
      sample_l = PWM_ScaleSample( left[i], sample_period );
      /* Right channel */
      sample_r = PWM_ScaleSample( right[i], sample_period );

      /* 
       * Combine the left and right samples into one word and send 
       * them to the PWM 
       * */
      composite_sample = ( (sample_l << 16) | sample_r );
      IOWR_32DIRECT( pwm_base_addr, PWM_DATA_OFFSET, ( alt_u32 )composite_sample );
    }
    
    /* Woohoo! we were successful, so return 0 */
    ret_code = SUCCESS;
  }
  else
  {
    /* If there wasnt room, return -1 */
    ret_code = FAIL;
  }
  return ret_code;
}

/***********************************************************************
 * Function: PWM_ScaleSample                                           *
 *                                                                     *
 * Purpose: Takes a 24-bit signed sample and scales it to be playable  *
 *          by the PWM.  Scaling is dependant upon the sampling period *
 *          of the PWM                                                 *
 *                                                                     *
 * Input:   24-bit signed sample value                                 *
 *          Current sampling period of the PWM                         *
 * Output:  Properly scaled sample value                               *
 **********************************************************************/

int PWM_ScaleSample( int sample, int sampling_period )
{
  /* 
   * This sample scaling method for the PWM seems to give the best sound 
   * quality and volume consistency over varying sampling periods.  It does
   * however employ a mult and a div, which could hurt performance.
   */
  sample = ( ( sample >> 4 ) + 0x7fff );
  sample = ( ( sample * sampling_period ) / 0x0ffff );

# if 0
  /* 
   * This sample scaling method is fast, but has poorish audio quality
   */
  if(sample <= -0x10000000L)
    sample = 0;
  else if(sample >= 0x10000000L)
    sample = 0xfff;
  else
    sample = ((sample >> 17) & 0xfff)  ^0x00000800L;
# endif 
  
  return( sample );
}

/***********************************************************************
 * Function: PWM_Start                                                 *
 *                                                                     *
 * Purpose: Starts the playing of samples                              *
 *                                                                     *
 * Input:   PWM base address                                           *
 * Output:  Writes register value to PWM hardware                      *
 **********************************************************************/
 
void PWM_Start( alt_u32 pwm_base_addr )
{
  // Play audio
  IOWR_16DIRECT( pwm_base_addr, PWM_CONTROL_OFFSET, PWM_GO );
}

/***********************************************************************
 * Function: PWM_Stop                                                  *
 *                                                                     *
 * Purpose: Stops the playing of samples                               *
 *                                                                     *
 * Input:   PWM base address                                           *
 * Output:  Writes register value to PWM hardware                      *
 **********************************************************************/
 
void PWM_Stop( alt_u32 pwm_base_addr )
{
  // shut off audio
  IOWR_16DIRECT( pwm_base_addr, PWM_CONTROL_OFFSET, PWM_STOP );
}

/***********************************************************************
 * Function: PWM_ResetPWM                                              *
 *                                                                     *
 * Purpose: Stops the playing of samples and resets the PWM hardware   *
 *                                                                     *
 * Input:   PWM base address                                           *
 * Output:  Writes register values to PWM hardware                     *
 **********************************************************************/

void PWM_ResetPWM( alt_u32 pwm_base_addr )
{
  // reset the PWM, then return it to stopped state
  IOWR_16DIRECT( pwm_base_addr, PWM_CONTROL_OFFSET, PWM_RESET );
  IOWR_16DIRECT( pwm_base_addr, PWM_CONTROL_OFFSET, PWM_STOP );
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
老司机免费视频一区二区三区| 精品午夜一区二区三区在线观看| aaa欧美色吧激情视频| 国产亚洲综合在线| 国产精品一二一区| 国产网站一区二区| 成人性生交大片免费看在线播放| 久久久久久免费网| 高清久久久久久| 久久久www成人免费无遮挡大片| 国精品**一区二区三区在线蜜桃| 91精品久久久久久久久99蜜臂| 天使萌一区二区三区免费观看| 欧美日韩国产欧美日美国产精品| 午夜亚洲福利老司机| 欧美日韩精品一区二区三区| 偷拍与自拍一区| 欧美一区二区性放荡片| 美女视频网站久久| 精品国产露脸精彩对白| 国产原创一区二区| 日本一区二区三区四区在线视频| 成人免费看的视频| 中文字幕欧美一| 91行情网站电视在线观看高清版| 亚洲国产精品一区二区尤物区| 欧美色综合久久| 日韩制服丝袜av| 欧美mv和日韩mv国产网站| 国产一区二区三区免费在线观看| 日本一区二区三区视频视频| 93久久精品日日躁夜夜躁欧美| 亚洲激情自拍偷拍| 欧美久久久久久蜜桃| 开心九九激情九九欧美日韩精美视频电影 | 亚洲精品视频观看| 欧美日韩www| 精品无人码麻豆乱码1区2区 | 欧美mv日韩mv国产| 粉嫩aⅴ一区二区三区四区| 亚洲三级免费电影| 欧美日韩成人激情| 国产精品一区久久久久| 亚洲视频在线观看一区| 666欧美在线视频| 国产一区二区三区香蕉| 亚洲欧美视频一区| 91麻豆精品国产综合久久久久久 | 免费看欧美女人艹b| 久久久久久久久免费| 色哟哟一区二区| 秋霞国产午夜精品免费视频| 久久久国产午夜精品 | 欧美色爱综合网| 精品一区二区三区免费视频| 国产精品久久久久久久久免费相片| 欧美自拍偷拍午夜视频| 奇米色一区二区三区四区| 中文一区在线播放| 欧美老年两性高潮| 成人午夜在线播放| 香港成人在线视频| 久久久久国产精品人| 欧美天堂一区二区三区| 国产精品一区二区三区99| 一区二区在线看| 精品国产一区二区亚洲人成毛片 | 欧美一区二区三区免费观看视频| 国产大陆a不卡| 亚洲成人激情av| 国产日韩av一区二区| 欧美日韩一区在线观看| 国产乱码精品一区二区三区五月婷| 亚洲黄色性网站| 久久精品视频在线看| 欧洲色大大久久| 国产99久久精品| 日韩av一区二区三区四区| 一色屋精品亚洲香蕉网站| 欧美一区三区四区| 色欧美日韩亚洲| 高清beeg欧美| 日韩中文字幕亚洲一区二区va在线 | 亚洲第一久久影院| 中文字幕在线观看不卡| 精品国产一区二区三区忘忧草 | 欧美疯狂性受xxxxx喷水图片| 久久国产夜色精品鲁鲁99| 亚洲欧美经典视频| 亚洲精品一区二区三区蜜桃下载| 色综合中文字幕国产| 麻豆精品一区二区| 亚洲女性喷水在线观看一区| 欧美va在线播放| 欧美色综合久久| 成人免费毛片app| 久久精品国产99国产| 一区二区三区蜜桃| 欧美韩国日本一区| 91精品国产入口| 欧美日韩精品综合在线| gogogo免费视频观看亚洲一| 六月丁香婷婷色狠狠久久| 亚洲精品日产精品乱码不卡| 日本一区二区三区dvd视频在线| 欧美美女bb生活片| 在线看国产一区| 成+人+亚洲+综合天堂| 久久精品国产999大香线蕉| 亚洲国产欧美在线| 中文字幕综合网| 国产欧美一区二区在线观看| 制服丝袜亚洲精品中文字幕| 欧美日韩一区高清| 91小视频在线免费看| 国产成人免费网站| 国产一区高清在线| 奇米四色…亚洲| 青青草97国产精品免费观看 | 亚洲永久精品国产| 国产精品美女久久久久aⅴ国产馆| 久久蜜桃一区二区| 日韩亚洲欧美成人一区| 欧美日韩一级大片网址| 91污片在线观看| 国产91精品久久久久久久网曝门 | 亚洲电影一区二区| 亚洲免费观看高清完整版在线观看 | 日韩欧美国产午夜精品| 在线成人av网站| 欧美三级日韩三级| 色菇凉天天综合网| 色综合一个色综合| 在线观看一区日韩| 91福利视频久久久久| 91亚洲国产成人精品一区二三| 成人av资源在线观看| 丰满少妇久久久久久久| 国产精品自拍av| 狂野欧美性猛交blacked| 狠狠色伊人亚洲综合成人| 日本女优在线视频一区二区| 午夜婷婷国产麻豆精品| 午夜久久久久久久久| 天天色天天操综合| 日本网站在线观看一区二区三区 | 日韩一区二区三| 欧美一区二区三区视频免费| 91精品国产色综合久久久蜜香臀| 91精品国产福利| 欧美成人video| 精品欧美一区二区在线观看| 精品久久久久一区| www欧美成人18+| 久久精品视频免费| 国产精品乱人伦中文| 最好看的中文字幕久久| 一区二区三区蜜桃网| 亚洲超丰满肉感bbw| 日韩av网站免费在线| 精品综合久久久久久8888| 国产在线精品国自产拍免费| 国产精品456露脸| 95精品视频在线| 欧美日韩一区二区三区四区五区| 欧美顶级少妇做爰| 欧美精品一区视频| 中文字幕欧美日本乱码一线二线| 亚洲欧洲成人自拍| 图片区小说区国产精品视频| 久久精品国产在热久久| 国产精品亚洲午夜一区二区三区 | 国产剧情av麻豆香蕉精品| 不卡av在线网| 欧美亚男人的天堂| 欧美一激情一区二区三区| 久久免费国产精品 | 欧美亚洲动漫精品| 欧美电影免费观看高清完整版在线观看 | 中文字幕日韩精品一区| 亚洲mv在线观看| 国产精品主播直播| 精品视频在线免费看| 日韩一区二区中文字幕| 欧美国产一区二区| 夜夜爽夜夜爽精品视频| 热久久免费视频| 国产自产视频一区二区三区| 一本大道久久a久久精品综合| 欧美日韩aaaaaa| 久久先锋影音av鲁色资源网| **欧美大码日韩| 免费成人在线观看| 激情综合色播激情啊| 91麻豆国产在线观看| 日韩欧美在线影院| 亚洲欧洲成人自拍| 麻豆精品一区二区| 99国产精品久久久| 日韩无一区二区|