Libcanberra
ナビゲーションに移動
検索に移動
Libcanberra はイベントサウンドを再生するためのシンプルな抽象インターフェイスです。GNOME などのフリーなデスクトップでイベントサウンドを流すための XDG Sound Theme and Naming Specifications を実装しています。
目次
インストール
Libcanberra は公式リポジトリの libcanberra パッケージでインストールできます。libcanberra では、ALSA, pulseaudio, または gstreamer のバックエンドは必要なくなりました。これらは {Pkg|libcanberra}} パッケージに組み込まれているためです。
イベントサウンドを聞くためにはサウンドテーマをインストールする必要があります:
- デフォルトのサウンドテーマは 'freedesktop' で、公式リポジトリの sound-theme-freedesktop パッケージでインストールできます。
- もしくは、公式リポジトリや Arch User Repository で "sound-theme" を検索してください。
設定
デフォルトでは、GTK+ アプリケーションが起動した時に GTK+ モジュールが自動的にロードされます。ユーザーの Gtk 設定ファイルでデフォルトの設定を上書きすることができます:
$HOME/.gtkrc-2.0 and $XDG_CONFIG_HOME/gtk-3.0/settings.ini
gtk-enable-event-sounds=true gtk-enable-input-feedback-sounds=true gtk-sound-theme-name=freedesktop
GNOME では、以上の設定は gnome-settings-daemon によって管理されており、GSettings の org.gnome.desktop.sound
スキーマで設定を変更できます。
Systemd
canberra を使って起動・シャットダウン・再起動サウンドを有効にするには、canberra-system-bootup.service
を有効化します。
canberra アプリの書き方
libcanberra のサウンドイベントは、GObject-Introspection を介して GSound を使い様々なプログラミング言語で簡単に書くことができます。また、bash からも簡単に呼び出せます。
Bash
- 依存パッケージ: libcanberra
hello_world.sh
#!/bin/bash canberra-gtk-play -i phone-incoming-call -d "hello world"
C
- 依存パッケージ: libcanberra
- ビルド:
gcc hello_world.c -o hello_world `pkg-config --cflags --libs glib-2.0 libcanberra`
hello_world.c
#include <glib.h> #include <canberra.h> void main () { ca_context * hello; ca_context_create (&hello); ca_context_play (hello, 0, CA_PROP_EVENT_ID, "phone-incoming-call", CA_PROP_EVENT_DESCRIPTION, "hello world", NULL); g_usleep (2000000); return 0; }
- 依存パッケージ: gsound
- ビルド:
gcc -o hello_world `pkg-config --cflags --libs glib-2.0 gsound` hello_world.c
hello_world.c
#include <glib.h> #include <gsound.h> int main () { GSoundContext *hello = gsound_context_new(NULL, NULL); gsound_context_play_simple(hello, NULL, NULL, GSOUND_ATTR_EVENT_ID, "phone-incoming-call", GSOUND_ATTR_EVENT_DESCRIPTION, "hello world", NULL); g_usleep (2000000); return 0; }
Genie
- 依存パッケージ: libcanberra
- ビルド依存パッケージ: vala
- ビルド:
valac --pkg libcanberra hello_world.gs
hello_world.gs
uses Canberra init hello: Context Context.create(out hello) hello.play (0, PROP_EVENT_ID, "phone-incoming-call", PROP_EVENT_DESCRIPTION, "hello world") Thread.usleep (2000000)
hello_world.gs
uses GSound init var hello = new GSound.Context hello.init() hello.play_simple(null, GSound.Attribute.EVENT_ID, "phone-incoming-call", GSound.Attribute.EVENT_DESCRIPTION, "hello world") Thread.usleep (2000000)
JavaScript
hello_world.js
#!/usr/bin/gjs const GLib = imports.gi.GLib; const GSound = imports.gi.GSound; let hello = new GSound.Context(); hello.init(null); hello.play_simple({ "event.id" : "phone-incoming-call", "event.description" : "hello world" }, null); GLib.usleep (2000000);
Lua
hello_world.lua
#!/usr/bin/lua lgi = require 'lgi' GLib = lgi.require('GLib') GSound = lgi.require('GSound') hello = GSound.Context() hello:play_simple({ [GSound.ATTR_EVENT_ID] = "phone-incoming-call", [GSound.ATTR_EVENT_DESCRIPTION] = "hello world" }) GLib.usleep (2000000)
Perl
- 依存パッケージ: gsound, perl-glib-object-introspection
hello_world.pl
#!/usr/bin/perl use Glib::Object::Introspection; Glib::Object::Introspection->setup ( basename => 'GSound', version => '1.0', package => 'GSound'); my $hello = GSound::Context->new; $hello->play_simple({ "event.id" => "phone-incoming-call", "event.description" => "hello world" }); sleep (2);
Python
- 依存パッケージ: gsound, python-gobject
hello_world.py
#!/usr/bin/python import gi gi.require_version('GSound', '1.0') from gi.repository import GLib, GSound hello = GSound.Context() hello.init() hello.play_simple({GSound.ATTR_EVENT_ID: "phone-incoming-call", GSound.ATTR_EVENT_DESCRIPTION: "hello world"}) GLib.usleep(2000000)
Ruby
- 依存パッケージ: gsound, ruby-gir_ffiAUR
hello_world.rb
#!/usr/bin/ruby require 'gir_ffi' GirFFI.setup :GSound Hello = GSound::Context.new Hello.play_simple("event.id" => "phone-incoming-call", "event.description" => "hello world") sleep (2)
Vala
- 依存パッケージ: libcanberra
- ビルド依存パッケージ: vala
- ビルド:
valac --pkg libcanberra hello_world.vala
hello_world.vala
using Canberra; public class HelloWorld { static void main () { Context hello; Context.create(out hello); hello.play (0, PROP_EVENT_ID, "phone-incoming-call", PROP_EVENT_DESCRIPTION, "hello world"); Thread.usleep (2000000); } }