Commit 2948f4a4 authored by Takashi Iwai's avatar Takashi Iwai
Browse files

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: default avatarTakashi Iwai <tiwai@suse.de>
parents 8dc5efe3 60081b35
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -156,6 +156,18 @@ struct uac2_feature_unit_descriptor {
	__u8 bmaControls[0]; /* variable length */
} __attribute__((packed));

/* 4.7.2.10 Effect Unit Descriptor */

struct uac2_effect_unit_descriptor {
	__u8 bLength;
	__u8 bDescriptorType;
	__u8 bDescriptorSubtype;
	__u8 bUnitID;
	__le16 wEffectType;
	__u8 bSourceID;
	__u8 bmaControls[]; /* variable length */
} __attribute__((packed));

/* 4.9.2 Class-Specific AS Interface Descriptor */

struct uac2_as_header_descriptor {
+3 −3
Original line number Diff line number Diff line
@@ -77,9 +77,9 @@ struct snd_rawmidi_substream {
	struct list_head list;		/* list of all substream for given stream */
	int stream;			/* direction */
	int number;			/* substream number */
	unsigned int opened: 1,		/* open flag */
		     append: 1,		/* append flag (merge more streams) */
		     active_sensing: 1; /* send active sensing when close */
	bool opened;			/* open flag */
	bool append;			/* append flag (merge more streams) */
	bool active_sensing;		/* send active sensing when close */
	int use_count;			/* use counter (for output) */
	size_t bytes;
	struct snd_rawmidi *rmidi;
+2 −1
Original line number Diff line number Diff line
@@ -2599,6 +2599,7 @@ void snd_pcm_release_substream(struct snd_pcm_substream *substream)

	snd_pcm_drop(substream);
	if (substream->hw_opened) {
		if (substream->runtime->status->state != SNDRV_PCM_STATE_OPEN)
			do_hw_free(substream);
		substream->ops->close(substream);
		substream->hw_opened = 0;
+2 −2
Original line number Diff line number Diff line
@@ -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;
+22 −7
Original line number Diff line number Diff line
@@ -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");
Loading