読者です 読者をやめる 読者になる 読者になる

サクッとプログラムした気になる (4)

GUIをつけたら途端にサクッとじゃなくなりました、、、orz

機能を追加して行く予定

  • アートワークをアプリのウィンドウに表示する(べきだろ・・・)
  • 現在再生中のトラックタイトルを取得して表示する(べきだろ・・・)
  • 再生、停止、戻る、次へコントロール(別にいらないが)
  • Twitterに再生中の楽曲をポストする(最終目標)

本項の以降の文章はやったあと思い出しながら書いているので誤りを含む可能性が多々あります。

アートワークをアプリのウィンドウに表示する

処理フロー

処理の簡単な流れとしては

  1. itunesからアートワークを出力してテンポラリフォルダに置く(対応済み)
  2. テンポラリフォルダからアートワークの画像を読み込む
  3. GUIに読み込んだ画像を表示する

のが最初の流れです。追加して”次トラックに移動したら次トラックのアートワークに差し替える”とかやりたいことは色々ありますが、基本はこの流れの応用になる、はず、です。。。

デモ

ひとまず現状から書くと...もろもろバグってます。

コード

サクッとプログラムした気になる (3) - Tizen には moe ていない blogからの変更箇所はadd some function for viewing artwork on GUI · moguriso/gawa_sample@ad65a01 · GitHubの通りです。

いろいろ弄くり過ぎてシッチャカメッチャカになった感はありますが、大きな変更は下記の通りです。

  • アートワーク表示用にQGraphicsViewを追加した
  • アートワーク関連の操作をArtworkクラスにまとめた
    • ArtworkはQGraphicsViewを継承して表示部分もこれでやることにした

細かい部分まで挙げると他にもあるかも知れませんが、取り敢えずざっくりと書くとこんな感じになります。(さっくりと書くと数行ですが実際には種々の試行錯誤が含まれており云々かんぬん・・・)

アートワーク表示部分

DisplayWidgetにGraphicsViewというのがあるので、なにも考えずにそこにファイルをloadしたら表示できるのかと思ったら出来ませんでした。いろいろハマったのですが、一番大きいのは以下のエラーで

 QWidget::paintEngine: Should no longer be called  
 QPainter::begin: Paint device returned engine == 0, type: 1  

pushボタンの中でQImageをロードしてdrawImageしてたのが悪かったとのこと。
c++ - Unable to paint on Qt Widget, shows error "paintEngine: Should no longer be called" - Stack Overflow

この辺りを参考にさせていただいて諸々弄くったのが今のコードになります。。
月の杜工房 - Qt QImage画像を表示
QtでPNG画像を表示 - Narrow Escape

それとは別にハマったのが、

    Set iTunesApp = CreateObject("iTunes.Application")
    Set current = iTunesApp.CurrentTrack
    Set artworks = current.Artwork
    Set artwork = artworks.Item(1)
    format = artwork.Format

このformat、一応正しく読めているらしき情報が来る(1:jpg, 2:png, 3:bmp。3は見たことありませんが、pngは結構あります)ので

    Select Case format
        Case 1
            c_str = "jpg"
        Case 2
            c_str = "png"
        Case 3
            c_str = "bmp"
    End Select

として、出力する拡張子を変えていた所、png画像の読み込みのcaseで100%エラーが出てQImageのloadに失敗していました。なんか、改めてファイルを確認したら、pngになっている画像データの冒頭部分が

f:id:moguriso:20160615130453p:plain

JFIF:jpg画像)

ArtworkのSaveArtworkToFileの仕様(Apple公式からダウンロード出来ないので正しい仕様かどうかわからなくなってますが)は
iTunes COM Interface: IITArtwork Interface Reference
ソレによると、アートワークの画像形式は保存されているものに従う様に書かれてるので、PNGが返って来てるのにJPGになることはなさそうな気がしますが・・・。取り敢えず

	Select Case format
	Case 1
		c_str = "jpg"
	Case 2
		c_str = "jpg"
		'c_str = "png"
	Case 3
		c_str = "jpg"
		'c_str = "bmp"
	End Select

ってやったら画像が”ある”場合で読み込み失敗することはなくなりました。

アートワークが音楽データ内に存在しない場合の対応

今のままでは、そもそもアートワークが”ない”音楽データのロードで挙動不審に陥ります。なので、そもそもアートワークが無い場合には”No Image”と文字を出すように暫定修正を追加します。GraphicsViewに文字を出す部分はこちらを参考にさせて頂き

QGraphicsViewの表面にテキストを表示するサンプル · GitHub
(Atsuhiさんのgistだった)

f:id:moguriso:20160615131655p:plain:w300
お情け程度に出てますが、要改善です。

その他

割りとズブっとハマったのがVBScript側のバグで、なんかQAxScript関連でseg落ちするなと思ったら大体8割がたVBScrips側がバグってました、、、orz

TODO

  • アートワークをアプリのウィンドウに表示する
    • バグを直す ←イマココ
  • 現在再生中のトラックタイトルを取得して表示する(べきだろ・・・)
  • 再生、停止、戻る、次へコントロール(別にいらないが)
  • Twitterに再生中の楽曲をポストする(最終目標)