M-Audio produces some sound devices. Some of them are based on !BridgeCo DM1000 and BeBoB firmware. This page is the information for developing. == the list of devices == [Group0] - Firewire Solo - Firewire Audiophile - Ozonic - Firewire 410 [Group1] - Firewire 1814 - !Projectmix I/O [Group2] - NRV10 - Profire Lightbridge ... == Firmware version == The latest version of firmware for all models seems to be included 'Installer: 6.0.1 - Driver: 5.10.0.5058' as of Nov 14, 2009. But there is a new one for several models, Installer 6.0.4_Driver 5.10.0.5061.exe, as of June 2, 2012. == Boot up == Just after powering on, the boot loader is loaded. Then the bootloader load firmware. There is three behaviour. One is loading from ROM automatically. The other is loading from ROM by cue sent by system. The rest is downloading from system. The cue is 0x010000000000110100000000 to address 0xFFFFC8021000. This command must be transmitted one time. == Control Command == The control commands for devices which belong to Group0 is based on the specification of "AV/C Audio Subunit Specification 1.0 (TA Document 1999008)". This specification is "Audio Subunit" version of "AV/C Digital Interface Command Set General Specification, version 3 (TA Document April 1999)". Please see [wiki:BebobAvc]. - [wiki:MaudioBebob/FirewireSolo] - [wiki:MaudioBebob/Ozonic] - [wiki:MaudioBebob/FirewireAudiophile] - [wiki:MaudioBebob/Firewire410] The devices belong to Group1 have its own commands. There is no public specification. - [wiki:MaudioBebob/Firewire1814] - upper information can be also applied to !ProjectMix I/O == Streaming == Its streaming is based on IEC 61883-1 and -6. Additionally BeBoB firmware utilize its own command to identify the information of stream. The basic process to start streaming: 1. establish CMP connection for both of Output/Input (0xfffff0000904/0xfffff0000984) 2. send Input Plug Signal Command and Output Plug Signal Command to set sampling rate 3. keep isochronous resource for transmitting (from device) stream 4. start transmitting FFADO can transmit and receive streams to/from the devices belong to Group0. Group1 devices use its own way to identify the information of stream. The streamings from/to devices Gruop2 devices are a bit strange. The device starts transmitting stream by receiving Input/Output Plug Signal Format command again. == Metering == To get hardware metering, send asynchronous transaction of READ to address 0xffc700600000. Then the device send its current meter values. The size to read is different between devices. The value for level controller: 0x01 (turn right), 0x02 (turn left) The value for A/B switch: 0x01 (toggled) The value for SFC in current stram is undef when there are no streams. The structure: === Firewire 1814 and !ProjectMix I/O === {{{ SWITCH_0, SWITCH_1, ANA_IN_1, ANA_IN_2, ANA_IN_3, ANA_IN_4, ANA_IN_5, ANA_IN_6, ANA_IN_7, ANA_IN_8, DIG_IN_1, DIG_IN_2, (S/PDIF) DIG_IN_1, DIG_IN_2, DIG_IN_3, DIG_IN_4, DIG_IN_5, DIG_IN_6, DIG_IN_7, DIG_IN_8, (ADAT) ANA_OUT_1, ANA_OUT_2, ANA_OUT_3, ANA_OUT_4, DIG_OUT_1, DIG_OUT_2, (S/PDIF) DIG_OUT_1, DIG_OUT_2, DIG_OUT_3, DIG_OUT_4, DIG_OUT_5, DIG_OUT_6, DIG_OUT_7, DIG_OUT_8, (ADAT) HP_OUT_1, HP_OUT_2, HP_OUT_3, HP_OUT_4, AUX_OUT_1, AUX_OUT_2 CLOCK_INFO_1, CLOCK_INFO_2 }}} Each data has 16bit. Then totally 84bytes. SWITCH0: 0X 0Y (X: A/B switch, Y: Headphone 1) SWITCH1: 0X 0Y (X: Headphone 2, Y: Level Controller) CLOCK_INFO_1: unknown CLOCK_INFO_2: XX YY (XX: SFC in current stream, YY: unknown) === Firewire410 === {{{ ANA_IN_1, ANA_IN_2, DIG_IN_1, DIG_IN_2, ANA_OUT_1, ANA_OUT_2, ANA_OUT_3, ANA_OUT_4, ANA_OUT_5, ANA_OUT_6, ANA_OUT_7, ANA_OUT_8, DIG_OUT_1, DIG_OUT_2, HP_OUT_1, HP_OUT_2 CLOCK_INFO }}} Each data has 32bit. Then totally 68bytes. CLOCK_INFO includes: 00 0X YY ZZ (X: Level Controller, YY: SFC in current stream, ZZ: unknown) === Firewire Audiophile === {{{ ANA_IN_1, ANA_IN_2, DIG_IN_1, DIG_IN_2, ANA_OUT_1, ANA_OUT_2, ANA_OUT_3, ANA_OUT_4, DIG_OUT_1, DIG_OUT_2, HP_OUT_1, HP_OUT_2 AUX_OUT_1, AUX_OUT_2 CLOCK_INFO }}} Each data has 32bit. Then totally 60bytes. CLOCK_INFO includes: X0 0Y ZZ WW (X: A/B switch, Y: Level Controller, ZZ: SFC in current stream, WW: unknown) === Firewire Solo === {{{ ANA_IN_1, ANA_IN_2, DIG_IN_1, DIG_IN_2, STM_IN_1, STM_IN_2, STM_IN_3, STM_IN_4, ANA_OUT_1, ANA_OUT_2, DIG_OUT_1, DIG_OUT_2, CLOCK_INFO }}} Each data has 32bit. Then totally 52bytes. CLOCK_INFO includes: 00 00 YY ZZ (YY: SFC in current stream, ZZ: unknown) === Ozonic === {{{ ANA_IN_1, ANA_IN_2, ANA_IN_3, ANA_IN_4, STM_IN_1, STM_IN_2, STM_IN_3, STM_IN_4, ANA_OUT_1, ANA_OUT_2, ANA_OUT_3, ANA_OUT_4, }}} Each data has 32bit. Then totally 48bytes. === NRV10 === unknown but assume that {{{ ANA_IN_1, ANA_IN_2, ANA_IN_3, ANA_IN_4, ANA_IN_5, ANA_IN_6, ANA_IN_7, ANA_IN_8, ANA_IN_9, ANA_IN_10, ANA_OUT_1, ANA_OUT_2, ANA_OUT_3, ANA_OUT_4, ANA_OUT_5, ANA_OUT_6, ANA_OUT_7, ANA_OUT_8, ANA_OUT_9, ANA_OUT_10, }}} If each data has 32 bit, totally 80bytes. == Working Sample for ffado-mixer == === Firewire 1814/ProjectMix I/O === [[Image(fw1814_in.png, 20%)]] [[Image(fw1814_mix.png, 20%)]] [[Image(fw1814_aux.png, 20%)]] [[Image(fw1814_out.png, 20%)]] === Firewire 410 === [[Image(fw410_in.png, 20%)]] [[Image(fw410_mix.png, 20%)]] [[Image(fw410_aux.png, 20%)]] [[Image(fw410_out.png, 20%)]] === Firewire Audiophile === [[Image(audiophile_in.png, 20%)]] [[Image(audiophile_mix.png, 20%)]] [[Image(audiophile_aux.png, 20%)]] [[Image(audiophile_out.png, 20%)]] === Firewire Solo === [[Image(solo_in.png, 20%)]] [[Image(solo_mix.png, 20%)]] [[Image(solo_out.png, 20%)]] === Ozonic (re-work) === [[Image(ozonic_in.png, 20%)]] [[Image(ozonic_mix.png, 20%)]] [[Image(ozonic_out.png, 20%)]] == Resources == - [wiki:AvcModels] - [wiki:ObtainingAvcModel] - [wiki:AvcModels/MAudioAudiophile] - [wiki:AvcModels/MAudioFireWireSolo] - [wiki:AvcModels/MAudioNRV10] - [wiki:AvcModels/MAudioOzonic] - [wiki:AvcModels/MAudioFireWire410] - [wiki:BebobAvc] - [wiki:BebobFirmwareTool] - [wiki:projectmix]