sound/isa/wavefront/wavefront_midi.c
Source file repositories/reference/linux-study-clean/sound/isa/wavefront/wavefront_midi.c
File Facts
- System
- Linux kernel
- Corpus path
sound/isa/wavefront/wavefront_midi.c- Extension
.c- Size
- 15382 bytes
- Lines
- 602
- Domain
- Driver Families
- Bucket
- sound/isa
- Inferred role
- Driver Families: implementation source
- Status
- source implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/io.hlinux/init.hlinux/time.hlinux/wait.hsound/core.hsound/snd_wavefront.h
Detected Declarations
function Copyrightfunction input_availfunction output_readyfunction read_datafunction write_datafunction get_wavefront_midifunction snd_wavefront_midi_output_writefunction bytefunction snd_wavefront_midi_input_openfunction snd_wavefront_midi_output_openfunction snd_wavefront_midi_input_closefunction snd_wavefront_midi_output_closefunction snd_wavefront_midi_input_triggerfunction snd_wavefront_midi_output_timerfunction scoped_guardfunction snd_wavefront_midi_output_triggerfunction scoped_guardfunction snd_wavefront_midi_interruptfunction scoped_guardfunction snd_wavefront_midi_enable_virtualfunction snd_wavefront_midi_disable_virtualfunction snd_wavefront_midi_suspendfunction snd_wavefront_midi_resumefunction scoped_guardfunction snd_wavefront_midi_start
Annotated Snippet
if (output_ready (midi)) {
if (snd_rawmidi_transmit(midi->substream_output[midi->output_mpu], &midi_byte, 1) == 1) {
if (!midi->isvirtual ||
(midi_byte != WF_INTERNAL_SWITCH &&
midi_byte != WF_EXTERNAL_SWITCH))
write_data(midi, midi_byte);
max--;
} else {
if (midi->istimer) {
if (--midi->istimer <= 0)
timer_delete(&midi->timer);
}
midi->mode[midi->output_mpu] &= ~MPU401_MODE_OUTPUT_TRIGGER;
goto __second;
}
} else {
return;
}
}
__second:
if (midi->substream_output[!midi->output_mpu] == NULL) {
return;
}
while (max > 0) {
/* XXX fix me - no hard timing loops allowed! */
for (timeout = 30000; timeout > 0; timeout--) {
if (output_ready (midi))
break;
}
guard(spinlock_irqsave)(&midi->virtual);
if (!midi->isvirtual)
mask = 0;
mpu = midi->output_mpu ^ mask;
mask = 0; /* don't invert the value from now */
if ((midi->mode[mpu] & MPU401_MODE_OUTPUT) == 0)
return;
if (snd_rawmidi_transmit_empty(midi->substream_output[mpu]))
goto __timer;
if (output_ready (midi)) {
if (mpu != midi->output_mpu) {
write_data(midi, mpu == internal_mpu ?
WF_INTERNAL_SWITCH :
WF_EXTERNAL_SWITCH);
midi->output_mpu = mpu;
} else if (snd_rawmidi_transmit(midi->substream_output[mpu], &midi_byte, 1) == 1) {
if (!midi->isvirtual ||
(midi_byte != WF_INTERNAL_SWITCH &&
midi_byte != WF_EXTERNAL_SWITCH))
write_data(midi, midi_byte);
max--;
} else {
__timer:
if (midi->istimer) {
if (--midi->istimer <= 0)
timer_delete(&midi->timer);
}
midi->mode[mpu] &= ~MPU401_MODE_OUTPUT_TRIGGER;
return;
}
} else {
return;
}
}
}
static int snd_wavefront_midi_input_open(struct snd_rawmidi_substream *substream)
{
snd_wavefront_midi_t *midi;
snd_wavefront_mpu_id mpu;
if (snd_BUG_ON(!substream || !substream->rmidi))
return -ENXIO;
if (snd_BUG_ON(!substream->rmidi->private_data))
return -ENXIO;
mpu = *((snd_wavefront_mpu_id *) substream->rmidi->private_data);
midi = get_wavefront_midi(substream);
if (!midi)
return -EIO;
guard(spinlock_irqsave)(&midi->open);
midi->mode[mpu] |= MPU401_MODE_INPUT;
midi->substream_input[mpu] = substream;
Annotation
- Immediate include surface: `linux/io.h`, `linux/init.h`, `linux/time.h`, `linux/wait.h`, `sound/core.h`, `sound/snd_wavefront.h`.
- Detected declarations: `function Copyright`, `function input_avail`, `function output_ready`, `function read_data`, `function write_data`, `function get_wavefront_midi`, `function snd_wavefront_midi_output_write`, `function byte`, `function snd_wavefront_midi_input_open`, `function snd_wavefront_midi_output_open`.
- Atlas domain: Driver Families / sound/isa.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.