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 BebobAvc.

The devices belong to Group1 have its own commands. There is no public specification.

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

Firewire 410

Firewire Audiophile

Firewire Solo

Ozonic (re-work)

Resources

Attachments