コグノスケ


link 未来から過去へ表示(*)  link 過去から未来へ表示

link もっと前
2014年2月12日 >>> 2014年1月30日
link もっと後

2014年2月12日

ALSAその5 - ALSA APIを使ったプログラムの書き方

目次: ALSA

ALSAで音が鳴ることはわかりました。でもそれだけではつまらないですね。

次はどうすれば音を鳴らすプログラムを書けるのか?を見てみます。今回は、下記ALSAのモジュール図でいう「アプリケーション」側から見てみます。


図1: ALSAモジュール図

ALSAとアプリケーションとのインタフェースをALSA APIと呼ぶことにします。ALSA APIの仕様は公式のドキュメントに詳しく書かれています(※)。

(※)今回はLPCMを扱いますのでALSA APIのなかでも PCMモジュールの仕様が参考になります。

ALSA APIを使おう

LPCMを鳴らすために最低限必要なAPI呼び出しは下記の5つです。

snd_pcm_open
サウンドカードを開く。
snd_pcm_set_params
どのような音を鳴らすか決める。
snd_pcm_writei
音のデータをサウンドカードに書き込む。
snd_pcm_recover
サウンドカードに書き込む際に、何かエラーが起きたら復帰させる。
snd_pcm_close
再生が終わったらサウンドカードを閉じる。

もう少しコードっぽく書くと下記のようになります。

LPCMの再生、中心部分

//Format: 48[kHz], Signed 16[bit], Stereo
int rate = 48000;
snd_pcm_format_t format = SND_PCM_FORMAT_S16_LE;
int channels = 2;
//To use snd_pcm_writei() instead of snd_pcm_writen()
snd_pcm_access_t access = SND_PCM_ACCESS_RW_INTERLEAVED;
//Allow to select the 'plughw' for using sampling rate converter.
int resample = 1;
//Buffer size is 50[ms]
int latency = 50000;

snd_pcm_t *pcm = NULL;

snd_pcm_open(&pcm, "hw:0", SND_PCM_STREAM_PLAYBACK, 0);

snd_pcm_set_params(pcm, format, access, channels, rate, resample, latency);

while (1フレームでも残っていれば) {
    writen = snd_pcm_writei(pcm, buf, frames);
    if (writen < 0) {
        snd_pcm_recover(pcm, writen, 0);
    }
}

snd_pcm_close(pcm);

もし48kHz, Signed 16bits, Stereo以外のLPCMデータを再生する場合は、rate, format, channelsの部分をデータに合わせて変更します。

もしハードウェア側が48kHz, Signed 16bits, StereoのLPCM再生をサポートしていない場合は、下記のようなエラーメッセージが出ます。

HWが指定されたフォーマットをサポートしていない場合
ALSA lib pcm.c:7431:(snd_pcm_set_params) Rate doesn't match (requested 48000Hz, get 0Hz)

このメッセージが出ていたら、デバイス名を "hw:0" → "plughw:0" としてください。これによりサンプリングレートコンバータ(SRC)が働き、ハードウェアが受け付けられるフォーマットに自動的に変換されます。

例えば44.1kHzしか対応していないサウンドカードで24kHz, Signed 8bits, Monoの音源を鳴らしたときは、下記のような動作イメージになります。

SRCの動作イメージ

rate = 24000;
format = SND_PCM_FORMAT_U8;
channels = 1;
(デバイス名) = "plughw:0"

24kHz, 8bits, Mono --(plug)--> 44.1kHz, 16bits, Stereo --> hw:0

先ほどの中心部分に、ファイルからのLPCMデータの読み込み部分、エラー処理などを付け加えて、簡易的なプレーヤにしました。
link ソースコードはこちらから(※)どうぞ。

ライセンスは、修正BSDライセンスです。

(※)コンパイルの際は -lasoundを付けてください。もしalsa/asoundlib.hが無い場合は、ALSAの開発用パッケージ(Debian Wheezyならlibasound2-dev)をインストールしてください。

注意事項など

注意: 再生できるデータはLPCMデータのみです。WAVファイル(*.wav)もLPCMデータを含むため再生可能ですが、コンテナのヘッダもLPCMデータだと思って再生してしまい、最初にビッ!ビッ!というノイズが鳴ります。WAVファイル再生の際は音量にご注意ください。

警告: 入力されたデータのフォーマットチェックは行っておりません。LPCMデータではないファイルを再生させると、非常に大きい音や、ノイズが鳴り、スピーカーなどを破損する可能性があります。

編集者:すずき(2022/05/22 15:12)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2014年2月10日

ガラパゴス

サービスベンダーや端末メーカーは、自社サービスや製品をユーザに末永く使って(=お金を末永く払って)もらいたいので「自社サービス、製品にユーザを閉じ込める」方向に行きたがります。

本来、ユーザの利便性を考えれば、いつでも他社サービスに移れるようにした方が便利でしょう。標準規格があるならそれに従う、既に普及しているサービスと互換の形式を使う、など。

でも、世界と同じ土俵で自社サービス、製品のオリジナリティを打ち出せます?自信を持ってYesと言うのは難しいですよね。オリジナリティを打ち出せなければ値段勝負、価格破壊、死の行軍が待っています。

一方で、ユーザを閉じ込め、自社サービス、製品の箱庭を作ってしまえば敵は過去の自分だけです。去年より良くしました、と言って作り続ければ、絶対に負けません。楽に勝ち続けられる居心地の良い場所です。

しかし閉鎖的な市場に気づいた海外勢が殴り込みをかけたとき、ユーザは今まで猛烈な不便を強いられていたことに気づきます。

ここで海外勢に勝てるなら、「世界唯一」の「素晴らしい」サービスだった、と言えるのですが、携帯、SNS、テレビ…、いずれも従来サービス、製品は不便だ、使いづらいと誹りを受け、一気にユーザが離れました。

まさに「世界唯一」だけど「外来種が来たら駆逐」されてしまう、ガラパゴス島の固有種とそっくりです。

ガラパゴスとは、うまいこと言ったもんですよね、ほんと。

ガラパゴスは悪くない

ユーザの閉じ込めを狙ってやっていない限り「○○」というサービスや製品が、

  • 世界一だったのか?
  • ガラパゴスだったのか?

は市場で「勝った」か?「負けた」か?と聞いているのとほぼ同じです。

ガラパゴスなサービス、製品をたくさん作っているor作っていたからと言って、決していくじなしの会社ってわけじゃないんです。

当事者も悪くない

しかもユーザの閉じ込めを狙ってやっています、なんて誰も言いません。隠しているのではなくて、当事者は意識すらしていないはず。

「より良いものを、と頑張っていただけなのに、どうしてこうなった?」って。

…なんだ「ガラパゴス」は結果論か?と言われれば否定はできませんが、せめて、その道に進みかけた時にこれはヤバいと気づくとか、そうならないように心掛けることはできるんじゃないでしょうか。

メモ: 技術系?の話はFacebookから転記しておくことにした。

編集者:すずき(2014/03/17 00:49)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2014年2月5日

故意にリークしてるよね

パナソニックの半導体事業改革が完了 - EE Times Japanを読んで。

いつもは「絶対、事前にリークしてるでしょ」と思うくらい、ニュースが正確で早い(社内通達よりも)のですが、今回はニュースと社内通達が同時でした。珍しい〜。

推測するに、

  • 改革は既定路線で、世の中が何と言おうと止める気はないのでリークは不要だった
  • 赤字4兄弟(テレビ、半導体、光デバイス、回路基板)への改革なので、リークして様子を見るまでもなく株価上昇は明らか
  • 興味を持つ人が減ったので、リークしても記事にされなかった
  • 今までは情報統制がザルで漏れまくっていたので、正常な状態に戻した

辺りですかね。当たっても別に嬉しくないけど。

メモ: 技術系の話はFacebookから転記しておくことにした。

編集者:すずき(2015/11/29 20:42)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2014年2月4日

節分といえば落花生

節分から1日ずれちゃいましたが、節分の話でも。

北海道では節分に殻つきの落花生を撒きます。「鬼は外ー」は「雪(※)に向かって落花生を投げる」という意味でした。

もちろん店には大豆も(食べる用なのか?)売っていますが、撒くのは必ず落花生です。

しかし、関東、関西でその話をすると、大抵の人に「なんで落花生?大豆じゃないの?」と驚かれます。「うちもそうだよ」って言われたことはない…はず…たぶん。

そういや、なんで大豆or落花生なのだろう。小豆じゃダメなのかねえ??

(※)この時期の北海道はほぼ確実に雪が積もっているから、地面ではなく雪に向かって投げることになります。

編集者:すずき(2014/02/05 02:21)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
2014年2月12日 >>> 2014年1月30日
link もっと後

管理用メニュー

link 記事を新規作成

<2014>
<<<02>>>
------1
2345678
9101112131415
16171819202122
232425262728-

最近のコメント5件

  • link 20年8月16日
    すずきさん (07/01 01:11)
    「そうですね。残念ながら私には向いてなかっ...」
  • link 20年8月16日
    ざんねんさん (06/29 17:12)
    「ゲーム内容を理解していない人の残念な雑記」
  • link 24年6月17日
    すずきさん (06/05 23:32)
    「Thnaks for your info...」
  • link 24年6月17日
    Bobさん (06/04 09:25)
    「BindIPv6Only=no does...」
  • link 18年8月12日
    すずきさん (05/29 16:57)
    「コメントありがとうございます。\n\nこ...」

最近の記事20件

  • link 23年5月15日
    すずき (07/01 02:15)
    「[車 - まとめリンク] 目次: 車三菱FTOの話。群馬県へのドライブ1群馬県へのドライブ2将来車を買い替えるとしたら?FTO...」
  • link 13年3月25日
    すずき (07/01 02:15)
    「[免許の更新と車のレッカー] 目次: 車前回の免許更新は免許センターまで行ったのですが、遠いわ、混んでいるわ、で辟易したので、...」
  • link 13年3月27日
    すずき (07/01 02:14)
    「[車の修理が終わった] 目次: 車先日レガシィを運び込んだ(2013年3月25日の日記参照)ディーラーから電話があり「バッテリ...」
  • link 22年7月18日
    すずき (07/01 02:03)
    「[GNU tarのアーカイブ圧縮方式の判定] 目次: LinuxGNU tarのxオプションは圧縮されたtarでも正しく展開し...」
  • link 23年4月10日
    すずき (07/01 02:03)
    「[Linux - まとめリンク] 目次: Linux関係の深いまとめリンク。目次: RISC-V目次: ROCK64/ROCK...」
  • link 21年12月28日
    すずき (07/01 02:01)
    「[ゲーム - まとめリンク] 目次: ゲーム一覧が欲しくなったので作りました。PlayStation Vitaのアプリ達が寿命...」
  • link 22年8月6日
    すずき (07/01 02:00)
    「[ゲーム用PCを作ろう] 目次: ゲームずっとグラフィック性能のしょぼいノートPCでゲームをしていましたが、描画が遅すぎて「コ...」
  • link 15年9月20日
    すずき (07/01 01:53)
    「[PlayStation Vitaのアプリ達が寿命を迎えている] 目次: ゲームPS Vitaのfacebookアプリのサポー...」
  • link 21年1月30日
    すずき (07/01 01:48)
    「[PlayStation Vitaのアプリがめちゃ減っている] 目次: ゲーム久しぶりにPlayStation Vitaを起動...」
  • link 13年3月13日
    すずき (07/01 01:33)
    「[ffmpegビルドふたたび] 目次: Linux以前(2009年5月22日の日記参照)ビルドしたffmpegがいい加減古くな...」
  • link 10年9月5日
    すずき (07/01 01:24)
    「[レガシィ納車と大阪府内ドライブ] 目次: 車車(スバル レガシィB4 2.0 GT、AT車)も納車されたことだし、下道(R1...」
  • link 24年8月25日
    すずき (06/26 09:01)
    「[レガシィの7回目の車検完了&タイヤ交換(FALKEN AZENIS)] 目次: 車ディーラーまで車検の車を取りに行きました。...」
  • link 11年5月1日
    すずき (06/26 08:58)
    「[パンクしたのでタイヤ交換(DNA ECOS)] 目次: 車奥さん、友人とともに、ジャパン牧野店へ飲み物の買い出しに行きました...」
  • link 17年6月4日
    すずき (06/26 08:57)
    「[レガシィのタイヤ交換(DNA ECOS)] 目次: 車気づけば6年(2011年5月1日の日記参照)経過しており、ヒビ割れてい...」
  • link 17年6月7日
    すずき (06/26 08:53)
    「[USB 3.0を使うとワイヤレスキーボードの動作不良? - USB 3.0をざっくり調べる] 目次: PC先日(2017年6...」
  • link 17年6月5日
    すずき (06/26 08:50)
    「[USB 3.0を使うとワイヤレスキーボードの動作不良? - USB 3.0と2.5GHzの関係] 目次: PC以前(2017...」
  • link 24年7月7日
    すずき (06/26 08:50)
    「[PC - まとめリンク] 目次: PC一覧が欲しくなったので作りました。 スピーカーGX-D90故障ノートPCの内蔵サウンド...」
  • link 17年6月2日
    すずき (06/26 08:48)
    「[USB 3.0を使うとワイヤレスキーボードの動作不良?] 目次: PCサーバのワイヤレスキーボードが妙に調子悪くて不思議だっ...」
  • link 25年6月19日
    すずき (06/25 21:50)
    「[歴代据え置きハードのCPUとGPU] 目次: ゲーム最近、据え置きハードのCPUとGPUがNVIDIAとAMDに収束していま...」
  • link 25年6月18日
    すずき (06/22 23:33)
    「[Nintendo Switch 2当選] 目次: ゲームSwitch 2の抽選4回目で当選してました。わーい。今回も落選だっ...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 2025年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDFファイル RSS 1.0

最終更新: 07/01 02:15