embedded-deck
TEKNİK REHBER GÖMÜLÜ LİNUX ALSA 2026

ALSA & Ses
Linux Audio Alt Sistemi.

ALSA kernel mimarisinden .asoundrc yapılandırmasına, ASoC machine driver tasarımından DAPM güç yönetimine ve Device Tree binding'den Raspberry Pi I2S DAC uygulamasına kadar eksiksiz Linux ses alt sistemi rehberi.

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ı

KatmanGörevGömülü KullanımıGecikme
ALSA (kernel)Donanım sürücüsü, PCM buffer yönetimiHer zaman temel<1 ms
ALSA (alsa-lib)PCM plug, dmix, softvol, rate dönüşümSunucusuz kullanım1–5 ms
PulseAudioÇoklu uygulama mix, Bluetooth, networkDesktop odaklı20–80 ms
PipeWirePA + JACK yerine geçer, pro audio + multimediaModern tercih1–10 ms
JACKDüşük gecikme pro audio, graph routingMü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.

NOT

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

Card (kart)Bir ses kontrolcüsü — hw:0, hw:1. Birden fazla kart birden fazla ses donanımını temsil eder
Device (cihaz)Kart içinde bir PCM stream — hw:0,0 hw:0,1. Çoğu kartta 0 = oynatma, 1 = kayıt
Subdevice (alt cihaz)Aynı PCM üzerinde paralel stream — hw:0,0,0 hw:0,0,1

/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

FormatAçıklamaKullanım
S16_LE16-bit signed little-endianStandart CD kalitesi
S24_LE24-bit signed (3-byte)Pro audio
S32_LE32-bit signed (4-byte)Yüksek çözünürlük DAC
FLOAT_LE32-bit IEEE 754 floatDSP işleme
MU_LAW8-bit µ-lawTelefon/VoIP
IEC958_SUBFRAME_LES/PDIF subframeDijital çı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 DriverBoard'a özgü glue kodu — codec ve platform'u birbirine bağlar, DAPM route'ları tanımlar, clock yapılandırması yapar
Codec DriverDAC/ADC çipi sürücüsü (PCM5102, ES8388, WM8960...) — mixer kontrolleri, DAPM widget'ları, codec register map
Platform DriverSoC I2S/PCM kontrolcüsü (bcm2835-i2s, imx-ssi, rockchip-i2s) — DMA transfer, clock üretimi
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üMacroAçıklama
MixerSND_SOC_DAPM_MIXERBirden fazla sinyali birleştirir
MUXSND_SOC_DAPM_MUXBir girişi seçer
PGASND_SOC_DAPM_PGAProgramlanabilir kazanç amplifikatörü
DACSND_SOC_DAPM_DACDijital-analog dönüştürücü
ADCSND_SOC_DAPM_ADCAnalog-dijital dönüştürücü
OutputSND_SOC_DAPM_OUTPUTFiziksel çıkış pini
InputSND_SOC_DAPM_INPUTFiziksel giriş pini
SupplySND_SOC_DAPM_SUPPLYGüç 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:

SND_SOC_BIAS_OFFTüm güç kapalı — deep sleep, hiçbir ses işlemi yok
SND_SOC_BIAS_STANDBYReferans voltajı aktif — ses yok ama hızlı geçiş hazır
SND_SOC_BIAS_PREPARESes açılmadan önce hazırlık aşaması
SND_SOC_BIAS_ONTam güç — aktif ses oynatma veya kayıt
# 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 PinRaspberry Pi GPIOİşlev
BCKGPIO 18 (PCM CLK)Bit Clock
LRCKGPIO 19 (PCM FS)Left/Right Clock (Word Select)
DINGPIO 21 (PCM DOUT)Veri girişi (Pi→DAC)
SCKGND (slave mode)System Clock (Master Mode'da bağlı)
VCC3.3V veya 5VGüç
GNDGNDToprak

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
ÖZET

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.