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

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

?? pcm.c

?? 宋寶華的《Linux設備驅動開發詳解》第一版的源代碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*
 *  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;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧洲日产国产综合网| 精品午夜久久福利影院| 热久久久久久久| 懂色av一区二区三区免费观看| 色婷婷精品久久二区二区蜜臂av| 日韩欧美一区二区在线视频| 亚洲人成网站精品片在线观看 | 国产情人综合久久777777| 亚洲综合视频在线观看| 丁香另类激情小说| 7777精品伊人久久久大香线蕉完整版 | 欧美日韩一区在线| 久久久久亚洲蜜桃| 日本网站在线观看一区二区三区 | 男人的天堂亚洲一区| 日本精品免费观看高清观看| 久久久久亚洲蜜桃| 久久精品噜噜噜成人88aⅴ | 国产ts人妖一区二区| 欧美精品久久99久久在免费线| 国产精品妹子av| 国产精品一区二区不卡| 日韩一区二区免费视频| 亚洲超丰满肉感bbw| 一本久道久久综合中文字幕| 国产精品色呦呦| 国产精品一区免费在线观看| 欧美高清视频不卡网| 亚洲一区二区三区中文字幕在线| 99精品国产91久久久久久| 国产亚洲精品资源在线26u| 精品一区二区精品| 精品国产污污免费网站入口| 蜜桃视频免费观看一区| 欧美一区二区播放| 麻豆极品一区二区三区| 精品日韩在线观看| 精品无人码麻豆乱码1区2区| 日韩一区二区三区电影在线观看| 日韩极品在线观看| 日韩一区和二区| 久久国产精品露脸对白| 精品电影一区二区| 国产成人亚洲精品狼色在线| 国产精品污污网站在线观看| 91精品国产91综合久久蜜臀| 日本三级韩国三级欧美三级| 日韩欧美亚洲国产另类| 韩国av一区二区三区四区| 精品国产欧美一区二区| 国产成人午夜电影网| 亚洲色图欧洲色图| 欧洲精品视频在线观看| 奇米综合一区二区三区精品视频| 日韩美女视频在线| 成人在线综合网| 一区二区日韩av| 日韩欧美国产成人一区二区| 国产成人一区二区精品非洲| 亚洲欧美韩国综合色| 91精品一区二区三区在线观看| 精品伊人久久久久7777人| 亚洲国产高清在线| 欧美色精品在线视频| 九色|91porny| 亚洲蜜臀av乱码久久精品蜜桃| 欧美日韩激情在线| 国产成人欧美日韩在线电影| 亚洲精品视频观看| 欧美精品一区二区三| 91猫先生在线| 激情文学综合丁香| 亚洲一区二区三区四区不卡| 精品欧美久久久| 色哟哟国产精品免费观看| 欧美aⅴ一区二区三区视频| 国产精品毛片a∨一区二区三区| 欧美吻胸吃奶大尺度电影 | 欧美精品黑人性xxxx| 国产精品一二三四| 亚洲国产一区二区三区青草影视| 2021国产精品久久精品| 色屁屁一区二区| 国产精品99久| 日韩国产一区二| 亚洲精品免费在线观看| 久久网站最新地址| 9191国产精品| 在线观看国产一区二区| 成人午夜在线视频| 久久9热精品视频| 午夜国产精品影院在线观看| 自拍偷拍亚洲激情| 国产亚洲一区二区三区| 欧美一区日韩一区| 91久久香蕉国产日韩欧美9色| 国产精品66部| 成人午夜激情片| 国内精品写真在线观看| 秋霞电影网一区二区| 一区二区三区高清在线| 中文字幕巨乱亚洲| 久久一留热品黄| 日韩视频一区二区在线观看| 欧美中文字幕一区二区三区| 91亚洲精品乱码久久久久久蜜桃| 国产福利一区在线观看| 久久精品国产在热久久| 男男视频亚洲欧美| 日韩中文字幕一区二区三区| 亚洲成人福利片| 亚洲成人免费影院| 亚洲成人av免费| 亚洲福利一区二区三区| 樱花影视一区二区| 亚洲美女视频在线| 亚洲欧美另类久久久精品| 亚洲色图视频网| 亚洲日本成人在线观看| 亚洲免费观看高清完整版在线观看熊 | 免费黄网站欧美| 免费看日韩精品| 麻豆精品新av中文字幕| 久久99精品国产.久久久久| 美女网站在线免费欧美精品| 久久精品久久综合| 国产精品综合一区二区三区| 高清不卡一区二区| a级高清视频欧美日韩| 91片黄在线观看| 欧美亚洲综合网| 91精品综合久久久久久| 精品久久人人做人人爰| 久久久亚洲国产美女国产盗摄| 国产日韩欧美一区二区三区综合| 国产欧美精品一区| 亚洲免费毛片网站| 日日摸夜夜添夜夜添亚洲女人| 蜜桃视频免费观看一区| 国产成人综合在线| 色哟哟国产精品免费观看| 91麻豆精品国产自产在线| 亚洲美女视频在线| 三级一区在线视频先锋| 国产精品自拍av| 色综合久久久久综合99| 制服丝袜国产精品| 久久精品欧美日韩| 伊人婷婷欧美激情| 九九九精品视频| 91猫先生在线| 精品日韩在线观看| 亚洲欧美日韩一区二区三区在线观看| 亚洲韩国精品一区| 国产精品一区二区三区99| 在线精品视频小说1| 精品国产免费人成在线观看| 国产精品电影一区二区三区| 性久久久久久久久久久久| 国产成人综合精品三级| 欧美猛男男办公室激情| 欧美国产禁国产网站cc| 日韩在线一区二区三区| 大白屁股一区二区视频| 91精品国产综合久久久久久久| 国产精品美女一区二区| 日韩 欧美一区二区三区| 99re视频精品| 欧美精品一区二区三区蜜桃| 亚洲第一主播视频| 99视频精品在线| 26uuu精品一区二区在线观看| 一区二区视频在线| 国产成人av一区二区三区在线观看| 欧美在线不卡一区| 国产精品久久久久影院色老大| 奇米一区二区三区| 欧美性感一区二区三区| 国产精品免费av| 韩国v欧美v亚洲v日本v| 69久久夜色精品国产69蝌蚪网| 亚洲视频一区在线| 国产成人精品一区二区三区四区| 欧美国产欧美综合| 狠狠狠色丁香婷婷综合久久五月| 欧美日韩成人综合| 一区二区三区日韩| 成人a级免费电影| 久久久久久久久久久电影| 免费高清在线视频一区·| 欧美日韩一区二区三区在线| 亚洲精选一二三| 95精品视频在线| 亚洲四区在线观看| 99久久精品国产一区二区三区 | 欧美性感一区二区三区| 亚洲色图在线播放| 色婷婷av一区二区三区大白胸| 国产精品国产三级国产普通话三级 | 日韩欧美电影一区|