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

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

?? seq_timer.c

?? 優龍2410linux2.6.8內核源代碼
?? C
字號:
/* *   ALSA sequencer Timer *   Copyright (c) 1998-1999 by Frank van de Pol <fvdpol@coil.demon.nl> *                              Jaroslav Kysela <perex@suse.cz> * * *   This program is free software; you can redistribute it and/or modify *   it under the terms of the GNU General Public License as published by *   the Free Software Foundation; either version 2 of the License, or *   (at your option) any later version. * *   This program is distributed in the hope that it will be useful, *   but WITHOUT ANY WARRANTY; without even the implied warranty of *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *   GNU General Public License for more details. * *   You should have received a copy of the GNU General Public License *   along with this program; if not, write to the Free Software *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA * */#include <sound/driver.h>#include <sound/core.h>#include <linux/slab.h>#include "seq_timer.h"#include "seq_queue.h"#include "seq_info.h"extern int seq_default_timer_class;extern int seq_default_timer_sclass;extern int seq_default_timer_card;extern int seq_default_timer_device;extern int seq_default_timer_subdevice;extern int seq_default_timer_resolution;#define SKEW_BASE	0x10000	/* 16bit shift */void snd_seq_timer_set_tick_resolution(seq_timer_tick_t *tick, int tempo, int ppq, int nticks){	if (tempo < 1000000)		tick->resolution = (tempo * 1000) / ppq;	else {		/* might overflow.. */		unsigned int s;		s = tempo % ppq;		s = (s * 1000) / ppq;		tick->resolution = (tempo / ppq) * 1000;		tick->resolution += s;	}	if (tick->resolution <= 0)		tick->resolution = 1;	tick->resolution *= nticks;	snd_seq_timer_update_tick(tick, 0);}/* create new timer (constructor) */seq_timer_t *snd_seq_timer_new(void){	seq_timer_t *tmr;		tmr = snd_kcalloc(sizeof(seq_timer_t), GFP_KERNEL);	if (tmr == NULL) {		snd_printd("malloc failed for snd_seq_timer_new() \n");		return NULL;	}	spin_lock_init(&tmr->lock);	/* reset setup to defaults */	snd_seq_timer_defaults(tmr);		/* reset time */	snd_seq_timer_reset(tmr);		return tmr;}/* delete timer (destructor) */void snd_seq_timer_delete(seq_timer_t **tmr){	seq_timer_t *t = *tmr;	*tmr = NULL;	if (t == NULL) {		snd_printd("oops: snd_seq_timer_delete() called with NULL timer\n");		return;	}	t->running = 0;	/* reset time */	snd_seq_timer_stop(t);	snd_seq_timer_reset(t);	kfree(t);}void snd_seq_timer_defaults(seq_timer_t * tmr){	/* setup defaults */	tmr->ppq = 96;		/* 96 PPQ */	tmr->tempo = 500000;	/* 120 BPM */	snd_seq_timer_set_tick_resolution(&tmr->tick, tmr->tempo, tmr->ppq, 1);	tmr->running = 0;	tmr->type = SNDRV_SEQ_TIMER_ALSA;	tmr->alsa_id.dev_class = seq_default_timer_class;	tmr->alsa_id.dev_sclass = seq_default_timer_sclass;	tmr->alsa_id.card = seq_default_timer_card;	tmr->alsa_id.device = seq_default_timer_device;	tmr->alsa_id.subdevice = seq_default_timer_subdevice;	tmr->preferred_resolution = seq_default_timer_resolution;	tmr->skew = tmr->skew_base = SKEW_BASE;}void snd_seq_timer_reset(seq_timer_t * tmr){	unsigned long flags;	spin_lock_irqsave(&tmr->lock, flags);	/* reset time & songposition */	tmr->cur_time.tv_sec = 0;	tmr->cur_time.tv_nsec = 0;	tmr->tick.cur_tick = 0;	tmr->tick.fraction = 0;	spin_unlock_irqrestore(&tmr->lock, flags);}/* called by timer interrupt routine. the period time since previous invocation is passed */static void snd_seq_timer_interrupt(snd_timer_instance_t *timeri,				    unsigned long resolution,				    unsigned long ticks){	unsigned long flags;	queue_t *q = (queue_t *)timeri->callback_data;	seq_timer_t *tmr;	if (q == NULL)		return;	tmr = q->timer;	if (tmr == NULL)		return;	if (!tmr->running)		return;	resolution *= ticks;	if (tmr->skew != tmr->skew_base) {		/* FIXME: assuming skew_base = 0x10000 */		resolution = (resolution >> 16) * tmr->skew +			(((resolution & 0xffff) * tmr->skew) >> 16);	}	spin_lock_irqsave(&tmr->lock, flags);	/* update timer */	snd_seq_inc_time_nsec(&tmr->cur_time, resolution);	/* calculate current tick */	snd_seq_timer_update_tick(&tmr->tick, resolution);	/* register actual time of this timer update */	do_gettimeofday(&tmr->last_update);	spin_unlock_irqrestore(&tmr->lock, flags);	/* check queues and dispatch events */	snd_seq_check_queue(q, 1, 0);}/* set current tempo */int snd_seq_timer_set_tempo(seq_timer_t * tmr, int tempo){	unsigned long flags;	snd_assert(tmr, return -EINVAL);	if (tempo <= 0)		return -EINVAL;	spin_lock_irqsave(&tmr->lock, flags);	if ((unsigned int)tempo != tmr->tempo) {		tmr->tempo = tempo;		snd_seq_timer_set_tick_resolution(&tmr->tick, tmr->tempo, tmr->ppq, 1);	}	spin_unlock_irqrestore(&tmr->lock, flags);	return 0;}/* set current ppq */int snd_seq_timer_set_ppq(seq_timer_t * tmr, int ppq){	unsigned long flags;	snd_assert(tmr, return -EINVAL);	if (ppq <= 0)		return -EINVAL;	spin_lock_irqsave(&tmr->lock, flags);	if (tmr->running && (ppq != tmr->ppq)) {		/* refuse to change ppq on running timers */		/* because it will upset the song position (ticks) */		spin_unlock_irqrestore(&tmr->lock, flags);		snd_printd("seq: cannot change ppq of a running timer\n");		return -EBUSY;	}	tmr->ppq = ppq;	snd_seq_timer_set_tick_resolution(&tmr->tick, tmr->tempo, tmr->ppq, 1);	spin_unlock_irqrestore(&tmr->lock, flags);	return 0;}/* set current tick position */int snd_seq_timer_set_position_tick(seq_timer_t *tmr, snd_seq_tick_time_t position){	unsigned long flags;	snd_assert(tmr, return -EINVAL);	spin_lock_irqsave(&tmr->lock, flags);	tmr->tick.cur_tick = position;	tmr->tick.fraction = 0;	spin_unlock_irqrestore(&tmr->lock, flags);	return 0;}/* set current real-time position */int snd_seq_timer_set_position_time(seq_timer_t *tmr, snd_seq_real_time_t position){	unsigned long flags;	snd_assert(tmr, return -EINVAL);	snd_seq_sanity_real_time(&position);	spin_lock_irqsave(&tmr->lock, flags);	tmr->cur_time = position;	spin_unlock_irqrestore(&tmr->lock, flags);	return 0;}/* set timer skew */int snd_seq_timer_set_skew(seq_timer_t *tmr, unsigned int skew, unsigned int base){	unsigned long flags;	snd_assert(tmr, return -EINVAL);	/* FIXME */	if (base != SKEW_BASE) {		snd_printd("invalid skew base 0x%x\n", base);		return -EINVAL;	}	spin_lock_irqsave(&tmr->lock, flags);	tmr->skew = skew;	spin_unlock_irqrestore(&tmr->lock, flags);	return 0;}int snd_seq_timer_open(queue_t *q){	snd_timer_instance_t *t;	seq_timer_t *tmr;	char str[32];	int err;	tmr = q->timer;	snd_assert(tmr != NULL, return -EINVAL);	if (tmr->timeri)		return -EBUSY;	sprintf(str, "sequencer queue %i", q->queue);	if (tmr->type != SNDRV_SEQ_TIMER_ALSA)	/* standard ALSA timer */		return -EINVAL;	if (tmr->alsa_id.dev_class != SNDRV_TIMER_CLASS_SLAVE)		tmr->alsa_id.dev_sclass = SNDRV_TIMER_SCLASS_SEQUENCER;	err = snd_timer_open(&t, str, &tmr->alsa_id, q->queue);	if (err < 0 && tmr->alsa_id.dev_class != SNDRV_TIMER_CLASS_SLAVE) {		if (tmr->alsa_id.dev_class != SNDRV_TIMER_CLASS_GLOBAL ||		    tmr->alsa_id.device != SNDRV_TIMER_GLOBAL_SYSTEM) {			snd_timer_id_t tid;			memset(&tid, 0, sizeof(tid));			tid.dev_class = SNDRV_TIMER_CLASS_GLOBAL;			tid.dev_sclass = SNDRV_TIMER_SCLASS_SEQUENCER;			tid.card = -1;			tid.device = SNDRV_TIMER_GLOBAL_SYSTEM;			err = snd_timer_open(&t, str, &tid, q->queue);		}		if (err < 0) {			snd_printk(KERN_ERR "seq fatal error: cannot create timer (%i)\n", err);			return err;		}	}	t->callback = snd_seq_timer_interrupt;	t->callback_data = q;	t->flags |= SNDRV_TIMER_IFLG_AUTO;	tmr->timeri = t;	return 0;}int snd_seq_timer_close(queue_t *q){	seq_timer_t *tmr;		tmr = q->timer;	snd_assert(tmr != NULL, return -EINVAL);	if (tmr->timeri) {		snd_timer_stop(tmr->timeri);		snd_timer_close(tmr->timeri);		tmr->timeri = NULL;	}	return 0;}int snd_seq_timer_stop(seq_timer_t * tmr){	if (! tmr->timeri)		return -EINVAL;	if (!tmr->running)		return 0;	tmr->running = 0;	snd_timer_pause(tmr->timeri);	return 0;}static int initialize_timer(seq_timer_t *tmr){	snd_timer_t *t;	t = tmr->timeri->timer;	snd_assert(t, return -EINVAL);	tmr->ticks = 1;	if (tmr->preferred_resolution &&	    ! (t->hw.flags & SNDRV_TIMER_HW_SLAVE)) {		unsigned long r = t->hw.resolution;		if (! r && t->hw.c_resolution)			r = t->hw.c_resolution(t);		if (r) {			tmr->ticks = (unsigned int)(1000000000uL / (r * tmr->preferred_resolution));			if (! tmr->ticks)				tmr->ticks = 1;		}	}	tmr->initialized = 1;	return 0;}int snd_seq_timer_start(seq_timer_t * tmr){	if (! tmr->timeri)		return -EINVAL;	if (tmr->running)		snd_seq_timer_stop(tmr);	snd_seq_timer_reset(tmr);	if (initialize_timer(tmr) < 0)		return -EINVAL;	snd_timer_start(tmr->timeri, tmr->ticks);	tmr->running = 1;	do_gettimeofday(&tmr->last_update);	return 0;}int snd_seq_timer_continue(seq_timer_t * tmr){	if (! tmr->timeri)		return -EINVAL;	if (tmr->running)		return -EBUSY;	if (! tmr->initialized) {		snd_seq_timer_reset(tmr);		if (initialize_timer(tmr) < 0)			return -EINVAL;	}	snd_timer_start(tmr->timeri, tmr->ticks);	tmr->running = 1;	do_gettimeofday(&tmr->last_update);	return 0;}/* return current 'real' time. use timeofday() to get better granularity. */snd_seq_real_time_t snd_seq_timer_get_cur_time(seq_timer_t *tmr){	snd_seq_real_time_t cur_time;	cur_time = tmr->cur_time;	if (tmr->running) { 		struct timeval tm;		int usec;		do_gettimeofday(&tm);		usec = (int)(tm.tv_usec - tmr->last_update.tv_usec);		if (usec < 0) {			cur_time.tv_nsec += (1000000 + usec) * 1000;			cur_time.tv_sec += tm.tv_sec - tmr->last_update.tv_sec - 1;		} else {			cur_time.tv_nsec += usec * 1000;			cur_time.tv_sec += tm.tv_sec - tmr->last_update.tv_sec;		}		snd_seq_sanity_real_time(&cur_time);	}                	return cur_time;	}/* TODO: use interpolation on tick queue (will only be useful for very high PPQ values) */snd_seq_tick_time_t snd_seq_timer_get_cur_tick(seq_timer_t *tmr){	return tmr->tick.cur_tick;}/* exported to seq_info.c */void snd_seq_info_timer_read(snd_info_entry_t *entry, snd_info_buffer_t * buffer){	int idx;	queue_t *q;	seq_timer_t *tmr;	snd_timer_instance_t *ti;	unsigned long resolution;		for (idx = 0; idx < SNDRV_SEQ_MAX_QUEUES; idx++) {		q = queueptr(idx);		if (q == NULL)			continue;		if ((tmr = q->timer) == NULL ||		    (ti = tmr->timeri) == NULL) {			queuefree(q);			continue;		}		snd_iprintf(buffer, "Timer for queue %i : %s\n", q->queue, ti->timer->name);		resolution = snd_timer_resolution(ti) * tmr->ticks;		snd_iprintf(buffer, "  Period time : %lu.%09lu\n", resolution / 1000000000, resolution % 1000000000);		snd_iprintf(buffer, "  Skew : %u / %u\n", tmr->skew, tmr->skew_base);		queuefree(q); 	}}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91亚洲国产成人精品一区二区三 | 99精品视频在线免费观看| 麻豆精品一区二区三区| 喷水一区二区三区| 看片网站欧美日韩| 蜜臀久久99精品久久久画质超高清 | 欧美一区二区精美| 日韩免费观看2025年上映的电影| 在线综合亚洲欧美在线视频| 69p69国产精品| 欧美电影免费观看高清完整版在 | 美女一区二区三区在线观看| 麻豆国产欧美一区二区三区| 久久电影网站中文字幕| 国产一区二区三区免费观看| 国产麻豆91精品| 菠萝蜜视频在线观看一区| 99国产欧美久久久精品| 在线视频中文字幕一区二区| 欧美人体做爰大胆视频| 日韩一级二级三级| 国产亚洲一区二区三区四区| 亚洲国产高清在线观看视频| 日韩毛片精品高清免费| 亚洲综合色自拍一区| 视频一区视频二区中文字幕| 精品一区二区三区久久久| 成人免费av在线| 91国偷自产一区二区三区观看| 欧美女孩性生活视频| 久久一区二区三区四区| 国产精品欧美精品| 亚洲123区在线观看| 国产一区二区三区免费播放| 91在线精品一区二区三区| 欧美日韩综合在线| 精品国产一区二区国模嫣然| 国产精品传媒入口麻豆| 亚洲电影第三页| 精品一区二区三区免费播放 | 日韩午夜激情免费电影| 国产蜜臀av在线一区二区三区| 曰韩精品一区二区| 全部av―极品视觉盛宴亚洲| 国产91色综合久久免费分享| 欧洲精品在线观看| 久久精品一区二区三区四区| 亚洲国产美女搞黄色| 国产精品一区专区| 欧美日韩视频一区二区| 日本一区二区三区久久久久久久久不| 一区二区三区小说| 国产福利一区二区三区| 337p亚洲精品色噜噜| 中文字幕国产一区二区| 日韩精品亚洲一区| 91丝袜国产在线播放| 欧美大度的电影原声| 亚洲男人天堂一区| 国产一区啦啦啦在线观看| 欧美日韩久久不卡| 中文字幕亚洲不卡| 国产主播一区二区| 欧美色图一区二区三区| 国产精品美女久久久久久2018| 日韩黄色免费电影| 色88888久久久久久影院野外| 国产亚洲欧美日韩在线一区| 视频在线观看一区二区三区| 91视频一区二区三区| 久久久综合网站| 欧美aⅴ一区二区三区视频| 91福利视频网站| 国产精品天干天干在观线| 久久国产精品色| 欧美精品777| 亚洲在线免费播放| 91久久人澡人人添人人爽欧美 | 老鸭窝一区二区久久精品| 91麻豆国产在线观看| 国产日韩三级在线| 开心九九激情九九欧美日韩精美视频电影 | 国产在线播放一区三区四| 在线电影一区二区三区| 一区二区三区av电影| 97久久人人超碰| 国产精品午夜春色av| 国产美女在线精品| 精品国产一区二区三区av性色| 日本欧美一区二区三区乱码| 在线精品视频一区二区三四| 亚洲色欲色欲www| 99精品在线观看视频| 国产精品乱码久久久久久| 国产精品456| 久久精子c满五个校花| 国产精品一区在线观看乱码| 精品成人免费观看| 韩国一区二区三区| 久久免费的精品国产v∧| 久久99精品久久只有精品| 日韩精品一区二区三区视频| 麻豆精品新av中文字幕| 日韩精品最新网址| 韩国女主播一区| 国产亚洲精品aa| 国产精品原创巨作av| 久久久www免费人成精品| 国产一区二区中文字幕| 国产午夜亚洲精品羞羞网站| 国产乱子伦视频一区二区三区| 男人的天堂亚洲一区| 日韩视频在线永久播放| 韩国女主播成人在线| 久久久国产精华| 久久国产精品一区二区| 精品国产91久久久久久久妲己| 精品一区二区综合| 亚洲国产精品av| 波多野结衣中文字幕一区二区三区| 久久久精品欧美丰满| 亚洲久草在线视频| 色悠悠久久综合| 天天色综合成人网| 一本大道av伊人久久综合| 在线播放亚洲一区| 亚洲在线免费播放| 奇米精品一区二区三区在线观看一 | 日韩免费高清av| 国产在线视视频有精品| 中文字幕第一区综合| 成人污污视频在线观看| 亚洲精品免费播放| 91精品国产品国语在线不卡| 国内精品写真在线观看| 亚洲三级视频在线观看| 欧美日韩中文字幕一区| 韩国一区二区三区| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 日韩精品最新网址| 成人黄色av网站在线| 亚洲精品你懂的| 日韩欧美国产综合| 99精品黄色片免费大全| 日韩国产在线观看| 国产精品国产三级国产aⅴ无密码| 在线精品亚洲一区二区不卡| 捆绑紧缚一区二区三区视频 | 国产成人小视频| 亚洲一区在线观看视频| 久久亚洲综合av| 欧洲精品一区二区| 国产乱码一区二区三区| 亚洲一区在线免费观看| 国产欧美视频在线观看| 欧美精品777| 一本色道亚洲精品aⅴ| 久久99日本精品| 一区二区三区蜜桃| 久久日一线二线三线suv| 欧美在线观看你懂的| 国产成a人亚洲精品| 亚洲va韩国va欧美va| 国产精品三级电影| 欧美一级精品在线| 色婷婷综合激情| 国产精品18久久久久久久久久久久| 性久久久久久久久久久久| 国产精品久久久久久久久搜平片| 日韩一区二区免费在线观看| 91麻豆国产精品久久| 国产一区二区三区视频在线播放| 性欧美大战久久久久久久久| 国产精品国产三级国产a| 欧美成人女星排名| www.亚洲精品| 精品国产电影一区二区 | 成人av先锋影音| 在线播放中文字幕一区| 亚洲免费伊人电影| 国产乱码字幕精品高清av| 欧美日韩成人综合天天影院| 久久伊人蜜桃av一区二区| 亚洲一卡二卡三卡四卡五卡| 91美女视频网站| 在线综合+亚洲+欧美中文字幕| 国产精品久久久久9999吃药| 青娱乐精品视频| 欧美写真视频网站| 欧美激情一二三区| 国产一区二区三区不卡在线观看 | 日韩三级在线观看| 亚洲色图欧美偷拍| 91精品国产福利| 99国产一区二区三精品乱码| 中文字幕第一区第二区| 亚洲女爱视频在线| 丁香桃色午夜亚洲一区二区三区| 精品污污网站免费看| 亚洲自拍偷拍综合|