forked from zamaudio/snd-firewire-improve
-
Notifications
You must be signed in to change notification settings - Fork 0
Working Digidesign 003 Rack ALSA driver
jdekozak/snd-firewire-improve
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
= Developing for snd-fireworks= 2013/10/01 坂本 貴史 Takashi Sakamoto <o-takashi@sakamocchi.jp> == General == This is a device driver utilizing Advanced Linux Sound Architecture (ALSA) and Linux Firewire Subsystem (so called "juju"). This is an sound device driver for Echo Audio's firewire audio interface called as "fireworks(TM)". There is a project in user land, "FFADO". http://www.ffado.org/ My aim is migration of the similar functions which FFADO did into kernel land. I test this code with AudioFirePre8. http://echoaudio.com/products/audiofire-pre8 == Original source codes and strategy== The original source code was developed by Clemens Ladish in 2010. You can see it in alsa-kprivate.git repository. http://git.alsa-project.org/?p=alsa-kprivate.git;a=shortlog;h=refs/heads/fireworks It has some restriction below: 1.It cannot get and set device status 2.It utilizes few code in snd-firewire-lib.ko 1.For this function, snd-fireworks need to speak Device-Dependent AV/C Commands but it can't speak it. With this command, below status is changeable: - sampling rate, clock source, digital I/O mode, SPDIF format - inner I/O routing, gain, pan, solo, mute, nominal - save and load session state - download and upload DSP firmware Without this function, snd-fireworks can play and capture 44.1kHz with internal clock source In the beginning of my developing, I work for implementation of this function with ALSA's control component. With this implementation, users can change device's status with alsa-lib control/hcontrol/mixer API. 2.snd-firewire-lib.ko was developed by Clemens Ladish. Before developing it, He worked with snd-fireworks. After merging snd-firewire-lib.ko into upstream, he didn't touch snd-fireworks. Then snd-fireworks has some duplicate codes. In the middle of my developing, I work for removing duplicate codes from snd-fireworks and in the last, I commit some patches for snd-firewire.ko for lack of functions like cmp of oMPR/oPCR and receiving AMDTP, MIDI handling. == current status == 1. get/set sampling rate, clock source, digital I/O mode, digital I/O format via alsamixer 2. get physical metering and internal monitoring via procfs 3. playback and capturing PCM samples with any sampling rate 4. playback and capturing MIDI streams when PCM running Hardware information is in the end of this README. == rest of work == 0.[done]write loadable ALSA codes 1.[done]handling Echo Fireworks Commands 2.[done]implementing Basic control implementing 3.[done]PCM transmit with snd-firewire-lib.ko 4.[done]PCM receive with adding codes to snd-firewire-lib 5.[done]MIDI receive with adding codes to snd-firewire-lib 6.[done]MIDI transmit with adding codes to snd-firewire-lib 6.5.FIX FFADO issue of MIDI transmit 7.commit patches for snd-firewire-lib.ko to ALSA 7.0.search for the way to stream in BeBoB and Dice devices 7.1.look for patch reviewer 7.2.request for comment 7.3.fix inappropriate issue 7.4.commit request 8.interfaces for hardware monitoring, metering, mixer 7.0.research for what types of control the other devices such as BeBoB and Dice support 7.1.ask the better way for interface in ALSA 7.2.implement 7.3.commit request if needed 9.commit patches newly for snd-fireworks to ALSA 10.write user-land utility == easy instraction with DKMS == DKMS - Dynamic Kernel Module Support is easy for installing or updating external modules. http://linux.dell.com/dkms/ You should create new directory named "alsa-firewire-3.11" in the directory which your system DKMS setting indicate. The path is "/usr/src" in my Ubuntu rootfs. ("3.11" just means for Linux 3.11) Then follow usual DKMS steps, for example: sudo dkms add -m alsa-firewire -v 3.11 sudo dkms build -m alsa-firewire -v 3.11 sudo dkms install -m alsa-firewire -v 3.11 sudo dkms remove -m alsa-firewire -v 3.11 --all Of cource, you should install dkms package in advance. For example, in Ubuntu system: sudo apt-get install dkms = snd-fireworks.koの開発 = 2013/10/01 坂本 貴史 Takashi Sakamoto <o-takashi@sakamocchi.jp> == 概要 == このソフトウェアは、LinuxのAdvanced Linux Sound Architecture(ALSA)とFirewireサブシステ ムを利用したデバイスドライバーです。Echo社のFireworksを採用したFirewireオーディオインター フェイスのためのサウンドドライバーとなります。 この装置のユーザー空間ドライバーは存在しています。FFADOです。 http://www.ffado.org/ FFADOプロジェクトがこの装置に対して実現していることを、ALSAの諸機能を用いてカーネル空間に 持ち込むことが、この開発の目的です。 == オリジナルソースと開発方針 == オリジナルのソースは、alsa-kprivateリポジトリのfireworksブランチにあります。 このブランチは、Clemens Ladischが2010年にコミットしたものです。 http://git.alsa-project.org/?p=alsa-kprivate.git;a=shortlog;h=refs/heads/fireworks fireworksブランチのsnd-fireworksには以下の制約があります。 1.装置の挙動を変更できない 2.snd-firewire-lib.koに含まれる機能をあまり使ってない 1.fireworksを採用した装置の挙動を変えるには、Vendor DependentなAV/Cコマンドを実装する必要 があります。オリジナルのsnd-fireworksはこの機能を含んでいませんでした。この機能を使うと、 以下の変更が可能となります。 装置の標本化周波数、動作クロック源、デジタル入出力モード、S/PDIFフォーマット 装置の入出力ルーティング、ゲイン、パニング、ソロ、ミュート 装置のセッション情報の保存、復元 装置のファームウェアのダウンロード、アップロード この機能が実装されていないため、標本化周波数44100Hzでの再生・録音のみのサポートでした。 この開発の初期段階は、この機能をALSAのコントロールコンポーネントとともに実装することです。 ユーザーが、ALSAのコントロールインターフェイスを通じ、装置の挙動を変更できるようにします。 2.snd-firewire-lib.koはClemens Ladischが書いたものです。彼はまず、fireworksブランチでsnd- fireworks.koを書き上げ、その成果から、他のドライバでも再利用できるコードを集めてこのsnd-f irewire-lib.koを書きました。snd-firewire-lib.koがマージされて以降、firewireブランチは更新 されていません。そのため、snd-fireworks.koはsnd-firewire-lib.koの機能を使っていません。 Linux3.8-rc3時点で、snd-firewire-lib.koは、装置にPCMデータを送る機能しか持っていません。 MIDIや装置からデータを取得する機能を実装するため、snd-fireworks.koは、snd-firewire-lib.ko と重複するコードを含んでいました。 この開発の中期段階は、snd-firewire-lib.koとの重複コードをなくすことです。そしてsnd-firewi re-lib.koにデータ受信機能とMIDI処理を実装することが、この開発の最終段階となります。その 作業は、ALSAのメインラインにマージしてもらえるような修正パッチをコミットすることになる でしょう。 == インストール == 私が開発に用いているカーネルは、Linux3.11です。 私はAudioFire4とAudioFirePre8を使って開発をしており、それ以外のデバイスがちゃんと動くかどうかは確認し ていません。下記の「ハードウェアの基本情報」を教えていただけると助かります。 procfsが有効なカーネルでは、ハードウェアの特定の情報を出力できます。 (以下、「X」はALSAが装置に割り振ったカード番号) ハードウェアの基本情報 /proc/asound/cardX/#hardware 現在の標本化周波数とクロック源 /proc/asound/cardX/#clock 現在のハードウェアメーター(装置への入出力の大きさ) /proc/asound/cardX/#meters == いまできること == 1.PCM再生・録音 装置によりますが、標本化周波数32.0kHz〜192.0kHzでの再生が可能です。 装置によりますが、クロックソースはどれでも使えます。 装置の制約があり、チャンネル数は以下のようになります。 48.0kHz以下 アナログ入出力8chずつ、デジタル入出力8chずつ 96.0kHz以下 アナログ入出力8chずつ、デジタル入出力4chずつ 192.0kHz以下 アナログ入出力8chずつ、デジタル入出力2chずつ 2.MIDIの再生・録音 PCM再生・録音が始まっているときに可能です。 3.alsamixerやamixerを使い、装置の挙動の一部を変更可能 現在、標本化周波数、クロック源、デジタル出力モード、S/PDIFフォーマットを変更できます。 4.procfsでの装置情報の取得 ハードウェア情報、クロック情報、メーター情報を出力することができます。 == 残りの作業 == 2.ハードウェアモニター、メーター、ミキサーへのインターフェイスの実装 3.ALSAにsnd-firewire-lib.koへのパッチをコミット 4.ALSAにsnd-fireworks.koのパッチを新規にコミット 0.[done]ロード可能なALSAのコードを書く 1.[done]Echo Fireworks Commandを扱う 2.[done]基本的なコントロールの実装 3.[done]snd-firewire-libを使いPCMを送る 4.[done]snd-firewire-libにコードを追加してPCMを受信する 5.[done]snd-firewire-libにコードを追加してMIDIを受信する 6.[done]snd-firewire-libにコードを追加してMIDIを送信する 6.5.FFADOのMIDI送信バグを修正する 7.ALSAにsnd-firewire-libの修正パッチをコミットする 7.0.BeBoBとDiceがストリームする方法を調べる 7.1.パッチレビュワーを探す 7.2.Request For Commentを送る 7.3.指摘された問題を修正する 7.4.コミットリクエスト 8.ハードウェアモニタリング・メータリング・ミキサー用インターフェイスの実装 7.0.BeBoBやDiceがサポートするコントロールの種類を調べる 7.1.インターフェイスのよさそうなインターフェイスを質問する 7.2.実装 7.3.必要に応じてコミットリクエスト 9.ALSAへのsnd-fireworksのコミット 10.ユーザーランドのユーティリティを書く == DKMSを使った簡単な導入 == DKMS - Dynamic Kernel Module Supportはカーネルモジュールのインストールやアップデートを 簡単にする便利な仕組みです。 http://linux.dell.com/dkms/ 初めに、alsa-firewire-3.11というディレクトリを、システムのDKMSがデフォルトのソースディ レクトリに使うディレクトリに作成し、ソース一式を入れて下さい。Ubuntuのルートファイルシ ステムであれば、/usr/srcになります。 (3.11はただLinux 3.11を指しているだけ) 作成したら、DKMSの通常のステップを踏みます。例えば以下です。 sudo dkms add -m alsa-firewire -v 3.11 sudo dkms build -m alsa-firewire -v 3.11 sudo dkms install -m alsa-firewire -v 3.11 sudo dkms remove -m alsa-firewire -v 3.11 --all もちろん、あらかじめシステムにDKMSパッケージをインストールしておいて下さい。例えばUbuntu であれば、端末で以下を実行します。 sudo apt-get install dkms == hardware information == Note that there are several firmware versions. === Echo AudioFire2 === (thanks to Doug McLain) flags: 0xA1 guid_hi: 0x148606 guid_lo: 0x9D5BD6CA type: 0xAF2 version: 0x0 vendor_name: Echo Digital Audio model_name: AudioFire2 supported_clock: 0x9 nb_1394_playback_channels: 0x6 nb_1394_capture_channels: 0x4 nb_phys_audio_out: 0x6 nb_phys_audio_in: 0x4 nb_out_groups: 0x3 out_group[0x0]: type 0x0, count 0x2 out_group[0x1]: type 0x5, count 0x2 out_group[0x2]: type 0x1, count 0x2 out_group[0x3]: type 0x0, count 0x0 out_group[0x4]: type 0x0, count 0x0 out_group[0x5]: type 0x0, count 0x0 out_group[0x6]: type 0x0, count 0x0 out_group[0x7]: type 0x0, count 0x0 nb_in_groups: 0x2 out_group[0x0]: type 0x0, count 0x2 out_group[0x1]: type 0x5, count 0x2 out_group[0x2]: type 0x1, count 0x2 out_group[0x3]: type 0x0, count 0x0 out_group[0x4]: type 0x0, count 0x0 out_group[0x5]: type 0x0, count 0x0 out_group[0x6]: type 0x0, count 0x0 out_group[0x7]: type 0x0, count 0x0 nb_midi_out: 0x1 nb_midi_in: 0x1 max_sample_rate: 0x17700 min_sample_rate: 0x7D00 dsp_version: 0x0 arm_version: 0x4080000 mixer_playback_channels: 0x6 mixer_capture_channels: 0x4 fpga_version: 0x3000200 nb_1394_playback_channels_2x: 0x6 nb_1394_capture_channels_2x: 0x4 nb_1394_playback_channels_4x: 0x6 nb_1394_capture_channels_4x: 0x4 === Echo AudioFire12=== (thanks to Doug McLain) flags: 0x11 guid_hi: 0x14860F guid_lo: 0xC44A84A6 type: 0xAF12 version: 0x0 vendor_name: Echo Digital Audio model_name: AudioFire12 supported_clock: 0x5 nb_1394_playback_channels: 0xC nb_1394_capture_channels: 0xC nb_phys_audio_out: 0xC nb_phys_audio_in: 0xC nb_out_groups: 0x1 out_group[0x0]: type 0x0, count 0x12 out_group[0x1]: type 0x0, count 0x0 out_group[0x2]: type 0x0, count 0x0 out_group[0x3]: type 0x0, count 0x0 out_group[0x4]: type 0x0, count 0x0 out_group[0x5]: type 0x0, count 0x0 out_group[0x6]: type 0x0, count 0x0 out_group[0x7]: type 0x0, count 0x0 nb_in_groups: 0x1 out_group[0x0]: type 0x0, count 0x12 out_group[0x1]: type 0x0, count 0x0 out_group[0x2]: type 0x0, count 0x0 out_group[0x3]: type 0x0, count 0x0 out_group[0x4]: type 0x0, count 0x0 out_group[0x5]: type 0x0, count 0x0 out_group[0x6]: type 0x0, count 0x0 out_group[0x7]: type 0x0, count 0x0 nb_midi_out: 0x1 nb_midi_in: 0x1 max_sample_rate: 0x2EE00 min_sample_rate: 0x7D00 dsp_version: 0x4080000 arm_version: 0x4080000 mixer_playback_channels: 0xC mixer_capture_channels: 0xC fpga_version: 0x0 nb_1394_playback_channels_2x: 0xC nb_1394_capture_channels_2x: 0xC nb_1394_playback_channels_4x: 0xC nb_1394_capture_channels_4x: 0xC === Echo AudioFirePre8 === flags: 0x625 guid_hi: 0x14860A guid_lo: 0x5B6BDB9B type: 0xAF9 version: 0x0 vendor_name: Echo Digital Audio model_name: AudioFirePre8 supported_clock: 0x1D nb_1394_playback_channels: 0x10 nb_1394_capture_channels: 0x10 nb_phys_audio_out: 0x10 nb_phys_audio_in: 0x10 nb_out_groups: 0x2 out_group[0x0]: type 0x0, count 0x8 out_group[0x1]: type 0x3, count 0x8 out_group[0x2]: type 0x0, count 0x0 out_group[0x3]: type 0x0, count 0x0 out_group[0x4]: type 0x0, count 0x0 out_group[0x5]: type 0x0, count 0x0 out_group[0x6]: type 0x0, count 0x0 out_group[0x7]: type 0x0, count 0x0 nb_in_groups: 0x2 out_group[0x0]: type 0x0, count 0x8 out_group[0x1]: type 0x3, count 0x8 out_group[0x2]: type 0x0, count 0x0 out_group[0x3]: type 0x0, count 0x0 out_group[0x4]: type 0x0, count 0x0 out_group[0x5]: type 0x0, count 0x0 out_group[0x6]: type 0x0, count 0x0 out_group[0x7]: type 0x0, count 0x0 nb_midi_out: 0x1 nb_midi_in: 0x1 max_sample_rate: 0x17700 min_sample_rate: 0x7D00 dsp_version: 0x0 arm_version: 0x5050000 mixer_playback_channels: 0x10 mixer_capture_channels: 0x10 fpga_version: 0x4010100 nb_1394_playback_channels_2x: 0xC nb_1394_capture_channels_2x: 0xC nb_1394_playback_channels_4x: 0xA nb_1394_capture_channels_4x: 0xA == Echo AudioFire4 == guid_hi: 0x14860F guid_lo: 0x5A616E83 type: 0xAF4 version: 0x0 vendor_name: Echo Digital Audio model_name: AudioFire4 dsp_version: 0x0 arm_version: 0x5070300 fpga_version: 0x3000200 flags: 0xE1 max_sample_rate: 0x17700 min_sample_rate: 0x7D00 supported_clock: 0x9 nb_phys_audio_out: 0x6 nb_phys_audio_in: 0x6 nb_in_groups: 0x2 in_group[0x0]: type 0x0, count 0x4 in_group[0x1]: type 0x1, count 0x2 nb_out_groups: 0x2 out_group[0x0]: type 0x0, count 0x4 out_group[0x1]: type 0x1, count 0x2 nb_1394_playback_channels: 0x6 nb_1394_capture_channels: 0x6 nb_1394_playback_channels_2x: 0x6 nb_1394_capture_channels_2x: 0x6 nb_1394_playback_channels_4x: 0x6 nb_1394_capture_channels_4x: 0x6 nb_midi_out: 0x1 nb_midi_in: 0x1 mixer_playback_channels: 0x6 mixer_capture_channels: 0x6
About
Working Digidesign 003 Rack ALSA driver
Resources
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published