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

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

?? pcm.c

?? Linux驅(qū)動(dòng)編程源碼
?? C
?? 第 1 頁(yè) / 共 3 頁(yè)
字號(hào):
/*
 *  This small demo sends a simple sinusoidal wave to your speakers.
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sched.h>
#include <errno.h>
#include <getopt.h>
#include "../include/asoundlib.h"
#include <sys/time.h>
#include <math.h>

static char *device = "plughw:0,0";                     /* playback device */
static snd_pcm_format_t format = SND_PCM_FORMAT_S16;    /* sample format */
static unsigned int rate = 44100;                       /* stream rate */
static unsigned int channels = 1;                       /* count of channels */
static unsigned int buffer_time = 500000;               /* ring buffer length in us */
static unsigned int period_time = 100000;               /* period time in us */
static double freq = 440;                               /* sinusoidal wave frequency in Hz */
static int verbose = 0;                         /* verbose flag */
static int resample = 1;                                /* enable alsa-lib resampling */

static snd_pcm_sframes_t buffer_size;
static snd_pcm_sframes_t period_size;
static snd_output_t *output = NULL;

static void generate_sine(const snd_pcm_channel_area_t *areas, 
                          snd_pcm_uframes_t offset,
                          int count, double *_phase)
{
        static double max_phase = 2. * M_PI;
        double phase = *_phase;
        double step = max_phase*freq/(double)rate;
        double res;
        unsigned char *samples[channels], *tmp;
        int steps[channels];
        unsigned int chn, byte;
        int ires;
        unsigned int maxval = (1 << (snd_pcm_format_width(format) - 1)) - 1;
        int bps = snd_pcm_format_width(format) / 8;  /* bytes per sample */
        
        /* verify and prepare the contents of areas */
        for (chn = 0; chn < channels; chn++) {
                if ((areas[chn].first % 8) != 0) {
                        printf("areas[%i].first == %i, aborting...\n", chn, areas[chn].first);
                        exit(EXIT_FAILURE);
                }
                samples[chn] = /*(signed short *)*/(((unsigned char *)areas[chn].addr) + (areas[chn].first / 8));
                if ((areas[chn].step % 16) != 0) {
                        printf("areas[%i].step == %i, aborting...\n", chn, areas[chn].step);
                        exit(EXIT_FAILURE);
                }
                steps[chn] = areas[chn].step / 8;
                samples[chn] += offset * steps[chn];
        }
        /* fill the channel areas */
        while (count-- > 0) {
                res = sin(phase) * maxval;
                ires = res;
                tmp = (unsigned char *)(&ires);
                for (chn = 0; chn < channels; chn++) {
                        for (byte = 0; byte < (unsigned int)bps; byte++)
                                *(samples[chn] + byte) = tmp[byte];
                        samples[chn] += steps[chn];
                }
                phase += step;
                if (phase >= max_phase)
                        phase -= max_phase;
        }
        *_phase = phase;
}

static int set_hwparams(snd_pcm_t *handle,
                        snd_pcm_hw_params_t *params,
                        snd_pcm_access_t access)
{
        unsigned int rrate;
        snd_pcm_uframes_t size;
        int err, dir;

        /* choose all parameters */
        err = snd_pcm_hw_params_any(handle, params);
        if (err < 0) {
                printf("Broken configuration for playback: no configurations available: %s\n", snd_strerror(err));
                return err;
        }
        /* set hardware resampling */
        err = snd_pcm_hw_params_set_rate_resample(handle, params, resample);
        if (err < 0) {
                printf("Resampling setup failed for playback: %s\n", snd_strerror(err));
                return err;
        }
        /* set the interleaved read/write format */
        err = snd_pcm_hw_params_set_access(handle, params, access);
        if (err < 0) {
                printf("Access type not available for playback: %s\n", snd_strerror(err));
                return err;
        }
        /* set the sample format */
        err = snd_pcm_hw_params_set_format(handle, params, format);
        if (err < 0) {
                printf("Sample format not available for playback: %s\n", snd_strerror(err));
                return err;
        }
        /* set the count of channels */
        err = snd_pcm_hw_params_set_channels(handle, params, channels);
        if (err < 0) {
                printf("Channels count (%i) not available for playbacks: %s\n", channels, snd_strerror(err));
                return err;
        }
        /* set the stream rate */
        rrate = rate;
        err = snd_pcm_hw_params_set_rate_near(handle, params, &rrate, 0);
        if (err < 0) {
                printf("Rate %iHz not available for playback: %s\n", rate, snd_strerror(err));
                return err;
        }
        if (rrate != rate) {
                printf("Rate doesn't match (requested %iHz, get %iHz)\n", rate, err);
                return -EINVAL;
        }
        /* set the buffer time */
        err = snd_pcm_hw_params_set_buffer_time_near(handle, params, &buffer_time, &dir);
        if (err < 0) {
                printf("Unable to set buffer time %i for playback: %s\n", buffer_time, snd_strerror(err));
                return err;
        }
        err = snd_pcm_hw_params_get_buffer_size(params, &size);
        if (err < 0) {
                printf("Unable to get buffer size for playback: %s\n", snd_strerror(err));
                return err;
        }
        buffer_size = size;
        /* set the period time */
        err = snd_pcm_hw_params_set_period_time_near(handle, params, &period_time, &dir);
        if (err < 0) {
                printf("Unable to set period time %i for playback: %s\n", period_time, snd_strerror(err));
                return err;
        }
        err = snd_pcm_hw_params_get_period_size(params, &size, &dir);
        if (err < 0) {
                printf("Unable to get period size for playback: %s\n", snd_strerror(err));
                return err;
        }
        period_size = size;
        /* write the parameters to device */
        err = snd_pcm_hw_params(handle, params);
        if (err < 0) {
                printf("Unable to set hw params for playback: %s\n", snd_strerror(err));
                return err;
        }
        return 0;
}

static int set_swparams(snd_pcm_t *handle, snd_pcm_sw_params_t *swparams)
{
        int err;

        /* get the current swparams */
        err = snd_pcm_sw_params_current(handle, swparams);
        if (err < 0) {
                printf("Unable to determine current swparams for playback: %s\n", snd_strerror(err));
                return err;
        }
        /* start the transfer when the buffer is almost full: */
        /* (buffer_size / avail_min) * avail_min */
        err = snd_pcm_sw_params_set_start_threshold(handle, swparams, (buffer_size / period_size) * period_size);
        if (err < 0) {
                printf("Unable to set start threshold mode for playback: %s\n", snd_strerror(err));
                return err;
        }
        /* allow the transfer when at least period_size samples can be processed */
        err = snd_pcm_sw_params_set_avail_min(handle, swparams, period_size);
        if (err < 0) {
                printf("Unable to set avail min for playback: %s\n", snd_strerror(err));
                return err;
        }
        /* align all transfers to 1 sample */
        err = snd_pcm_sw_params_set_xfer_align(handle, swparams, 1);
        if (err < 0) {
                printf("Unable to set transfer align for playback: %s\n", snd_strerror(err));
                return err;
        }
        /* write the parameters to the playback device */
        err = snd_pcm_sw_params(handle, swparams);
        if (err < 0) {
                printf("Unable to set sw params for playback: %s\n", snd_strerror(err));
                return err;
        }
        return 0;
}

/*
 *   Underrun and suspend recovery
 */
 
static int xrun_recovery(snd_pcm_t *handle, int err)
{
        if (err == -EPIPE) {    /* under-run */
                err = snd_pcm_prepare(handle);
                if (err < 0)
                        printf("Can't recovery from underrun, prepare failed: %s\n", snd_strerror(err));
                return 0;
        } else if (err == -ESTRPIPE) {
                while ((err = snd_pcm_resume(handle)) == -EAGAIN)
                        sleep(1);       /* wait until the suspend flag is released */
                if (err < 0) {
                        err = snd_pcm_prepare(handle);
                        if (err < 0)
                                printf("Can't recovery from suspend, prepare failed: %s\n", snd_strerror(err));
                }
                return 0;
        }
        return err;
}

/*
 *   Transfer method - write only
 */

static int write_loop(snd_pcm_t *handle,
                      signed short *samples,
                      snd_pcm_channel_area_t *areas)
{
        double phase = 0;
        signed short *ptr;
        int err, cptr;

        while (1) {
                generate_sine(areas, 0, period_size, &phase);
                ptr = samples;
                cptr = period_size;
                while (cptr > 0) {
                        err = snd_pcm_writei(handle, ptr, cptr);
                        if (err == -EAGAIN)
                                continue;
                        if (err < 0) {
                                if (xrun_recovery(handle, err) < 0) {
                                        printf("Write error: %s\n", snd_strerror(err));
                                        exit(EXIT_FAILURE);
                                }
                                break;  /* skip one period */
                        }
                        ptr += err * channels;
                        cptr -= err;
                }
        }
}
 
/*
 *   Transfer method - write and wait for room in buffer using poll
 */

static int wait_for_poll(snd_pcm_t *handle, struct pollfd *ufds, unsigned int count)
{
        unsigned short revents;

        while (1) {
                poll(ufds, count, -1);
                snd_pcm_poll_descriptors_revents(handle, ufds, count, &revents);
                if (revents & POLLERR)
                        return -EIO;
                if (revents & POLLOUT)
                        return 0;
        }
}

static int write_and_poll_loop(snd_pcm_t *handle,
                               signed short *samples,
                               snd_pcm_channel_area_t *areas)
{
        struct pollfd *ufds;
        double phase = 0;
        signed short *ptr;
        int err, count, cptr, init;

        count = snd_pcm_poll_descriptors_count (handle);
        if (count <= 0) {
                printf("Invalid poll descriptors count\n");
                return count;
        }

        ufds = malloc(sizeof(struct pollfd) * count);
        if (ufds == NULL) {
                printf("No enough memory\n");
                return -ENOMEM;
        }
        if ((err = snd_pcm_poll_descriptors(handle, ufds, count)) < 0) {
                printf("Unable to obtain poll descriptors for playback: %s\n", snd_strerror(err));
                return err;
        }

        init = 1;

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色欧美片视频在线观看在线视频| 欧亚洲嫩模精品一区三区| 亚洲欧美国产三级| 日韩一区二区三区四区| 91视频免费看| 激情综合网av| 亚洲高清免费视频| 国产精品午夜免费| 日韩一区二区三区免费观看| eeuss鲁片一区二区三区在线观看| 视频一区二区三区在线| 亚洲欧美一区二区三区极速播放 | 日韩精品久久久久久| 久久久av毛片精品| 宅男在线国产精品| 欧洲生活片亚洲生活在线观看| 国产精品一区不卡| 久久精品国产**网站演员| 亚洲综合图片区| 国产精品久99| 国产欧美精品一区aⅴ影院| 欧美一区2区视频在线观看| 欧美中文字幕一二三区视频| 成人精品小蝌蚪| 大白屁股一区二区视频| 黑人精品欧美一区二区蜜桃 | 国产一区二区美女| 人人狠狠综合久久亚洲| 亚洲精品免费视频| 国产精品亲子伦对白| 久久亚洲精品小早川怜子| 91精品国产aⅴ一区二区| 日本韩国精品一区二区在线观看| 精品日韩在线观看| 欧美日韩不卡一区| 欧美美女bb生活片| 欧美日韩黄色影视| 欧美无砖砖区免费| 色国产综合视频| 91在线丨porny丨国产| 粉嫩av一区二区三区| 国产精品123区| 国产丶欧美丶日本不卡视频| 国产精品888| 成人激情免费视频| 99国产精品久久久| 91麻豆文化传媒在线观看| 99久久国产综合精品女不卡| 国产女同互慰高潮91漫画| 精品久久久久久综合日本欧美 | 欧美三级中文字| 色婷婷亚洲精品| 在线视频你懂得一区| 欧美在线色视频| 欧美精品一二三四| 91精品国产综合久久国产大片| 欧美一区欧美二区| 久久综合色一综合色88| 欧美国产激情一区二区三区蜜月| 国产精品国产a级| 亚洲一区二区三区在线看| 午夜精品福利一区二区蜜股av | 91视视频在线观看入口直接观看www| 99久久久无码国产精品| 欧美在线制服丝袜| 日韩免费电影一区| 日本一区二区视频在线| 亚洲精品精品亚洲| 日韩精品亚洲专区| 国产精品亚洲午夜一区二区三区| eeuss鲁片一区二区三区在线观看| 色婷婷综合久久久中文字幕| 91精品欧美福利在线观看| 久久久久久久久久久久久久久99| 成人欧美一区二区三区1314 | 亚洲黄色在线视频| 日韩主播视频在线| 国产成人在线色| 在线视频国产一区| 精品欧美乱码久久久久久1区2区| 欧美国产1区2区| 一个色综合av| 精品写真视频在线观看| 99re热这里只有精品视频| 4438成人网| 中文字幕+乱码+中文字幕一区| 洋洋av久久久久久久一区| 国产一区二区影院| 日本韩国一区二区三区视频| 精品国产一区二区在线观看| 国产精品国产三级国产a| 日本女优在线视频一区二区| 成人精品免费视频| 欧美一区二区在线免费观看| 国产精品久线在线观看| 免费观看日韩电影| 日本韩国精品一区二区在线观看| 久久综合中文字幕| 亚洲国产日韩综合久久精品| 国产91丝袜在线播放| 日韩一区二区三区在线视频| 亚洲人123区| 国产精品一二一区| 欧美精品久久一区二区三区| 国产精品久久久久久福利一牛影视| 婷婷六月综合网| 91一区一区三区| 国产三级精品视频| 美女脱光内衣内裤视频久久影院| 色欧美88888久久久久久影院| 久久久国产精华| 理论电影国产精品| 欧美日韩一区二区电影| 中文字幕日韩欧美一区二区三区| 国产在线国偷精品产拍免费yy | 欧美一区日韩一区| 亚洲精品乱码久久久久久| 成人性生交大片免费看中文| 日韩写真欧美这视频| 午夜精品aaa| 欧美色图片你懂的| 亚洲精品水蜜桃| 99视频精品全部免费在线| 日本一区二区电影| 国产福利一区二区三区视频| 精品日本一线二线三线不卡| 免费在线看一区| 欧美一区二区三区免费观看视频| 亚洲一卡二卡三卡四卡无卡久久| 一本色道a无线码一区v| 综合亚洲深深色噜噜狠狠网站| 国产乱码精品一区二区三区忘忧草| 欧美一区二区三区在| 日韩主播视频在线| 制服丝袜亚洲精品中文字幕| 亚洲国产日韩综合久久精品| 日本精品免费观看高清观看| 亚洲精品免费电影| 欧美亚洲日本国产| 亚洲综合色丁香婷婷六月图片| 91国偷自产一区二区使用方法| 亚洲精品videosex极品| 91黄色在线观看| 亚洲成a天堂v人片| 欧美一区二区三区视频免费| 奇米四色…亚洲| 久久夜色精品国产噜噜av| 国产一区二区三区四区在线观看| 欧美成人video| 国产成人小视频| 日韩一区在线播放| 欧美视频一区二区三区四区| 日韩精品成人一区二区三区| 日韩一区二区中文字幕| 国产一区999| 中文字幕一区在线| 91精品福利视频| 首页亚洲欧美制服丝腿| 欧美电影免费观看高清完整版| 国内不卡的二区三区中文字幕| 国产三区在线成人av| 99国产欧美另类久久久精品| 亚洲综合免费观看高清在线观看| 欧美久久久久久久久| 精品无人码麻豆乱码1区2区 | 国产精品卡一卡二| 色先锋资源久久综合| 亚洲国产另类av| 欧美mv和日韩mv国产网站| 成人在线视频一区| 亚洲国产精品久久久男人的天堂| 日韩一区二区电影网| 国产传媒久久文化传媒| 亚洲欧美乱综合| 欧美一级二级三级乱码| 国产91露脸合集magnet| 亚洲国产日韩一区二区| 26uuu久久综合| 欧美在线视频全部完| 国内精品在线播放| 亚洲乱码国产乱码精品精的特点 | 欧美一区二区三区啪啪| 国产成人综合自拍| 亚洲国产日韩一级| 国产日韩欧美一区二区三区乱码| 91久久免费观看| 国产成人h网站| 日韩高清一区在线| 中日韩免费视频中文字幕| 91精品国产综合久久国产大片| 成人黄色免费短视频| 日韩av二区在线播放| 成人欧美一区二区三区| 欧美成人精品1314www| 91老师片黄在线观看| 国产麻豆成人精品| 亚洲123区在线观看| 亚洲四区在线观看| 久久婷婷成人综合色| 欧美日韩成人在线|