pipewire.conf(5) File Formats Manual pipewire.conf(5)

pipewire.conf - فایل پیکربندی سرور PipeWire

فایل پیکربندی سرور PipeWire

$XDG_CONFIG_HOME/pipewire/pipewire.conf

/etc/pipewire/pipewire.conf

/usr/share/pipewire/pipewire.conf

/usr/share/pipewire/pipewire.conf.d/

/etc/pipewire/pipewire.conf.d/

$XDG_CONFIG_HOME/pipewire/pipewire.conf.d/

پایپ‌ویر (PipeWire) سرویسی است که اشتراک‌گذاری محتوای چندرسانه‌ای را بین دستگاه‌ها و برنامه‌ها تسهیل می‌کند.

دیمن در هنگام راه‌اندازی، یک فایل پیکربندی اصلی را برای پیکربندی خود می‌خواند. این دیمن مجموعه‌ای از دستورات فهرست‌شده در فایل پیکربندی را اجرا می‌کند.

فایل پیکربندی به ترتیبی که در بخش خلاصه دستور (SYNOPSIS) آمده است، جستجو می‌شود. از متغیرهای محیطی PIPEWIRE_CONFIG_DIR، PIPEWIRE_CONFIG_PREFIX و PIPEWIRE_CONFIG_NAME می‌توان به ترتیب برای تعیین شاخه، زیرشاخه و فایل پیکربندی جایگزین استفاده کرد.

سایر فایل‌های پیکربندی PipeWire عموماً از همین منطق جستجو پیروی می‌کنند و نام فایل پیکربندی مربوطه جایگزین pipewire.conf می‌شود.

تمام فایل‌های *.conf در شاخه‌های pipewire.conf.d/ بارگذاری و در پیکربندی ادغام می‌شوند. بخش‌های واژه‌نامه‌ای (Dictionary) ادغام شده و ویژگی‌ها را در صورت وجود بازنویسی می‌کنند، و به بخش‌های آرایه‌ای (Array) افزوده می‌شود. فایل‌های الحاقی (Drop-in) همان قالب فایل پیکربندی اصلی را دارند، اما فقط شامل تنظیماتی هستند که باید تغییر داده شوند.

از آنجا که فایل پیکربندی pipewire.conf شامل بخش‌های گوناگونی است که باید برای عملکرد صحیح وجود داشته باشند، استفاده از فایل‌های الحاقی برای پیکربندی توصیه می‌شود.

یک فایل پیکربندی ~/.config/pipewire/pipewire.conf.d/custom.conf برای تغییر مقدار تنظیم default.clock.min-quantum در pipewire.conf:

# ~/.config/pipewire/pipewire.conf.d/custom.conf
context.properties = {
    default.clock.min-quantum = 128
}

فایل پیکربندی در قالب JSON نوع "SPA" است.

فایل پیکربندی شامل کلیدهای سطح بالا (Top-level) است که همان بخش‌ها هستند. مقدار هر بخش یا یک واژه‌نامه (Dictionary)، { }، یا یک آرایه (Array)، [ ] است. اعلان بخش‌ها و آیتم‌های واژه‌نامه به صورت KEY = VALUE بوده و با فاصله از یکدیگر جدا می‌شوند. برای مثال:

context.properties = {  # top-level dictionary section
    key1 = value  # a simple value
    key2 = { key1 = value1 key2 = value2 }  # a dictionary with two entries
    key3 = [ value1 value2 ]  # an array with two entries
    key4 = [ { k = v1 } { k = v2 } ]  # an array of dictionaries
}
context.modules = [  # top-level array section
    value1
    value2
]

فایل‌های پیکربندی را می‌توان با نحو استاندارد JSON نیز نوشت، اما برای ویرایش دستی آسان‌تر، نگارش آسان‌گیر "SPA" مجاز است. در JSON نوع "SPA":

  • کاراکتر : برای جداسازی کلیدها و مقادیر می‌تواند با = یا یک فاصله جایگزین شود.
  • علامت " در اطراف کلیدها و رشته‌ها تا زمانی که از نویسه‌های خاص در رشته‌ها استفاده نشده باشد، می‌تواند حذف شود.
  • کاراکتر , برای جداسازی اشیاء می‌تواند با یک نویسه فاصله (whitespace) جایگزین شود.
  • از # می‌توان برای شروع یک یادداشت (کامنت) تا انتهای خط استفاده کرد.

context.properties

واژه‌نامه (Dictionary). این ویژگی‌ها نمونه‌ی PipeWire را پیکربندی می‌کنند.

context.spa-libs

واژه‌نامه (Dictionary). ویژگی‌های افزونه را با الگوهای عمومی (globs) به یک کتابخانه spa نگاشت می‌کند.

context.modules

آرایه‌ای از واژه‌نامه‌ها. هر مدخل در این آرایه یک واژه‌نامه با name ماژول مورد نظر برای بارگذاری است که شامل اختیاری args و flags نیز می‌شود. بیشتر ماژول‌ها از بارگذاری چندباره پشتیبانی می‌کنند.

context.objects

آرایه‌ای از واژه‌نامه‌ها. هر مدخل در این آرایه یک واژه‌نامه شامل factory برای ایجاد یک شیء و آرگومان‌های اختیاری اضافی مخصوص آن کارخانه است.

context.exec

آرایه‌ای از واژه‌نامه‌ها. هر مدخل در این آرایه یک واژه‌نامه شامل path برنامه‌ای برای اجرا در هنگام راه‌اندازی و اختیاری args است.

این آرایه پیش‌تر شامل مدخلی برای راه‌اندازی مدیر نشست (Session Manager) بود، اما این شیوه اجرا از آن زمان به یک ابزار کمکی برای توسعه تقلیل یافته است. از راه‌اندازی مدیر نشست به این شیوه در محیط‌های عملیاتی خودداری کنید.

node.rules

آرایه‌ای از واژه‌نامه‌ها. قواعد تطبیق برای تغییر ویژگی‌های گره (Node) در سرور.

device.rules

آرایه‌ای از واژه‌نامه‌ها. قواعد تطبیق برای تغییر ویژگی‌های دستگاه (Device) در سرور.

ویژگی‌های موجود PipeWire در context.properties و مقادیر پیش‌فرض احتمالی آن‌ها.

clock.power-of-two-quantum = true

درخواست‌های کوانتوم از سوی کلاینت‌ها و کوانتوم نهایی گراف به توان‌های عدد دو به پایین گرد می‌شوند. کوانتومی که توانی از دو باشد، می‌تواند برای بسیاری از پردازش‌ها کارآمدتر باشد.

context.data-loop.library.name.system

نام کتابخانه اشتراکی مورد استفاده برای توابع سیستمی در ریسه پردازش داده (Data processing thread). این گزینه معمولاً زمانی تغییر می‌کند که ریسه داده بر روی یک هسته بی‌درنگ (Realtime) مانند EVL اجرا شود.

loop.rt-prio = -1

اولویت حلقه‌های داده. از حلقه‌های داده برای زمان‌بندی گره‌ها در گراف استفاده می‌شود. مقدار -1 از اولویت بی‌درنگ پیش‌فرض module-rt استفاده می‌کند. مقدار 0 زمان‌بندی بی‌درنگ را برای حلقه‌های داده غیرفعال می‌کند.

loop.class = [ data.rt .. ]

آرایه‌ای از کلاس‌های حلقه‌های داده. گره‌ها معمولاً بر اساس نام یا کلاس به یک حلقه اختصاص می‌یابند. گره‌ها به طور پیش‌فرض به کلاس data.rt اختصاص داده می‌شوند، بنابراین بهتر است یک حلقه داده از این کلاس نیز وجود داشته باشد.

context.num-data-loops = 1

تعداد حلقه‌های داده برای ایجاد. به طور پیش‌فرض ۱ حلقه داده ایجاد شده و تمام گره‌ها در این ریسه زمان‌بندی می‌شوند. مقدار 0 حلقه‌های داده بی‌درنگ را غیرفعال کرده و تمام گره‌ها را در ریسه اصلی زمان‌بندی می‌کند. مقدار -1 به تعداد هسته‌های CPU ریسه‌های داده ایجاد می‌کند.

context.data-loops = [ ... ]

این گزینه حلقه‌های داده‌ای را که برای این زمینه ایجاد می‌شوند کنترل می‌کند. این یک آرایه از مشخصات حلقه داده است، یک مدخل برای هر حلقه داده که باید راه‌اندازی شود:
# ~/.config/pipewire/pipewire.conf.d/custom.conf
context.data-loops = [
    {
         #library.name.system = support/libspa-support
         loop.rt-prio = -1
         loop.class = [ data.rt .. ]
         thread.name = data-loop.0
         thread.affinity = [ 0 1 ]
    }
    ...
]

یک اولویت مشخص، کلاس‌ها و نام می‌توانند به ترتیب با loop.rt-prio، loop.class و thread.name تعیین شوند. همچنین می‌توان حلقه داده را با ویژگی thread.affinity به هسته‌های خاصی از CPU متصل (Pin) کرد.

core.daemon = false

فرایند PipeWire که با این پیکربندی آغاز شده است را به یک فرایند دیمن تبدیل می‌کند. این بدان معناست که یک گراف را برای کلاینت‌ها مدیریت و زمان‌بندی خواهد کرد. همچنین ممکن است بخواهید core.name را برای دادن یک نام شناخته‌شده به آن پیکربندی کنید.

core.name = pipewire-0

نام زمینه PipeWire. این همچنین نام سوکت PipeWire خواهد بود که کلاینت‌ها می‌توانند به آن متصل شوند.

cpu.zero.denormals = false

پردازنده (CPU) را پیکربندی می‌کند تا اعداد غیرعادی (denormals) را به طور خودکار صفر کند. در صورت فعال بودن، این ویژگی فقط برای ریسه پردازش داده فعال خواهد شد.

cpu.vm.name = null

این گزینه هنگام ایجاد زمینه به طور خودکار تنظیم می‌شود و حاوی نام ماشین مجازی خواهد بود. معمولاً برای نوشتن قواعد تطبیق به منظور تنظیم ویژگی‌های اضافی استفاده می‌شود.

default.clock.rate = 48000

نرخ ساعت پیش‌فرض، مدت زمان بلادرنگ کوانتوم‌های min/max/default را تعیین می‌کند. هنگامی که نرخ ساعت پیش‌فرض را تغییر می‌دهید، ممکن است بخواهید کوانتوم‌ها را نیز تغییر دهید تا مدت زمان یکسانی برای کوانتوم‌ها حفظ شود.

default.clock.allowed-rates = [ ]

امکان تعیین حداکثر ۳۲ نرخ نمونه‌برداری جایگزین وجود دارد. هنگامی که دستگاه‌ها در حالت آماده‌به‌کار (Idle) باشند، نرخ نمونه‌برداری گراف تغییر داده خواهد شد. توجه داشته باشید که در حال حاضر به دلیل مشکلات مختلف در هسته و بلوتوث، این گزینه به طور پیش‌فرض فعال نیست. همچنین توجه داشته باشید که مقادیر min/max/default کوانتوم با تغییر نرخ نمونه‌برداری مقیاس‌بندی می‌شوند.

default.clock.min-quantum = 32

حداقل کوانتوم پیش‌فرض.

default.clock.max-quantum = 8192

حداکثر کوانتوم پیش‌فرض.

default.clock.quantum = 1024

کوانتوم پیش‌فرضی که در صورت مشخص نشدن توسط کلاینت استفاده می‌شود.

default.clock.quantum-limit = 8192

حداکثر کوانتومی که باید برای آن فضا رزرو شود. این حداکثر اندازه بافر استفاده‌شده در گراف بدون در نظر گرفتن نرخ نمونه‌برداری است.

default.clock.quantum-floor = 4

حداقل کوانتومی که باید برای آن فضا رزرو شود. این حداقل اندازه بافر استفاده‌شده در گراف بدون در نظر گرفتن نرخ نمونه‌برداری است.

default.video.width

عرض تصویر پیش‌فرض.

default.video.height

ارتفاع تصویر پیش‌فرض.

default.video.rate.num

صورت نرخ فریم تصویر پیش‌فرض.

default.video.rate.denom

مخرج نرخ فریم تصویر پیش‌فرض.

library.name.system = support/libspa-support

نام کتابخانه اشتراکی برای استفاده در توابع سیستمی برای ریسه اصلی.

link.max-buffers = 64

حداکثر تعداد بافرهایی که باید بین گره‌ها مذاکره شود. توجه داشته باشید که کلاینت‌های نگارش کمتر از ۳ تنها از ۱۶ بافر پشتیبانی می‌کنند. بافرهای بیشتر از نظر تأخیر و حافظه تقریباً همیشه نامطلوب‌تر از بافرهای کمتر است.

log.level = 2

سطح لاگ پیش‌فرض مورد استفاده توسط فرایند.

mem.allow-mlock = true

تلاش برای قفل کردن حافظه (mlock) برای فرایندهای بی‌درنگ. حافظه قفل‌شده توسط هسته به swap منتقل نمی‌شود و از وقفه در ریسه‌های پردازشی جلوگیری می‌کند.

mem.warn-mlock = false

هشدار در صورت عدم موفقیت در قفل کردن حافظه.

mem.mlock-all = false

تلاش برای قفل کردن تمام حافظه فعلی و آینده توسط فرایند.

rlimit.nofile = 4096

تلاش برای تنظیم محدودیت منابع حداکثر تعداد توصیف‌کننده فایل (File descriptor) برای فرایند. مقدار -1 محدودیت را به مقدار بیشینه سخت‌افزاری/سیستمی افزایش می‌دهد. محدودیت منابع فایل معمولاً 1024 است و تنها در صورتی باید افزایش یابد که برنامه از فراخوان سیستمی select() استفاده نکند. پایپ‌ویر معمولاً از select() استفاده نمی‌کند.

rlimit.*resource* = value

تنظیم محدودیت‌های منابع. resource می‌تواند یکی از موارد زیر باشد: as، core، cpu، data، fsize، locks، memlock، msgqueue، nice، nofile، nproc، rss، rtprio، rttime، sigpending یا stack. برای درک مفهوم این منابع، مستندات setrlimit را ببینید. مقدار -1 حداکثر محدودیت مجاز را تنظیم می‌کند.

settings.check-quantum = false

بررسی اینکه آیا کوانتوم در به‌روزرسانی فراداده تنظیمات با محدودیت‌های پیکربندی‌شده سازگار است یا خیر.

settings.check-rate = false

بررسی اینکه آیا نرخ در به‌روزرسانی فراداده تنظیمات با محدودیت‌های پیکربندی‌شده سازگار است یا خیر.

support.dbus = true

فعال‌سازی پشتیبانی از DBus. این ویژگی پشتیبانی از DBus را در ماژول‌های مختلف که به آن نیاز دارند فعال می‌کند. اگر می‌خواهید پشتیبانی از DBus را به طور سراسری در فرایند غیرفعال کنید، این گزینه را غیرفعال نمایید.

vm.overrides = { default.clock.min-quantum = 1024 }

هر ویژگی در شیء ویژگی vm.overrides هنگامی که PipeWire تشخیص دهد در یک ماشین مجازی اجرا می‌شود، ویژگی موجود در context.properties را بازنویسی می‌کند. این قابلیت منسوخ شده است، به جای آن از context.properties.rules استفاده کنید.

context.modules.allow-empty = false

به طور پیش‌فرض، هنگامی که هیچ context.modules بارگذاری نشده باشد، یک هشدار ثبت می‌شود زیرا این موضوع احتمالاً نشان‌دهنده یک مشکل است. برخی از برنامه‌ها ممکن است خودشان ماژول‌ها را بارگذاری کنند و وقتی این ویژگی را true تنظیم کنند، هیچ هشداری ثبت نخواهد شد.

ویژگی‌های زمینه ممکن است شامل مقادیر سفارشی نیز باشند. برای مثال، بخش‌های context.modules و context.objects می‌توانند شرایط اضافی را تعریف کنند که کنترل می‌کند آیا یک ماژول یا شیء بسته به ویژگی‌های موجود بارگذاری شود یا خیر.

افزونه‌های SPA بر اساس نام کارخانه (factory-name) بارگذاری می‌شوند. این یک نام شناخته‌شده است که ویژگی‌هایی را که افزونه باید داشته باشد به طور منحصربه‌فرد توصیف می‌کند. بخش context.spa-libs نگاشتی بین factory-name و افزونه‌ای که کارخانه در آن یافت می‌شود فراهم می‌کند.

نام‌های کارخانه می‌توانند شامل نویسه عام (Wildcard) باشند تا چندین کارخانه مرتبط را در یک افزونه گروه‌بندی کنند. افزونه از اولین factory-name تطبیق‌یافته بارگذاری می‌شود.

# ~/.config/pipewire/pipewire.conf.d/custom.conf
context.spa-libs = {
    audio.convert.* = audioconvert/libspa-audioconvert
    avb.*           = avb/libspa-avb
    api.alsa.*      = alsa/libspa-alsa
    api.v4l2.*      = v4l2/libspa-v4l2
    api.libcamera.* = libcamera/libspa-libcamera
    api.bluez5.*    = bluez5/libspa-bluez5
    api.vulkan.*    = vulkan/libspa-vulkan
    api.jack.*      = jack/libspa-jack
    support.*       = support/libspa-support
    video.convert.* = videoconvert/libspa-videoconvert
}

ماژول‌های PipeWire برای بارگذاری. libpipewire-modules(7) را ببینید.

# ~/.config/pipewire/pipewire.conf.d/custom.conf
context.modules = [
    #{ name = MODULENAME
    #    ( args  = { KEY = VALUE ... } )
    #    ( flags = [ ( ifexists ) ( nofail ) ] )
    #    ( condition = [ { KEY = VALUE ... } ... ] )
    #}
    #
]

name

نام ماژول برای بارگذاری.

args = { }

آرگومان‌های ارسال‌شده به ماژول.

flags = [ ]

پرچم‌های بارگذاری. ifexists برای بارگذاری ماژول تنها در صورت وجود، و nofail برای عدم توقف راه‌اندازی PipeWire در صورت ناموفق بودن بارگذاری ماژول.

condition = [ ]

یک شرط matches در قاعده تطبیق (Match rule). ماژول تنها در صورتی بارگذاری می‌شود که یکی از عبارت‌های موجود در آرایه با یک ویژگی زمینه مطابقت داشته باشد.

بخش context.objects به شما امکان می‌دهد اشیائی را از کارخانه‌ها بسازید (که معمولاً با بارگذاری ماژول‌ها در context.modules ایجاد می‌شوند).

# ~/.config/pipewire/pipewire.conf.d/custom.conf
context.objects = [
    #{ factory = <factory-name>
    #    ( args  = { <key> = <value> ... } )
    #    ( flags = [ ( nofail ) ] )
    #    ( condition = [ { <key> = <value> ... } ... ] )
    #}
]

این بخش می‌تواند برای ساخت گره‌ها یا پیوندها میان گره‌ها استفاده شود.

factory

نام کارخانه برای ایجاد شیء.

args = { }

آرگومان‌های ارسال‌شده به کارخانه.

flags = [ ]

پرچم nofail برای عدم توقف راه‌اندازی PipeWire در صورت ناموفق بودن بارگذاری شیء.

condition = [ ]

یک شرط matches در قاعده تطبیق (Match rule). شیء تنها در صورتی ایجاد می‌شود که یکی از عبارت‌های موجود در آرایه با یک ویژگی زمینه مطابقت داشته باشد.

این قطعه کد یک گره گرداننده ساختگی (Dummy driver node) جدید ایجاد می‌کند، اما فقط در صورتی که ویژگی core.daemon مقدار true داشته باشد:

# ~/.config/pipewire/pipewire.conf.d/custom.conf
context.objects = [
    { factory = spa-node-factory
      args = {
          factory.name    = support.node.driver
          node.name       = Dummy-Driver
          node.group      = pipewire.dummy
          priority.driver = 20000
      },
      condition = [ { core.daemon = true } ]
    }
]

از بخش context.exec می‌توان برای اجرای دستورات دلخواه به عنوان بخشی از مقداردهی اولیه برنامه PipeWire استفاده کرد.

# ~/.config/pipewire/pipewire.conf.d/custom.conf
context.exec = [
    #{   path = <program-name>
    #    ( args = "<arguments>" | [ <arg1> <arg2> ... ] )
    #    ( condition = [ { <key> = <value> ... } ... ] )
    #}
]

path

برنامه برای اجرا.

args

آرگومان‌های ارسال‌شده به برنامه.

condition

یک شرط matches در قاعده تطبیق (Match rule). شیء تنها در صورتی ایجاد می‌شود که یکی از عبارت‌های موجود در آرایه با یک ویژگی زمینه مطابقت داشته باشد.

قطعه کد زیر یک دستور pactl را با آرگومان‌های داده‌شده اجرا می‌کند:

# ~/.config/pipewire/pipewire.conf.d/custom.conf
context.exec = [
    { path = "pactl" args = "load-module module-always-sink" }
]

برخی از بخش‌های فایل پیکربندی شامل قواعد تطبیق هستند. این امکان را فراهم می‌کند که هنگام ایجاد یا به‌روزرسانی شیئی (معمولاً یک گره یا جریان) که با ویژگی‌های خاصی مطابقت دارد، عملیاتی انجام شود.

شیء کلی قواعد از الگوی زیر پیروی می‌کند:

<rules> = [
    {
        matches = [
            # هر یک از مجموعه‌های ویژگی زیر مطابقت داده می‌شوند،
            # اگر هر کدام تطبیق پیدا کند، عملیات‌ها اجرا می‌شوند
            {
                # <key> = <value>
                # تمام کلیدها باید با مقدار تطبیق داشته باشند. ! نفی می‌کند. ~ آغاز عبارت منظم است.
                #application.process.binary = "teams"
                #application.name = "~speech-dispatcher.*"
                # نبود ویژگی می‌تواند با مقایسه با null آزمایش شود
                #pipewire.sec.flatpak = null
            }
            {
                # تطبیق‌های بیشتر در اینجا...
            }
            ...
        ]
        actions = {
            <action-name> = <action value>
            ...
        }
    }
]

قواعد تطبیق یک آرایه از قواعد هستند.

یک قاعده همواره یک شیء JSON با دو کلید است: matches و actions. کلید matches برای تعریف شرایطی که باید برقرار شوند تا قاعده true ارزیابی شود به کار می‌رود، و کلید actions برای تعریف عملیاتی که در صورت ارزیابی قاعده به true انجام می‌شوند استفاده می‌گردد.

کلید matches همواره یک آرایه JSON از اشیاء است که در آن هر شیء شرطی را تعریف می‌کند که باید برقرار شود. هر شرط فهرستی از جفت‌های کلید-مقدار است که در آن کلید، نام ویژگی مورد تطبیق است و مقدار، مقداری است که ویژگی باید داشته باشد. در داخل یک شرط، تمام جفت‌های کلید-مقدار با AND منطقی با یکدیگر ترکیب می‌شوند، و تمام شرایط در آرایه matches با OR منطقی ترکیب می‌گردند.

کلید actions همواره یک شیء JSON است که در آن هر جفت کلید-مقدار، عملیاتی را تعریف می‌کند که هنگام ارزیابی قاعده به true انجام می‌شود. نام عملیات مخصوص آن قاعده است و توسط مستندات قاعده تعریف می‌شود، اما در بیشتر موارد عملیات update-props را مشاهده خواهید کرد که برای به‌روزرسانی ویژگی‌های شیء تطبیق‌یافته استفاده می‌شود.

در آرایه matches، استفاده از عبارات منظم (Regular expressions) برای تطبیق مقادیر ویژگی‌ها نیز امکان‌پذیر است. برای مثال، برای تطبیق تمام گره‌هایی که نام آن‌ها با my_ شروع می‌شود، می‌توانید از شرط زیر استفاده کنید:

matches = [
  {
    node.name = "~my_.*"
  }
]

نویسه ~ نشان می‌دهد که مقدار یک عبارت منظم است. نحو دقیق عبارات منظم، نحو عبارات منظم توسعه‌یافته POSIX است، همان‌طور که در صفحه راهنمای regex (7) شرح داده شده است.

علاوه بر عبارات منظم، می‌توانید از نویسه ! برای نفی یک شرط نیز استفاده کنید. برای مثال، برای تطبیق تمام گره‌هایی که نام آن‌ها با my_ شروع نمی‌شود، می‌توانید از شرط زیر استفاده کنید:

matches = [
  {
    node.name = "!~my_.*"
  }
]

نویسه ! را می‌توان با یا بدون عبارت منظم استفاده کرد. برای مثال، برای تطبیق تمام گره‌هایی که نام آن‌ها برابر با my_node نیست، می‌توانید از شرط زیر استفاده کنید:

matches = [
  {
    node.name = "!my_node"
  }
]

مقدار null معنای خاصی دارد؛ این مقدار بررسی می‌کند که آیا ویژگی در دسترس نیست (یا تنظیم نشده است). برای بررسی اینکه آیا یک ویژگی تنظیم نشده است:

matches = [
  {
    node.name = null
  }
]

برای بررسی وجود یک ویژگی، می‌توان از شرط !null استفاده کرد، برای مثال:

matches = [
  {
    node.name = "!null"
  }
  {
    node.name = !null            # نحو ساده‌شده
  }
]

برای کار با رشته "null"، باید رشته را گریزدهی (Escape) کرد. برای مثال، برای بررسی اینکه آیا یک ویژگی مقدار رشته‌ای "null" دارد، از عبارت زیر استفاده کنید:

matches = [
  {
    node.name = "null"
  }
]

برای کار با هر مقداری به جز رشته "null"، از عبارت زیر استفاده کنید:

matches = [
  {
    node.name = "!\"null\""
  }
  {
    node.name = !"null"      # نحو ساده‌شده
  }
]

از context.properties.rules می‌توان برای به‌روزرسانی پویای ویژگی‌ها بر اساس سایر ویژگی‌ها استفاده کرد.

یک حالت متداول، به‌روزرسانی تنظیمات سفارشی در هنگام اجرا درون یک ماشین مجازی (VM) است. مقدار cpu.vm.name هنگام اجرا در یک ماشین مجازی به طور خودکار با نام VM تنظیم می‌شود. می‌توان یک قاعده تطبیق برای تنظیم ویژگی‌های سفارشی به این صورت نوشت:

# ~/.config/pipewire/pipewire.conf.d/custom.conf
context.properties.rules = [
    {   matches = [ { cpu.vm.name = !null } ]
        actions = {
            update-props = {
                # این بازنویسی‌ها فقط هنگام اجرا در یک ماشین مجازی اعمال می‌شوند.
                default.clock.min-quantum = 1024
            }
        }
    }
}

گزینه node.rules هر بار که ویژگی‌های یک گره تنظیم یا به‌روزرسانی می‌شوند ارزیابی می‌گردد. این ویژگی را می‌توان در سمت سرور برای بازنویسی ویژگی‌های تنظیم‌شده توسط کلاینت روی گره‌های دلخواه استفاده کرد.

بخش node.rules یک عملیات update-props فراهم می‌کند که شیئی شامل ویژگی‌هایی که باید روی شیء گره به‌روزرسانی شوند را دریافت می‌کند.

یک بخش node.rules را مانند زیر به فایل پیکربندی اضافه کنید:

# ~/.config/pipewire/pipewire.conf.d/custom.conf
node.rules = [
    {
        matches = [
            {
                # تمام کلیدها باید با مقدار تطبیق داشته باشند. ! نفی می‌کند. ~ آغاز عبارت منظم است.
                client.name = "jack_simple_client"
            }
        ]
        actions = {
            update-props = {
                node.force-quantum = 512
            }
        }
    }
]

این کار ویژگی node.force-quantum مربوط به jack_simple_client را به 512 تنظیم می‌کند.

گزینه device.rules هر بار که ویژگی‌های یک دستگاه تنظیم یا به‌روزرسانی می‌شوند ارزیابی می‌گردد. این ویژگی را می‌توان در سمت سرور برای بازنویسی ویژگی‌های تنظیم‌شده توسط کلاینت روی دستگاه‌های دلخواه استفاده کرد.

بخش device.rules یک عملیات update-props فراهم می‌کند که شیئی شامل ویژگی‌هایی که باید روی شیء دستگاه به‌روزرسانی شوند را دریافت می‌کند.

یک بخش device.rules را مانند زیر به فایل پیکربندی اضافه کنید:

# ~/.config/pipewire/pipewire.conf.d/custom.conf
device.rules = [
    {
        matches = [
            {
                # تمام کلیدها باید با مقدار تطبیق داشته باشند. ! نفی می‌کند. ~ آغاز عبارت منظم است.
                device.name = ""v4l2_device.pci-0000_00_14.0-usb-0_1.2_1.0
            }
        ]
        actions = {
            update-props = {
                device.description = "My Webcam"
            }
        }
    }
]

این کار ویژگی device.description دستگاه با device.name داده‌شده را به "My Webcam" تنظیم می‌کند.

توسعه‌دهندگان پایپ‌ویر (The PipeWire Developers) https://gitlab.freedesktop.org/pipewire/pipewire/issues؛ پایپ‌ویر در https://pipewire.org در دسترس است.

pipewire(1), pw-mon(1), libpipewire-modules(7) pipewire-pulse.conf(5) pipewire-client.conf(5)

1.6.8 PipeWire