Androidオーディオtinyalsa(tinymix / tinycap / tinyplay / tinypcminfo)--------マークの詳細



Android Audio Tinyalsa Mark Detailed



2017年5月29日10:02:03 songze_lee 閲覧番号:10224以上

個人分類: Androidシステム



転載:http://blog.csdn.net/radianceblau/article/details/64125411

オーディオコードはもっと複雑です。オーディオパラメータに加えて、私たちが通常カスタマイズする場所は多くありません。したがって、深い理解はありません。

時間をかけて次のコードを確認することをお勧めします。

カーネル、 Linux それを取る 建築
カーネル-3.10 / sound / soc / mediatek /
kernel-3.10 / Documentation / sound / alsa / soc /

アンドロイド アッパーアルサインターフェース
外部/ tinyalsa /

事:
ベンダー/ mediatek /プロプライエタリ/プラットフォーム/共通/ハードウェア/オーディオ/
ベンダー/ mediatek /プロプライエタリ/プラットフォーム/ mt6735 /ハードウェア/オーディオ/

andoridオーディオフリンガー:
フレームワーク/ av /サービス/ audioflinger /



Tinyalsaは、Androidソースコードのexternal / tinyalsaの場所にあります。

tinyalsaについて、tinyalsaは、GoogleがAndroid4.0の後にプッシュしたalsaカーネルに基づくユーザーレイヤーオーディオインターフェイスです。このalsa-libインターフェースは、Android4.0まで使用されてきました。 Googleによるtinyalsaのリリースは、alsaがGPLライセンスを使用しているためか、alsa-libライブラリが複雑すぎて煩雑であるためだと思います。ほとんどの機能はAndroidプラットフォームでは実用的な意味を持ちませんが、それでも少数のメモリスペースを占有します。

Androidのalsaについて、Android 4.0以降では、カーネルでalsaドライバーを使用する意思がある限り、元のalsaを引き続き使用できます。 alsaユーザー層インターフェースalsa-libをソースコードに移植するだけで済みます。



tinyalsaの主なヘッダーファイルとデータ構造は次のとおりで、ioctrlを介してカーネルのalsaドライバーと対話します。

Pcmデバイス、tinyalsaのコードを読み取り、Androidでオーディオデバイスノードを表示すると、Androidのpcmデバイスは最大で1つのミキサーデバイス '/ dev / snd / controlC%u'(通常はcontrolC0)と32を持つことができます。 / dev / snd / pcmC%uD%uc(通常はpcmC0D0c)、/ dev / snd / pcmC%uD%u%p(通常はpcmC0D0p)、pcmデバイスのCはカードを表し、Dはデバイスを表し、cはキャプチャを表します、およびpは再生を表します。 pcmサウンドカードを追加すると、C値は+1になり、Dは0から始まり、c(マイクなどのpcmC1D0c)のみ、p(サウンドなどのpcmC1D0p)のみ、cとの両方が存在する可能性があります。 p(pcmC1D0c pcmC1D0p)。

tinyalsaが提供する外部ヘッダーファイルは、上の図で説明した「asoundlib.h」の最も基本的なpcmおよびミキサー操作を提供します。実装ファイルは、pcm.c(pcm apiを実装)とmixer.c(ミキサーapiを実装)です。 asoundlib.hによると、4つの小さなツールtinypcminfo tinyplay tinycaptinymixが作成されています。これらの4つのガジェットは、簡単に使用できるシステムコマンドとしてシステムに保存されます。 alsa-libのライトバージョンとしてのTinyaslaは、Linuxに移植する人かもしれません。 Tinyaslaはlibcutils && libutilsに依存しています。 Linuxインターフェースに依存する2つのライブラリーのメソッドのいくつかを使用できる場合、残りの問題はそれほど大きくないはずです。これは私の推測です。

Tinypcminfo実装ファイルtinypcminfo.c(pcmデバイスの機能を表示)

Tinyplay実装ファイルtinyplay.c(pcmデバイスを使用してwav形式のオーディオファイルを再生)

Tinycap実装ファイルtinycap.c(pcmデバイスを使用してコードストリームをpcm形式で収集し、wav形式のファイルとして保存します)

Tinymix実装ファイルtinymix.c(ボリューム調整、デバイス切り替えを含むpcmデバイスの制御)

これらのコマンドは、tinypcminfoを使用して、最初にpcmデバイスの機能を確認できます。他の3つのコマンドを使用する場合、不合理な構成を使用すると、パラメーター無効エラーが使用されます。

PCM API

/* Operation on the pcm device node */

struct pcm *pcm_open(unsigned int card, unsigned int device, unsigned int flags, struct pcm_config *config)

int pcm_close(struct pcm *pcm)

int pcm_is_ready(struct pcm *pcm)

/* Ability to get pcm devices */

struct pcm_params *pcm_params_get(unsigned int card, unsigned int device, unsigned int flags)

void pcm_params_free(struct pcm_params *pcm_params)

unsigned int pcm_params_get_min(struct pcm_params *pcm_params, enum pcm_param param)

unsigned int pcm_params_get_max(struct pcm_params *pcm_params, enum pcm_param param)

/* Configure the specifications of the pcm device capture and playback */

int pcm_get_config(struct pcm *pcm, struct pcm_config *config)

int pcm_set_config(struct pcm *pcm, struct pcm_config *config)

/* Returns the last error message for calling tinyalsa */

const char *pcm_get_error(struct pcm *pcm)

/* Set the number of digits that the pcm device collects and plays. The higher the number of digits, the closer the real sound is to */

unsigned int pcm_format_to_bits(enum pcm_format format)

/* Conversion of size, frame number, and time between built-in buffers of pcm devices */

unsigned int pcm_get_buffer_size(struct pcm *pcm)

unsigned int pcm_frames_to_bytes(struct pcm *pcm, unsigned int frames)

unsigned int pcm_bytes_to_frames(struct pcm *pcm, unsigned int bytes)

unsigned int pcm_get_latency(struct pcm *pcm) // in ms

/* Returns the valid frame pointer of the next frame and the frame timestamp. The timestamps are CLOCK_MONOTONIC and CLOCK_REALTIME optional, which uses CLOCK_REALTIME */

/* I think that two timestamps should be needed, one timestamp for playback (CLOCK_MONOTONIC) is not affected by system time, one is used to record the timestamp of the current audio capture (CLOCK_REALTIME) */

int pcm_get_htimestamp(struct pcm *pcm, unsigned int *avail, struct timespec *tstamp)

/* Write data to the hardware for playback or read capture data from hardware via FIFO */

int pcm_write(struct pcm *pcm, const void *data, unsigned int count)

int pcm_read(struct pcm *pcm, void *data, unsigned int count)

/* This is an optional way to communicate with hardware. */

int pcm_mmap_write(struct pcm *pcm, const void *data, unsigned int count)

int pcm_mmap_read(struct pcm *pcm, void *data, unsigned int count)

int pcm_mmap_begin(struct pcm *pcm, void **areas, unsigned int *offset, unsigned int *frames)

int pcm_mmap_commit(struct pcm *pcm, unsigned int offset, unsigned int frames)

int pcm_start(struct pcm *pcm)

int pcm_stop(struct pcm *pcm)

int pcm_wait(struct pcm *pcm, int timeout)

int pcm_set_avail_min(struct pcm *pcm, int avail_min)

/* Operation on the mixer device */

pcmデバイスの操作では、操作するデバイスの存在とデバイスの機能に注意するだけで済みます。正しく動作するようにデバイスの機能を設定しないでください。実際、チャネル、レート、フォーマット、period_size、period_countに注意を払う必要があります。

MIXER API

struct mixer *mixer_open(unsigned int card)

void mixer_close(struct mixer *mixer)

/* Get the mixer device information name */

const char *mixer_get_name(struct mixer *mixer)

/* Get the handle of the mixer device struct mixer_ctl */

unsigned int mixer_get_num_ctls(struct mixer *mixer)

struct mixer_ctl *mixer_get_ctl(struct mixer *mixer, unsigned int id)

struct mixer_ctl *mixer_get_ctl_by_name(struct mixer *mixer, const char *name)

/* Take the control information of the mixer device */

const char *mixer_ctl_get_name(struct mixer_ctl *ctl)

enum mixer_ctl_type mixer_ctl_get_type(struct mixer_ctl *ctl)

const char *mixer_ctl_get_type_string(struct mixer_ctl *ctl)

unsigned int mixer_ctl_get_num_values(struct mixer_ctl *ctl)

unsigned int mixer_ctl_get_num_enums(struct mixer_ctl *ctl)

const char *mixer_ctl_get_enum_string(struct mixer_ctl *ctl, unsigned int enum_id)

/* Some sound cards update their controls due to external events,

* such as HDMI EDID byte data changing when an HDMI cable is

* connected. This API allows the count of elements to be updated.

*/

void mixer_ctl_update(struct mixer_ctl *ctl)

/* Set and get controllable information in the form of scale, array, range, fixed value */

/* id is obtained by mixer_get_num_ctls */

int mixer_ctl_get_percent(struct mixer_ctl *ctl, unsigned int id)

int mixer_ctl_set_percent(struct mixer_ctl *ctl, unsigned int id, int percent)

int mixer_ctl_get_value(struct mixer_ctl *ctl, unsigned int id)

int mixer_ctl_get_array(struct mixer_ctl *ctl, void *array, size_t count)

int mixer_ctl_set_value(struct mixer_ctl *ctl, unsigned int id, int value)

int mixer_ctl_set_array(struct mixer_ctl *ctl, const void *array, size_t count)

int mixer_ctl_set_enum_by_string(struct mixer_ctl *ctl, const char *string)

int mixer_ctl_get_range_min(struct mixer_ctl *ctl)

int mixer_ctl_get_range_max(struct mixer_ctl *ctl)

// Original state

root@xxxxx:/data/local/tmp # tinymix -D 1

MIXERの使用、属性、実行方法、名前の確認はすでに非常に明確です。

Mixer name: 'mixer_name_xx'

Number of controls: 2

ctl type num name value

0 BOOL 1 Mic Capture Switch Off

1 INT 1 Mic Capture Volume 256

// details

root@xxxxx:/data/local/tmp # tinymix -D 1 0

Mic Capture Switch: Off

root@xxxxx:/data/local/tmp # tinymix -D 1 1

Mic Capture Volume: 256 (range 0->256)

// set

root@xxxxx:/data/local/tmp # tinymix -D 1 0 1

root@xxxxx:/data/local/tmp # tinymix -D 1 1 250

// modified state

root@xxxxx:/data/local/tmp # tinymix -D 1

Mixer name: 'mixer_name_xx'

Number of controls: 2

ctl type num name value

0 BOOL 1 Mic Capture Switch On

1 INT 1 Mic Capture Volume 250

 

 

 

拡張:

1. pcmとは何ですか?

http://en.wikipedia.org/wiki/Pulse-code_modulation

2.オーディオサンプリング

http://baike.baidu.com/link?url=b9CLvaPgU4A0e0X3y5cLU4ADOI0eBuUeCys05m5unE7G-0eR2sQMBVhNxkCEvOf-Ot2CLAw2wWX5ZLhqi3D2t_#1

現在 Linux 主流のオーディオアーキテクチャはALSA(Advanced Linux Sound Architecture)です。 ALSAは、カーネルドライバー層にalsa-driverを提供し、アプリケーション層にalsa-libを提供します。アプリケーションは、alsa-libによって提供されるAPIを呼び出すだけで、ペアを完成させることができます。基盤となるハードウェアの操作。とてもよく言ったが アンドロイド 標準のALSAを使用する代わりに、ALSAの簡略版はtinyalsaと呼ばれます。 Androidは、tinyalsaを使用してすべてのモードのオーディオパスを制御します。 tinyalsaが提供するツールを使用して表示およびデバッグすることもできます。

tinyalsaをコンパイルした後、4つのガジェットを生成します。

[objc] プレーンビュー コピー

  1. tinymix
  2. tinyplay
  3. tinycap
  4. tinypcminfo

コンパイルコマンド:

[objc] プレーンビュー コピー

  1. mmm外部/ tinyalsa /

以下は、4つの小さなツールの使用のデモンストレーションです。(以下は、LC1160電源+オーディオチップを備えたLianxin TechnologyのLC1860プラットフォームの使用、スクリーンショット、およびデモンストレーション効果はM7301P5のものです。 テスト 機械)

1、tinypcminfo

Tinypcminfoは、pcmチャネルに関する情報を表示するために使用されます

入る:

[objc] プレーンビュー コピー

  1. tinypcminfo -D / proc / asound / cards

結果は次のとおりです。

上記で得られた情報から、PCMのサンプリングレート、チャネル数、サンプリングポイント数などの情報を知ることができる。

–Dが後に続くパラメーターはサウンドカードファイルであり、通常は/ proc / asound / cardsにあります。使える

[objc] プレーンビュー コピー

  1. cat / proc / asound / cards

現在のサウンドカードを表示

2、tinymix

次の図に示すように、tinymixを直接入力して、オーディオチャネルに関連する構成パラメーターを取得します。パラメータを追加して構成を変更することもできます。 ADC1ゲイン値を110に増やす場合は、tinymix 12110と入力します。

上記の情報を個別に表示することはより困難であり、オーディオパスマップはより明確になります。

上の図の赤いフォントは、LC1160とマイクやヘッドホンなどのハードウェアデバイスとの接続関係を示しています。 (注:内部ClassDが要件を満たしていないため、M73xxプロジェクトはAUXパスに接続されています)

各パスのゲイン調整セクションでは、緑色のフォントを使用して、tinymixのオプションへの対応を示しています。

図のプラス記号とマルチプレクサは、さまざまなモードでオーディオチャネルを切り替えるための、tinymixの他のオプションに対応するパス選択スイッチです。この部分は、図では1つずつマークされていませんが、既知のパス名に従って対応する方が簡単です。

図の黄色の矢印は、PCMインターフェイスからLC1160への通話中のダウンストリームオーディオデータストリームと、MonoDACを介したハンドセットへのデジタルからアナログへの変換を示しています。

図の紫色の矢印は、通話中のアップストリームオーディオデータストリームを示しています。サウンドはメインMICから収集された後、ADC1によるアナログ-デジタル変換後にPMCのDOラインに送信されます。

3、tinyplay

Tinyplayは、一般的に再生に使用されるシンプルな音楽プレーヤーです。 テスト 。 Tinyplayは、wavオリジナル形式の音楽のみを再生でき、Mp3形式でデコードすることはできず、44.1kHzおよび48kHzのサンプリングレートのwav音楽をサポートします。

tinyplayを呼び出して音楽を再生する前に、tinymixを使用してオーディオチャネルを切り替える必要があります。

[objc] プレーンビュー コピー

  1. Tinymix 0 I2SR //ステレオDACRのソースをi2sとして選択します
  2. Tinymix 1 I2SL //ステレオDACLのソースをi2sとして選択します
  3. Tinymix 2 0 0 //ステレオDACの左右のチャンネルのミュートを閉じます
  4. Tinymix 24 1 //スピーカーの外部PAチップを開く
  5. Tinymix 40 1 //ステレオDACRのサウンドをAUXポート出力にルーティングします(実験用マシンのスピーカーがAUXインターフェイスに取り付けられているため)
  6. Tinymix 41 1 //ステレオDACRのサウンドをAUXポート出力にルーティングします(実験用マシンのスピーカーがAUXインターフェイスに取り付けられているため)
  7. tinyplay z.wav

4、tinycap

Tinycapは、テストの記録に一般的に使用される単純な記録ソフトウェアです。

tinycap録音を呼び出す前に、オーディオパスを調整する必要があります。

[objc] プレーンビュー コピー

  1. tinymix 14 30 // mic1ボリューム
  2. tinymix 19 1 // mic1ブーストオン
  3. tinymix 26 1 // adc1-> mic1
  4. tinymix 50 ADC1 // i2sR out-> adc1
  5. tinymix 51 ADC1 // i2sL out-> adc2
  6. echo '0xfb 0x01'> / sys / devices / platform / comip_codec / lc1160_reg //バイアスパワーオン
  7. echo '0xad 0x08'> / sys / devices / platform / comip_codec / lc1160_reg // adc1 enable
  8. echo '0xac 0x01'> / sys / devices / platform / comip_codec / lc1160_reg // mic1 pga enable
  9. echo '0x3b 0xcc'> / sys / devices / platform / comip_codec / lc1160_reg // ldo
  10. エコー2> / sys / bus / i2c / drivers / fm2018 / 0-0060 / mode //外部エコーキャンセレーションオーディオチップをバイパス(M730xプロジェクトに固有)
  11. tinycap /sdcard/Music/l.wav

ctrl + Cを強制的に終了して録音を終了すると、l.wavオーディオファイルが/ sdcard / Music /パスに表示されます。

adbを使用してローカルコンピューターにプルし、goldwaveを使用して再生および表示します。

[objc] プレーンビュー コピー

  1. adb pull /sdcard/Music/l.wav d:


加えて:

LC1160のレジスタはページングされます。つまり、同じアドレスに意味の異なる2つのレジスタがあり、2番目の機能ページは0xFCレジスタの値を制御することによって切り替えられます。

[objc] プレーンビュー コピー

  1. エコー '0xfc 0x01'> / sys / devices / platform / comip_codec / lc1160_reg
  2. cat / sys / devices / platform / comip_codec / lc1160_reg
  3. エコー '0xfc 0x00'> / sys / devices / platform / comip_codec / lc1160_reg