00 Linux ses mimarisi
Linux ses yığını, kernel ALSA katmanından kullanıcı alanı ses sunucularına kadar birden fazla katmandan oluşur. Her katman belirli bir soyutlama sağlar.
Katmanlı mimari
Uygulama (GStreamer, SDL, openal, mpv)
|
PipeWire / PulseAudio / JACK
(userspace ses sunucusu)
|
libasound (alsa-lib)
.asoundrc PCM plug katmanı
|
┌─────────────────────────────┐
│ ALSA Kernel Alt Sistemi │
│ ┌─────────────────────┐ │
│ │ ASoC Framework │ │
│ │ (gömülü ses) │ │
│ └──────┬──────────────┘ │
│ │ │
│ Machine│ Codec Platform │
│ Driver │ Driver Driver │
└─────────┼───────────────────┘
│
Donanım (I2S, SPI, I2C DAC/ADC)
Ses sunucusu karşılaştırması
| Katman | Görev | Gömülü Kullanımı | Gecikme |
|---|---|---|---|
| ALSA (kernel) | Donanım sürücüsü, PCM buffer yönetimi | Her zaman temel | <1 ms |
| ALSA (alsa-lib) | PCM plug, dmix, softvol, rate dönüşüm | Sunucusuz kullanım | 1–5 ms |
| PulseAudio | Çoklu uygulama mix, Bluetooth, network | Desktop odaklı | 20–80 ms |
| PipeWire | PA + JACK yerine geçer, pro audio + multimedia | Modern tercih | 1–10 ms |
| JACK | Düşük gecikme pro audio, graph routing | Müzik ekipmanları | <5 ms |
Gömülü sistemlerde PulseAudio ve PipeWire genellikle gereksizdir. aplay doğrudan ALSA PCM cihazına yazarak ek gecikme katmanı olmadan ses çalar. Sadece birden fazla uygulamanın aynı anda ses çalması gerekiyorsa dmix veya PipeWire kullanılır.
Raspberry Pi OS (Bookworm) artık varsayılan olarak PipeWire kullanır. Eski PulseAudio servisi pipewire-pulse ile emüle edilir. Gömülü uygulamalar için alsa-utils kurarak doğrudan ALSA'ya erişmek daha kontrollü ve öngörülebilirdir.
01 ALSA card/device/subdevice modeli
ALSA, her ses donanımını kart → cihaz → alt cihaz hiyerarşisiyle modeller. Bu hiyerarşiyi anlamak doğru PCM cihazını seçmek için gereklidir.
Hiyerarşi
/proc/asound ile inceleme
# Tüm kartları listele
cat /proc/asound/cards
# 0 [bcm2835ALSA ]: bcm2835 ALSA - bcm2835 ALSA
# 1 [sndrpiiqaudio]: snd_rpi_iqaudio_dac - ...
# Cihazları incele
cat /proc/asound/card0/pcm0p/info
# card: 0, device: 0, subdevices: 8
# id: bcm2835 ALSA, name: bcm2835 ALSA
# PCM stream durumu
cat /proc/asound/card1/pcm0p/sub0/status
# Mixer kontrolleri
cat /proc/asound/card0/id
aplay -l ile kart listesi
aplay -l
# **** List of PLAYBACK Hardware Devices ****
# card 0: bcm2835ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA]
# Subdevices: 7/8
# card 1: sndrpiiqaudio [IQaudIO DAC+], device 0: IQAudio DAC HiFi ...
# Subdevices: 1/1
# Kayıt cihazları
arecord -l
# PCM cihaz formatı:
# hw:CARD,DEV,SUBDEV — doğrudan erişim, kernel buffer
# plughw:0,0 — otomatik format dönüşüm
02 aplay / arecord
aplay ve arecord, ALSA'nın temel komut satırı oynatma ve kayıt araçlarıdır. Test, debug ve basit ses pipeline'ları için vazgeçilmezdir.
aplay temel kullanım
# Basit WAV oynatma
aplay /usr/share/sounds/alsa/Front_Left.wav
# Belirli kart ve cihaz seç
aplay -D hw:1,0 test.wav
# Format belirterek raw PCM oynat
aplay -D hw:0,0 \
--format=S16_LE \
--rate=48000 \
--channels=2 \
audio.raw
# Buffer ve period boyutu ayarla (gecikme tuning)
aplay -D plughw:0,0 \
--buffer-size=4096 \
--period-size=1024 \
test.wav
# Ses seviyesini vol ile normalize et
aplay -D "plug:softvol" test.wav
arecord ile ses yakalama
# 10 saniye kayıt — WAV formatı
arecord -D hw:0,0 \
-f S16_LE -r 44100 -c 2 \
-d 10 output.wav
# Sürekli kayıt (Ctrl+C ile dur)
arecord -D hw:1,0 -f S32_LE -r 96000 -c 2 capture.wav
# Loopback test: kayıt edip aynı anda çal
arecord -D hw:0,0 -f S16_LE -r 44100 -c 2 - | \
aplay -D hw:0,0 -f S16_LE -r 44100 -c 2 -
Desteklenen formatlar
| Format | Açıklama | Kullanım |
|---|---|---|
| S16_LE | 16-bit signed little-endian | Standart CD kalitesi |
| S24_LE | 24-bit signed (3-byte) | Pro audio |
| S32_LE | 32-bit signed (4-byte) | Yüksek çözünürlük DAC |
| FLOAT_LE | 32-bit IEEE 754 float | DSP işleme |
| MU_LAW | 8-bit µ-law | Telefon/VoIP |
| IEC958_SUBFRAME_LE | S/PDIF subframe | Dijital çıkış |
03 .asoundrc konfigürasyonu
~/.asoundrc veya /etc/asound.conf ile ALSA PCM cihazlarını, mix, yazılım ses seviyesi ve örnekleme hızı dönüşümü yapılandırabilirsiniz.
Varsayılan cihaz ayarlama
# ~/.asoundrc veya /etc/asound.conf
# Varsayılan PCM cihazını kart 1, cihaz 0 olarak ayarla
pcm.!default {
type hw
card 1
device 0
}
ctl.!default {
type hw
card 1
}
dmix ile çoklu uygulama karıştırma
dmix, birden fazla uygulamanın aynı ses kartına aynı anda yazmasına izin veren bir ALSA plug'dır. Donanım mixing desteklemeyen kartlar için zorunludur.
pcm.dmixed {
type dmix
ipc_key 1024
ipc_key_add_uid true
slave {
pcm "hw:0,0"
rate 48000
channels 2
period_time 0
period_size 1024
buffer_size 4096
}
bindings {
0 0
1 1
}
}
pcm.!default {
type plug
slave.pcm "dmixed"
}
softvol — yazılım ses seviyesi
pcm.softvol {
type softvol
slave {
pcm "hw:0,0"
}
control {
name "Master"
card 0
}
min_dB -51.0
max_dB 0.0
resolution 256
}
pcm.!default {
type plug
slave.pcm "softvol"
}
Örnekleme hızı dönüşümü (rate plugin)
pcm.rate_convert {
type plug
slave {
pcm "hw:1,0"
rate 48000 # DAC'ın desteklediği oran
channels 2
format S32_LE
}
}
# Artık 44100 Hz ses de 48000 Hz çıkışa otomatik dönüşür
# aplay -D rate_convert -r 44100 -f S16_LE test.wav
04 amixer ve alsamixer
amixer komut satırı mixer kontrolcüsü, alsamixer ise terminal tabanlı görsel mixer arayüzüdür. Her ikisi de ALSA Simple Mixer Interface (SMI) üzerinden çalışır.
amixer temel kullanım
# Kart 0'daki tüm kontrolleri listele
amixer -c 0 scontrols
# Belirli kontrolü incele
amixer -c 0 sget Master
# Simple mixer control 'Master',0
# Capabilities: pvolume pswitch
# Playback channels: Front Left - Front Right
# Limits: Playback 0 - 65536
# Front Left: Playback 48000 [73%] [on]
# Front Right: Playback 48000 [73%] [on]
# Ses seviyesini yüzde ile ayarla
amixer -c 0 sset Master 80%
# Mutele al
amixer -c 0 sset Master mute
# Mutele geri al
amixer -c 0 sset Master unmute
# Toggle
amixer -c 0 sset Master toggle
numid ile doğrudan kontrol erişimi
# Tüm kontrolleri numid ile listele
amixer -c 0 controls
# Numid üzerinden sorgula ve ayarla
amixer -c 0 cget numid=3
amixer -c 0 cset numid=3 80%
# Raw değer ayarla (0–65536 arası)
amixer -c 0 cset numid=3 52000
alsamixer kullanımı
# Varsayılan kart
alsamixer
# Belirli kart
alsamixer -c 1
# Sadece capture kontrolleri
alsamixer -V capture
# Klavye kısayolları:
# F6 = kart seç
# F3 = playback F4 = capture F5 = tümü
# M = mute/unmute
# Yukarı/Aşağı ok = ses seviyesi
# Tab = sol/sağ kanal kilidi açma
alsactl ile ayarları kaydet/yükle
# Mevcut mixer ayarlarını kaydet
alsactl store -f /etc/asound.state
# Ayarları geri yükle (boot'ta)
alsactl restore -f /etc/asound.state
# Systemd ile otomatik yükleme
# /etc/systemd/system/alsa-restore.service
# ExecStart=alsactl restore
05 ASoC mimarisi
ASoC (ALSA System on Chip) framework, gömülü SoC ses sistemlerini modüler bir şekilde modellemek için geliştirilmiştir. Üç sürücü türünden oluşur.
ASoC bileşenleri
Machine Driver (board/sound/snd-myboard.c)
| |
Platform Codec
Driver Driver
(bcm2835- (pcm5102a.c)
i2s.c) |
| I2C (register access)
DMA
|
I2S Bus ————————————————— PCM5102 DAC Chip
(BCLK, LRCLK, DATA)
Machine driver skeleton (C)
// sound/soc/bcm/rpi-pcm5102.c (örnek)
#include <linux/module.h>
#include <sound/soc.h>
static struct snd_soc_dai_link rpi_pcm5102_dai = {
.name = "PCM5102",
.stream_name = "PCM5102 HiFi",
.cpu_dai_name = "bcm2835-i2s.0",
.codec_dai_name = "pcm5102a-hifi",
.platform_name = "bcm2835-i2s.0",
.codec_name = "pcm5102a",
.dai_fmt = SND_SOC_DAIFMT_I2S |
SND_SOC_DAIFMT_NB_NF |
SND_SOC_DAIFMT_CBS_CFS,
};
static struct snd_soc_card rpi_pcm5102 = {
.name = "rpi-pcm5102",
.owner = THIS_MODULE,
.dai_link = &rpi_pcm5102_dai,
.num_links = 1,
};
06 DAPM — Dynamic Audio Power Management
DAPM, ses kartındaki her bileşenin (amplifier, mixer, ADC, DAC, PGA...) gerçek kullanım durumuna göre otomatik olarak güç verilip kaldırılmasını sağlayan ASoC'un güç yönetim çerçevesidir.
DAPM widget türleri
| Widget Türü | Macro | Açıklama |
|---|---|---|
| Mixer | SND_SOC_DAPM_MIXER | Birden fazla sinyali birleştirir |
| MUX | SND_SOC_DAPM_MUX | Bir girişi seçer |
| PGA | SND_SOC_DAPM_PGA | Programlanabilir kazanç amplifikatörü |
| DAC | SND_SOC_DAPM_DAC | Dijital-analog dönüştürücü |
| ADC | SND_SOC_DAPM_ADC | Analog-dijital dönüştürücü |
| Output | SND_SOC_DAPM_OUTPUT | Fiziksel çıkış pini |
| Input | SND_SOC_DAPM_INPUT | Fiziksel giriş pini |
| Supply | SND_SOC_DAPM_SUPPLY | Güç kaynağı (AVDD, DVDD) |
DAPM route tanımlama
// codec driver içinde route tablosu:
static const struct snd_soc_dapm_route wm8960_routes[] = {
/* Playback path */
{ "Left Output Mixer", "PCM Playback Switch", "Left DAC" },
{ "Right Output Mixer", "PCM Playback Switch", "Right DAC" },
{ "HP_L", NULL, "Left Output Mixer" },
{ "HP_R", NULL, "Right Output Mixer" },
/* Capture path */
{ "Left ADC", NULL, "Left Input PGA" },
{ "Left Input PGA", NULL, "LINPUT1" },
};
// Format: { sink, control, source }
// control NULL ise her zaman bağlı (unconditional route)
Bias level geçişleri
DAPM, codec'in güç durumunu dört seviyede yönetir:
# DAPM route durumunu /proc'tan incele
cat /proc/asound/card1/dapm_widgets
# DAPM güç tüketimi özeti
cat /sys/kernel/debug/asoc/*/dapm_pop_time 2>/dev/null
07 Device Tree binding
ASoC ses kartları Device Tree üzerinden yapılandırılır. simple-audio-card binding, machine driver yazmadan temel I2S kurulumu sağlar.
simple-audio-card binding
/* arch/arm/boot/dts/myboard.dts */
/* I2C bus üzerindeki codec */
&i2c1 {
status = "okay";
clock-frequency = <100000>;
wm8960: wm8960@1a {
compatible = "wlf,wm8960";
reg = <0x1a>;
#sound-dai-cells = <0>;
clocks = <&mclk>;
clock-names = "mclk";
wlf,shared-lrclk;
};
};
/* I2S kontrolcüsü */
&i2s0 {
status = "okay";
#sound-dai-cells = <0>;
};
/* Ses kartı */
sound {
compatible = "simple-audio-card";
simple-audio-card,name = "MyBoard Audio";
simple-audio-card,format = "i2s";
simple-audio-card,bitclock-master = <&cpu_dai>;
simple-audio-card,frame-master = <&cpu_dai>;
simple-audio-card,routing =
"Headphone Jack", "HP_L",
"Headphone Jack", "HP_R",
"LINPUT1", "Microphone Jack";
cpu_dai: simple-audio-card,cpu {
sound-dai = <&i2s0>;
dai-tdm-slot-num = <2>;
dai-tdm-slot-width = <32>;
};
simple-audio-card,codec {
sound-dai = <&wm8960>;
clocks = <&mclk>;
clock-names = "mclk";
};
};
PCM5102 (DAC-only, register-less) binding
/* PCM5102 I2C gerektirmez — sadece I2S */
pcm5102a: pcm5102a {
compatible = "ti,pcm5102a";
#sound-dai-cells = <0>;
};
sound {
compatible = "simple-audio-card";
simple-audio-card,name = "RPi-PCM5102";
simple-audio-card,format = "i2s";
simple-audio-card,bitclock-master = <&cpu_dai>;
simple-audio-card,frame-master = <&cpu_dai>;
cpu_dai: simple-audio-card,cpu {
sound-dai = <&i2s>;
};
simple-audio-card,codec {
sound-dai = <&pcm5102a>;
};
};
08 Pratik: Raspberry Pi + I2S DAC (PCM5102)
PCM5102A I2S DAC modülü ile Raspberry Pi 4 arasında tam ses kurulumu — Device Tree overlay, ALSA yapılandırması ve ses testi.
Donanım bağlantıları
| PCM5102 Pin | Raspberry Pi GPIO | İşlev |
|---|---|---|
| BCK | GPIO 18 (PCM CLK) | Bit Clock |
| LRCK | GPIO 19 (PCM FS) | Left/Right Clock (Word Select) |
| DIN | GPIO 21 (PCM DOUT) | Veri girişi (Pi→DAC) |
| SCK | GND (slave mode) | System Clock (Master Mode'da bağlı) |
| VCC | 3.3V veya 5V | Güç |
| GND | GND | Toprak |
Adım 1: Device Tree Overlay etkinleştirme
# /boot/config.txt (Raspberry Pi OS) veya /boot/firmware/config.txt
# Varsayılan ses kartını devre dışı bırak
dtparam=audio=off
# PCM5102 overlay'i etkinleştir
dtoverlay=hifiberry-dac
# Alternatif: özel overlay
dtoverlay=i2s-mmap
Adım 2: hifiberry-dac overlay içeriği (referans)
# Raspberry Pi overlay kaynak kodu şu şekilde görünür:
# overlays/hifiberry-dac-overlay.dts (çekirdek kaynak)
/dts-v1/;
/plugin/;
/ {
compatible = "brcm,bcm2835";
fragment@0 {
target = <&i2s>;
__overlay__ { status = "okay"; };
};
fragment@1 {
target-path = "/";
__overlay__ {
pcm5102a: pcm5102a {
compatible = "ti,pcm5102a";
#sound-dai-cells = <0>;
status = "okay";
};
};
};
fragment@2 {
target = <&sound>;
hifiberry_dac: __overlay__ {
compatible = "hifiberry,hifiberry-dac";
i2s-controller = <&i2s>;
status = "okay";
};
};
};
Adım 3: ALSA yapılandırması
# /etc/asound.conf — PCM5102'yi varsayılan yap
pcm.!default {
type hw
card sndrpihifiberry # veya card 0 (tek kart ise)
device 0
}
ctl.!default {
type hw
card sndrpihifiberry
}
# Yazılım ses kontrolü (PCM5102'nin hardware mixer yok)
pcm.softvol {
type softvol
slave.pcm "hw:sndrpihifiberry"
control {
name "Master"
card sndrpihifiberry
}
}
Adım 4: Test ve doğrulama
# Kart tanındı mı?
aplay -l
# card 0: sndrpihifiberry [snd_rpi_hifiberry_dac], device 0: HifiBerry DAC HiFi pcm5102a-hifi-0
# Ses testi
speaker-test -D hw:0 -c 2 -t sine -f 1000
# WAV dosyası çal
aplay -D hw:0,0 -f S32_LE -r 48000 -c 2 test48k.wav
# Mixer kontrolleri
amixer -c sndrpihifiberry scontrols
# (PCM5102 hardware mixer yok — sadece digital volume varsa)
# I2S parametrelerini doğrula
cat /proc/asound/card0/pcm0p/sub0/hw_params
# format: S32_LE
# subformat: STD
# channels: 2
# rate: 48000 (48000/1)
# period_size: 1024
# buffer_size: 8192
Adım 5: Sorun giderme
# Kart bulunamıyorsa:
dmesg | grep -i "i2s\|pcm5102\|hifiberry"
# I2S clock sorunu:
# Pi'de I2S master mode için doğru MCLK frekansı gerekir
# 48kHz → BCLK = 48000 * 64 = 3.072 MHz
# Overlay config.txt'de: dtparam=i2s=on
# ALSA buffer hatası:
aplay -D hw:0,0 --buffer-time=100000 --period-time=25000 test.wav
# PipeWire çakışması çözme:
systemctl --user stop pipewire pipewire-pulse
aplay -D hw:0,0 test.wav
Linux ses mimarisi ALSA çekirdeğinden ASoC framework'ına, DAPM güç yönetiminden Device Tree binding'e kadar katmanlı bir yapıya sahiptir. Gömülü sistemlerde PulseAudio veya PipeWire olmadan doğrudan hw: cihazına erişmek, gecikme ve öngörülebilirlik açısından idealdir. PCM5102 gibi register-less DAC'lar için simple-audio-card binding ile makine sürücüsü yazmaya gerek kalmaz.