今回は、Linuxで自作簡易プレイヤーを作成したのですが、サウンドカードの選択の仕方についてネットにあまり情報がなかったので、備忘録としてまとめてみようと思います。
実際にはQT(GUIフレームワーク)で、音楽プレイヤーを作成していたのですが、そこまで記載すると超大作となってしまうので、vlcのサウンドカード制御にしぼった形で紹介します。
動作環境
まず、家にLinuxを動かせる環境がないので、Windows上で仮想環境を入れてLinuxを動かしています。
仮想環境とは、Window上で仮想的に他のOSを動かせるようにするものです。
今回はUbuntuをインストールして使用しています。
ホスト | Windows11 |
仮想環境 | VirtualBox 6.1.32 r149290 |
Linux | Ubuntu 18.04 LTS |
VirtualBoxについて興味のある方は、無料で使用できますので、以下からダウンロードして使ってみてください。
プログラミングするための前準備
ここでは、実際にプログラミングをするための前準備について記載します。
具体的には、必要なライブラリのインストールです。
まずは、仮想環境からUbuntuを起動してください。
※仮想環境のインストールおよびUbuntuのインストールについては割愛します。
起動できたら、ターミナルを起動してください。
ターミナルの起動方法は以下です。




ターミナルが起動できたら以下の通り順に入力してください。
これは、上2段がUbuntu自体のアップデートで、2段がvlcmediaplayerおよびライブラリのインストールです。
$sudo apt-get update
$sudo apt-get upgrade
$sudo apt-get install vlc
$sudo apt-get install libvlc-dev
※$は入力不要です。
あとはC言語をビルドするために以下2つも実行してインストールしてください。
$sudo apt-get gcc $sudo apt-get make
これで準備は完了です。
※Ubuntuの環境によって、もっと必要となるものがあるかもしれませんが、ご了承ください。
プログラミング
まずはプログラム全体とMakefileをお見せします。
Makefileとは、プログラムをコンパイルするレシピみたいなものです。
今回は、vlcというライブラリだけロードしています。
※その他も色々ありますが、基本的なものしかありませんので調べてみてください。
Makefile
CC = gcc
CFLAGS = -O4 -Wall -I/usr/local/include
DEST = /usr/local/bin
LDFLAGS = -L/usr/local/lib
LIBS = -lvlc
OBJS = vlc_test.o
PROGRAM = vlc_test
all: $(PROGRAM)
$(PROGRAM): $(OBJS)
$(CC) $(OBJS) $(LDFLAGS) $(LIBS) -o $(PROGRAM)
clean:; rm -f *.o *~ $(PROGRAM)
install: $(PROGRAM)
install -s $(PROGRAM) $(DEST)
vlc_test.c
#include "stdio.h"
#include "string.h"
#include <unistd.h>
#include "vlc/vlc.h"
libvlc_audio_output_t *serch_and_getaudiocard(libvlc_instance_t *p_instance)
{
libvlc_audio_output_t * list = libvlc_audio_output_list_get ( p_instance );
if( list != NULL )
{
while(1)
{
if( list->p_next != NULL )
{/* 次デバイスがあれば */
if( strcmp(list->psz_name,"alsa") == 0)
{
break;
}
else
{
list = list->p_next;
}
}
else
{/* 終端 */
break;
}
}
}
return list;
}
int main(void)
{
const char * const vlc_args[] = {
"--verbose=2", //be much more verbose then normal for debugging purpose
};
libvlc_instance_t* instance;
libvlc_media_player_t *media_player;
libvlc_audio_output_t *audiooutput;
libvlc_media_t* media;
libvlc_audio_output_device_t *audioDevices;
/* インスタンスの生成 */
instance = libvlc_new(sizeof(vlc_args) / sizeof(vlc_args[0]), vlc_args);
audiooutput = serch_and_getaudiocard(instance);
audioDevices = libvlc_audio_output_device_list_get(instance, audiooutput->psz_name);
if( audioDevices != NULL )
{
while(1)
{
if( audioDevices->p_next != NULL )
{
if( strcmp(audioDevices->psz_description,"Intel 82801AA-ICH, Intel 82801AA-ICH Default Audio Device")==0 )
{
break;
}
else{
audioDevices = audioDevices->p_next;
}
}
else
{
break;
}
}
}
/* プレイヤーの生成 */
media = libvlc_media_new_path(instance, "/home/xxx/デスクトップ/test.mp3");
media_player = libvlc_media_player_new_from_media(media);
/* オーディオデバイスの設定 */
libvlc_audio_output_set(media_player, audiooutput->psz_name ); /* ALSAに設定 */
libvlc_audio_output_device_set(media_player,NULL, audioDevices->psz_device ); /* デバイスの設定 */
libvlc_media_player_play(media_player);
sleep(100);
}
続いてはプログラムの解説ですが、解説は次ページにて記載します。
コメント