Armadilloフォーラム

Armadillo-840 Qt プログラムからの音の再生手段について

yzk_armadillo-240

2014年8月29日 15時34分

橋本と申します。
初歩的な質問ですみませんが御教授ください。

Armadillo-840 を利用しています。
ATDE5 の QtCreator を利用して Qt アプリケーションを作成しております。

Qt のプログラムで「ボタンを押すと音(wav)が再生」という処理をさせたいのですが、
どのような手段がありますでしょうか?

コメント

at_yuma.arakawa

2014年9月3日 16時35分

荒川です。

ご質問内容の「ボタン」は、
・Armadillo-840上のスイッチ(物理的なボタン)
・LCD上に表示されるボタン(ソフトで実現されるボタン)
のどちらでしょうか?

いずれにしても、音(wav)の再生は以下のコードでできます。

system("aplay -D plughw:1,0 sample.wav");

参考までにソフトのボタンで実現する場合のQtのサンプルを添付します。
LCD上に表示される「Play sound」のボタン押下で
/root/sample.wavを再生するプログラムです。

添付のZIPファイルはQt Creatorのプロジェクトで、
プロジェクトファイルとソースコード以外に以下の2点を同梱しています。
・sample.wav: 再生用のサンプルWAVEファイル
・test_button: Armadillo-840向けにビルドしたバイナリ

ファイル ファイルの説明
test_button.zip

yzk_armadillo-240

2014年9月5日 13時32分

橋本です。お世話になっております。

> ・LCD上に表示されるボタン(ソフトで実現されるボタン)

説明不足ですみませんでした。
ソフトで作成し、HDMIケーブルで接続されたモニタに表示されたボタン(gif画像)になります。

> 参考までにソフトのボタンで実現する場合のQtのサンプルを添付します。

ありがとうございます。
しかし、頂いたサンプルで実機の確認をしているのですが、下記エラーが出ております。
お心あたりがあれば教えていただけますでしょうか?

----
(表示)
ボタンが表示されない。

(エラーメッセージ)
This plugin does not support setParent!
This plugin does not support propagateSizeHints()
QEGLPlatformContext::makeCurrent: eglError: 300d, this: 0x21d88
QEGLPlatformContext::makeCurrent: eglError: 300d, this: 0x21d88
QEGLPlatformContext::makeCurrent: eglError: 300d, this: 0x21d88
QOpenGLFunctions created with non-current context
QOpenGLShaderProgram::attributeLocation( vertexCoordEntry ): shader program is not linked
QOpenGLShaderProgram::attributeLocation( textureCoordEntry ): shader program is not linked

at_yuma.arakawa

2014年9月8日 19時31分

荒川です。

当方でも同じエラーメッセージを確認していますが、
LCD上に表示されております。

LCDへボタンが表示されない原因は、
表示先をLCDへ指定するための環境変数「QT_QPA_EGLFS_DISPLAY」が
設定されていないためかと思われます。

下記をお試し頂けますでしょうか。

【Armadillo上で直接実行する場合】
下記のコマンドで実行してください。

$ QT_QPA_EGLFS_DISPLAY=1 ./test_button

【Qt Creatorから実行する場合】
「Armadillo-840 製品マニュアル」「14.3.4. Hello World を Armadillo 上で実行」の
末尾にある補足のとおりに環境変数の設定を行なってください。
URL: http://manual.atmark-techno.com/armadillo-840/armadillo-840_product_man…

yzk_armadillo-240

2014年9月9日 10時27分

橋本です。お世話になっております。

> LCDへボタンが表示されない原因は、
> 表示先をLCDへ指定するための環境変数「QT_QPA_EGLFS_DISPLAY」が
> 設定されていないためかと思われます。

上記は、Armadillo-840 の 液晶モデル開発セットについている、LCDへの表示方法と
うけとっているのですがいかがでしょうか?
現在当方で利用しているのは、ベーシックモデル開発セットで、HDMIに接続された
モニタへの表示になります。

 (試しに「QT_QPA_EGLFS_DISPLAY」を入れてみましたが、エラー(Could not open egl display)
  でした。)

また前回

> (表示)
> ボタンが表示されない。

と御連絡致しましたが、モニタ画面に「Play sound」の表示はあります。しかし、
ボタンの形ではなく文字だけがあるように見えます。(もしかしたら見づらいだけかも知れません)

またその後、マウスの設定をしていなかったことに気付き、下記を参考に「変数」に
”QWS_MOUSE_PROTO”を、「値」に”tslib:/dev/input/event1”を設定しました。
http://armadillo.atmark-techno.com/howto/armadillo-440-qt-3
が、マウスカーソルの表示が出てきておりません。

以上の状態です。

yzk_armadillo-240

2014年9月9日 15時12分

橋本です。お世話になっております。

> いずれにしても、音(wav)の再生は以下のコードでできます。
> system("aplay -D plughw:1,0 sample.wav");

当方の環境では plughw を 「0,0」 にしたところ、HDMI 接続したモニタから wav ファイルの音声を
出力生することができました。
  system("aplay -D plughw:0,0 sample.wav");

ボタンの件は気になりますが・・・
御教授いただき、ありがとうございました。

at_yuma.arakawa

2014年9月12日 18時08分

荒川です。

> 上記は、Armadillo-840 の 液晶モデル開発セットについている、LCDへの表示方法と
> うけとっているのですがいかがでしょうか?
> 現在当方で利用しているのは、ベーシックモデル開発セットで、HDMIに接続された
> モニタへの表示になります。
失礼致しました。

HDMIディスプレイとマウスで、
- ボタンの形ではなく文字だけがあるように見える
- マウスカーソルが表示されない
を当方でも確認しました。
なお、マウスカーソルは、こちらの場合
「表示されるがマウスを動かしても反応しない」
という状態でした。

原因は、widget.cppの10行目の以下の記述で、

button->show();

main.cppの8行目「w.show()」でWidgetとしてshow()しているにも関わらず、
button単体でshow()を行なっていたことで誤動作が起きていました。

そのため、変更点は以下の1点のみです
- widget.cppの10行目を削除

この変更で、
ボタンの問題、マウスカーソルの問題と
先日報告して頂いた「エラーメッセージが出る」問題も
解消されることを確認しました。

また、改めてソースコードを整理し、
aplayコマンドによる音声再生の箇所を
system関数ではなく、QProcessを使用したサンプルを添付しました。

ボタン押下で音声を再生する点は同じですが、
再生中に再度押下すると始めから再度再生するものとなっています。
ご参考までに、お使いください。
(音声出力先もplughw:0,0へ変更済みです。)

ファイル ファイルの説明
test_button_2.zip

yzk_armadillo-240

2014年9月16日 11時20分

荒川様

お世話になっております。橋本です。

いただいた system関数、及び QProcess を利用したサンプルで、音の再生を確認することができました。
参考にさせていただきます。

いろいろ御教授、ご尽力いただき、ありがとうございました。