Merge branch 'topic/usb-uac2-effect-unit' into for-next
Merging the UAC2 effect unit parser improvement. As it's based on the previous usb-audio driver fix, it was deviated from for-next branch. Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
@@ -2599,7 +2599,8 @@ void snd_pcm_release_substream(struct snd_pcm_substream *substream)
|
||||
|
||||
snd_pcm_drop(substream);
|
||||
if (substream->hw_opened) {
|
||||
do_hw_free(substream);
|
||||
if (substream->runtime->status->state != SNDRV_PCM_STATE_OPEN)
|
||||
do_hw_free(substream);
|
||||
substream->ops->close(substream);
|
||||
substream->hw_opened = 0;
|
||||
}
|
||||
|
@@ -580,7 +580,7 @@ static int update_timestamp_of_queue(struct snd_seq_event *event,
|
||||
event->queue = queue;
|
||||
event->flags &= ~SNDRV_SEQ_TIME_STAMP_MASK;
|
||||
if (real_time) {
|
||||
event->time.time = snd_seq_timer_get_cur_time(q->timer);
|
||||
event->time.time = snd_seq_timer_get_cur_time(q->timer, true);
|
||||
event->flags |= SNDRV_SEQ_TIME_STAMP_REAL;
|
||||
} else {
|
||||
event->time.tick = snd_seq_timer_get_cur_tick(q->timer);
|
||||
@@ -1659,7 +1659,7 @@ static int snd_seq_ioctl_get_queue_status(struct snd_seq_client *client,
|
||||
tmr = queue->timer;
|
||||
status->events = queue->tickq->cells + queue->timeq->cells;
|
||||
|
||||
status->time = snd_seq_timer_get_cur_time(tmr);
|
||||
status->time = snd_seq_timer_get_cur_time(tmr, true);
|
||||
status->tick = snd_seq_timer_get_cur_tick(tmr);
|
||||
|
||||
status->running = tmr->running;
|
||||
|
@@ -238,6 +238,8 @@ void snd_seq_check_queue(struct snd_seq_queue *q, int atomic, int hop)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct snd_seq_event_cell *cell;
|
||||
snd_seq_tick_time_t cur_tick;
|
||||
snd_seq_real_time_t cur_time;
|
||||
|
||||
if (q == NULL)
|
||||
return;
|
||||
@@ -254,17 +256,18 @@ void snd_seq_check_queue(struct snd_seq_queue *q, int atomic, int hop)
|
||||
|
||||
__again:
|
||||
/* Process tick queue... */
|
||||
cur_tick = snd_seq_timer_get_cur_tick(q->timer);
|
||||
for (;;) {
|
||||
cell = snd_seq_prioq_cell_out(q->tickq,
|
||||
&q->timer->tick.cur_tick);
|
||||
cell = snd_seq_prioq_cell_out(q->tickq, &cur_tick);
|
||||
if (!cell)
|
||||
break;
|
||||
snd_seq_dispatch_event(cell, atomic, hop);
|
||||
}
|
||||
|
||||
/* Process time queue... */
|
||||
cur_time = snd_seq_timer_get_cur_time(q->timer, false);
|
||||
for (;;) {
|
||||
cell = snd_seq_prioq_cell_out(q->timeq, &q->timer->cur_time);
|
||||
cell = snd_seq_prioq_cell_out(q->timeq, &cur_time);
|
||||
if (!cell)
|
||||
break;
|
||||
snd_seq_dispatch_event(cell, atomic, hop);
|
||||
@@ -392,6 +395,7 @@ int snd_seq_queue_check_access(int queueid, int client)
|
||||
int snd_seq_queue_set_owner(int queueid, int client, int locked)
|
||||
{
|
||||
struct snd_seq_queue *q = queueptr(queueid);
|
||||
unsigned long flags;
|
||||
|
||||
if (q == NULL)
|
||||
return -EINVAL;
|
||||
@@ -401,8 +405,10 @@ int snd_seq_queue_set_owner(int queueid, int client, int locked)
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&q->owner_lock, flags);
|
||||
q->locked = locked ? 1 : 0;
|
||||
q->owner = client;
|
||||
spin_unlock_irqrestore(&q->owner_lock, flags);
|
||||
queue_access_unlock(q);
|
||||
queuefree(q);
|
||||
|
||||
@@ -539,15 +545,17 @@ void snd_seq_queue_client_termination(int client)
|
||||
unsigned long flags;
|
||||
int i;
|
||||
struct snd_seq_queue *q;
|
||||
bool matched;
|
||||
|
||||
for (i = 0; i < SNDRV_SEQ_MAX_QUEUES; i++) {
|
||||
if ((q = queueptr(i)) == NULL)
|
||||
continue;
|
||||
spin_lock_irqsave(&q->owner_lock, flags);
|
||||
if (q->owner == client)
|
||||
matched = (q->owner == client);
|
||||
if (matched)
|
||||
q->klocked = 1;
|
||||
spin_unlock_irqrestore(&q->owner_lock, flags);
|
||||
if (q->owner == client) {
|
||||
if (matched) {
|
||||
if (q->timer->running)
|
||||
snd_seq_timer_stop(q->timer);
|
||||
snd_seq_timer_reset(q->timer);
|
||||
@@ -739,6 +747,8 @@ void snd_seq_info_queues_read(struct snd_info_entry *entry,
|
||||
int i, bpm;
|
||||
struct snd_seq_queue *q;
|
||||
struct snd_seq_timer *tmr;
|
||||
bool locked;
|
||||
int owner;
|
||||
|
||||
for (i = 0; i < SNDRV_SEQ_MAX_QUEUES; i++) {
|
||||
if ((q = queueptr(i)) == NULL)
|
||||
@@ -750,9 +760,14 @@ void snd_seq_info_queues_read(struct snd_info_entry *entry,
|
||||
else
|
||||
bpm = 0;
|
||||
|
||||
spin_lock_irq(&q->owner_lock);
|
||||
locked = q->locked;
|
||||
owner = q->owner;
|
||||
spin_unlock_irq(&q->owner_lock);
|
||||
|
||||
snd_iprintf(buffer, "queue %d: [%s]\n", q->queue, q->name);
|
||||
snd_iprintf(buffer, "owned by client : %d\n", q->owner);
|
||||
snd_iprintf(buffer, "lock status : %s\n", q->locked ? "Locked" : "Free");
|
||||
snd_iprintf(buffer, "owned by client : %d\n", owner);
|
||||
snd_iprintf(buffer, "lock status : %s\n", locked ? "Locked" : "Free");
|
||||
snd_iprintf(buffer, "queued time events : %d\n", snd_seq_prioq_avail(q->timeq));
|
||||
snd_iprintf(buffer, "queued tick events : %d\n", snd_seq_prioq_avail(q->tickq));
|
||||
snd_iprintf(buffer, "timer state : %s\n", tmr->running ? "Running" : "Stopped");
|
||||
|
@@ -428,14 +428,15 @@ int snd_seq_timer_continue(struct snd_seq_timer *tmr)
|
||||
}
|
||||
|
||||
/* return current 'real' time. use timeofday() to get better granularity. */
|
||||
snd_seq_real_time_t snd_seq_timer_get_cur_time(struct snd_seq_timer *tmr)
|
||||
snd_seq_real_time_t snd_seq_timer_get_cur_time(struct snd_seq_timer *tmr,
|
||||
bool adjust_ktime)
|
||||
{
|
||||
snd_seq_real_time_t cur_time;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&tmr->lock, flags);
|
||||
cur_time = tmr->cur_time;
|
||||
if (tmr->running) {
|
||||
if (adjust_ktime && tmr->running) {
|
||||
struct timespec64 tm;
|
||||
|
||||
ktime_get_ts64(&tm);
|
||||
@@ -452,7 +453,13 @@ snd_seq_real_time_t snd_seq_timer_get_cur_time(struct snd_seq_timer *tmr)
|
||||
high PPQ values) */
|
||||
snd_seq_tick_time_t snd_seq_timer_get_cur_tick(struct snd_seq_timer *tmr)
|
||||
{
|
||||
return tmr->tick.cur_tick;
|
||||
snd_seq_tick_time_t cur_tick;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&tmr->lock, flags);
|
||||
cur_tick = tmr->tick.cur_tick;
|
||||
spin_unlock_irqrestore(&tmr->lock, flags);
|
||||
return cur_tick;
|
||||
}
|
||||
|
||||
|
||||
|
@@ -120,7 +120,8 @@ int snd_seq_timer_set_tempo_ppq(struct snd_seq_timer *tmr, int tempo, int ppq);
|
||||
int snd_seq_timer_set_position_tick(struct snd_seq_timer *tmr, snd_seq_tick_time_t position);
|
||||
int snd_seq_timer_set_position_time(struct snd_seq_timer *tmr, snd_seq_real_time_t position);
|
||||
int snd_seq_timer_set_skew(struct snd_seq_timer *tmr, unsigned int skew, unsigned int base);
|
||||
snd_seq_real_time_t snd_seq_timer_get_cur_time(struct snd_seq_timer *tmr);
|
||||
snd_seq_real_time_t snd_seq_timer_get_cur_time(struct snd_seq_timer *tmr,
|
||||
bool adjust_ktime);
|
||||
snd_seq_tick_time_t snd_seq_timer_get_cur_tick(struct snd_seq_timer *tmr);
|
||||
|
||||
extern int seq_default_timer_class;
|
||||
|
Reference in New Issue
Block a user