SNDIOD(8) System Manager's Manual SNDIOD(8)

sndiod — سرور صدا و MIDI

sndiod [-d] [-a flag] [-b nframes] [-C min:max] [-c min:max] [-e enc] [-F device] [-f device] [-j flag] [-L addr] [-m mode] [-Q port] [-q port] [-r rate] [-s name] [-t mode] [-U unit] [-v volume] [-w flag] [-z nframes]

دیمن sndiod یک لایه میانی بین برنامه‌های صوتی یا MIDI و سخت‌افزار است. این دیمن پردازش صوتی لازم را انجام می‌دهد تا به هر برنامه‌ای امکان دهد روی هر سخت‌افزار پشتیبانی‌شده‌ای کار کند. به طور پیش‌فرض، sndiod تنها اتصالات برنامه‌هایی را می‌پذیرد که روی همان سیستم اجرا می‌شوند؛ این دیمن تنها زمانی مقداردهی اولیه می‌شود که برنامه‌ها از خدمات آن استفاده می‌کنند، که به sndiod امکان می‌دهد در بقیه زمان‌ها مقدار ناچیزی از منابع سیستم را مصرف کند. سیستم‌های فاقد سخت‌افزار صوتی می‌توانند از sndiod استفاده کنند تا دستگاه‌های با قابلیت اتصال حین کار (hot-pluggable) را به صورت پیش‌فرض و تقریباً بدون هزینه فعال نگه دارند.

عملکرد sndiod به این صورت است: حداقل یک زیردستگاه (sub-device) ارائه می‌دهد که هر تعداد برنامه صوتی می‌توانند به آن متصل شوند و از آن به گونه‌ای استفاده کنند که گویی یک سخت‌افزار صوتی است. در حین پخش، sndiod داده‌های صوتی را به طور همزمان از تمام برنامه‌ها دریافت می‌کند، آن‌ها را میکس کرده و نتیجه را به دستگاه سخت‌افزاری ارسال می‌نماید. به طور مشابه، در حین ضبط، داده‌های صوتی ضبط‌شده از دستگاه را تکثیر کرده و به تمام برنامه‌ها ارسال می‌کند. از آنجا که داده‌های صوتی از طریق فرآیند sndiod جریان می‌یابند، این امکان وجود دارد که داده‌های صوتی را در لحظه پردازش کند:

  • تغییر کدگذاری صدا برای غلبه بر ناسازگاری‌های بین نرم‌افزار و سخت‌افزار.
  • هدایت صدا از یک کانال به کانال دیگر، ادغام استریو یا تقسیم مونو.
  • کنترل بلندی صدای پخش به ازای هر برنامه و همچنین کنترل بلندی صدای اصلی (مستر).
  • نظارت بر صدای در حال پخش، که به یک برنامه اجازه می‌دهد آنچه برنامه‌های دیگر پخش می‌کنند را ضبط کند.

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

دیمن sndiod جعبه‌های عبور MIDI (هاب‌ها) را ارائه می‌دهد، که به برنامه‌ها امکان می‌دهد پیام‌های MIDI را به روشی یکپارچه برای یکدیگر یا به درگاه‌های سخت‌افزاری MIDI ارسال کنند.

در نهایت، sndiod یک درگاه کنترل MIDI را در دسترس قرار می‌دهد که برای موارد زیر قابل استفاده است:

  • کنترل میزان بلندی صدا.
  • منبع ساعت مشترک برای برنامه‌های صوتی و MIDI.
  • شروع، توقف و تغییر مکان گروه‌هایی از برنامه‌های صوتی.

گزینه‌ها به شرح زیر هستند:

flag
کنترل می‌کند که آیا sndiod دستگاه صوتی یا درگاه MIDI را تنها در صورت نیاز باز کند یا آن را همیشه باز نگه دارد. اگر پرچم on باشد، دستگاه صوتی یا درگاه MIDI همیشه باز نگه داشته می‌شود و اطمینان حاصل می‌شود که هیچ برنامه دیگری نمی‌تواند آن را در اختیار بگیرد. اگر پرچم off باشد، به طور خودکار بسته می‌شود و به برنامه‌های دیگر اجازه می‌دهد دسترسی مستقیم به دستگاه صوتی داشته باشند، یا دستگاه قطع شود. مقدار پیش‌فرض off است.
nframes
اندازه بافر دستگاه صوتی بر حسب فریم. یک فریم شامل یک نمونه (sample) برای هر کانال در جریان است. این تعداد فریم‌هایی است که قبل از پخش بافر می‌شوند و بنابراین تأخیر پخش را کنترل می‌کند. پیش‌فرض 7680 یا دو برابر اندازه بلوک (-z) در صورت تنظیم بودن اندازه بلوک است.
min:max, -c min:max
محدوده شماره کانال‌ها به ترتیب برای جهت‌های ضبط و پخش که هر کلاینتی مجاز به استفاده از آن است. این زیرمجموعه‌ای از کانال‌های دستگاه صوتی است. پیش‌فرض 0:1 است، یعنی استریو.
فعال کردن اشکال‌زدایی در خروجی خطای استاندارد و عدم جداسازی از ترمینال کنترل‌کننده. می‌تواند چندین بار برای افزایش بیشتر پرگویی لاگ مشخص شود.
enc
تلاش برای پیکربندی دستگاه جهت استفاده از این کدگذاری. پیش‌فرض s16 است. نام‌های کدگذاری از طرح زیر استفاده می‌کنند: علامت‌دار بودن (s یا u) به همراه دقت بر حسب بیت، ترتیب بایت (le یا be) ، تعداد بایت در هر نمونه، و تراز (msb یا lsb) . تنها علامت‌دار بودن و دقت اجباری هستند. مثال‌ها: u8 ، s16le ، s24le3 ، s24le4lsb .
device
همانند -f است با این تفاوت که اگر دستگاه قطع شود، دستگاهی که با گزینه قبلی -f یا -F داده شده است استفاده خواهد شد.
device
افزودن این دستگاه صوتی sndio(7) به دستگاه‌های مورد استفاده برای پخش و/یا ضبط. گزینه‌های قبلی مربوط به هر دستگاه (-aberwz) برای این دستگاه اعمال می‌شوند. زیردستگاه‌هایی (-s) که بعد از آن اعمال می‌شوند به این دستگاه متصل خواهند شد. حالت دستگاه و پارامترها از زیردستگاه‌های متصل به آن تعیین می‌شوند. اگر هیچ گزینه -f استفاده نشود، sndiod از rsnd/0 ، rsnd/1 ، ... ، rsnd/3 استفاده خواهد کرد.
flag
کنترل می‌کند که آیا در صورتی که تعداد کانال‌های درخواستی توسط یک برنامه با تعداد کانال‌های دستگاه برابر نباشد، کانال‌های برنامه ادغام یا گسترش یابند یا خیر. اگر پرچم off باشد، کانال‌های کلاینت به کانال متناظر در دستگاه هدایت می‌شوند و احتمالاً کانال‌هایی که در دستگاه وجود ندارند دور ریخته می‌شوند. اگر پرچم on باشد، یک کانال منفرد کلاینت ممکن است روی چندین کانال دستگاه ارسال شود، یا چندین کانال کلاینت به یک کانال منفرد دستگاه فرستاده شوند. برای مثال، این ویژگی می‌تواند برای تبدیل مونو به استریو استفاده شود. پیش‌فرض on است.
addr
مشخص کردن نشانی شبکه محلی که sndiod باید روی آن گوش فرا دهد؛ sndiod روی درگاه TCP به شماره 11025+n گوش خواهد داد، که در آن n شماره واحد مشخص‌شده با -U است. بدون این گزینه، sndiod تنها روی سوکت دامنه UNIX گوش می‌دهد و از هیچ شبکه‌ای قابل دسترسی نیست. اگر آرگومان گزینه ‘-’ باشد، در این صورت sndiod اتصالات را از هر نشانی خواهد پذیرفت. از آنجا که ارتباط امن نیست، این گزینه تنها برای شبکه‌های محلی که تمام میزبان‌ها و کاربران آن معتمد هستند مناسب است.
mode
تنظیم حالت زیردستگاه. حالت‌های معتبر عبارتند از play ، rec و mon ، متناظر با پخش، ضبط و نظارت (monitoring). جریان نظارت یک جریان ضبط ساختگی متناظر با میکس تمام جریان‌های پخش است. می‌توان چندین حالت را با کاما جدا کرد، اما نمی‌توان از یک زیردستگاه برای هر دو مورد ضبط و نظارت استفاده نمود. پیش‌فرض play,rec است (یعنی تمام‌دوطرفه یا full-duplex).
port
مشخص کردن یک درگاه MIDI جایگزین برای استفاده. اگر کار نکند، درگاهی که با آخرین گزینه‌های -Q یا -q داده شده است استفاده خواهد شد. به عنوان مثال، این اجازه می‌دهد یک کنترل‌کننده USB MIDI بدون نیاز به راه‌اندازی مجدد برنامه‌های استفاده‌کننده از آن جایگزین شود.
port
در دسترس قرار دادن درگاه MIDI داده‌شده. این به چندین برنامه اجازه می‌دهد درگاه را به اشتراک بگذارند. اگر هیچ گزینه -q استفاده نشود، sndiod از rmidi/0 ، rmidi/1 ، ... ، rmidi/7 استفاده خواهد کرد.
rate
تلاش برای اجبار دستگاه جهت استفاده از این نرخ نمونه‌برداری بر حسب هرتز. پیش‌فرض 48000 است.
name
افزودن name به فهرست زیردستگاه‌های در دسترس. این به کلاینت‌ها اجازه می‌دهد به جای دستگاه صوتی فیزیکی از sndiod برای ورودی و خروجی صدا استفاده کنند تا دستگاه فیزیکی را با سایر کلاینت‌ها به اشتراک بگذارند. تعریف چندین زیردستگاه اجازه می‌دهد یک دستگاه صوتی فیزیکی به زیردستگاه‌هایی با ویژگی‌های متفاوت (مانند محدوده‌های کانال) تقسیم شود. نام داده‌شده name متناظر با بخش “گزینه” از رشته نام دستگاه sndio(7) است.
mode
انتخاب روشی که کلاینت‌ها توسط پیام‌های MIDI Machine Control (MMC) دریافت شده توسط sndiod کنترل می‌شوند. اگر حالت off باشد (پیش‌فرض)، برنامه‌ها تحت تأثیر پیام‌های MMC قرار نمی‌گیرند. اگر حالت slave باشد، برنامه‌ها به طور همگام با پیام‌های شروع MMC راه‌اندازی می‌شوند؛ علاوه بر این، ساعت سرور به عنوان پیام‌های MIDI Time Code (MTC) ارائه می‌شود که به نرم‌افزارها یا سخت‌افزارهای با قابلیت MTC اجازه می‌دهد با برنامه‌های صوتی همگام شوند.
unit
شماره واحد. هر نمونه از سرور sndiod یک شماره واحد منحصربه‌فرد دارد که در نام‌های دستگاه sndio(7) استفاده می‌شود. پیش‌فرض 0 است.
volume
میزان تضعیف نرم‌افزاری بلندی صدای پخش. مقدار باید بین 1 تا 127 باشد، متناظر با تضعیف -42dB تا -0dB در گام‌های 1/3dB. کلاینت‌ها این پارامتر را به ارث می‌برند. کاهش بلندی صدا از قبل به بلندی صدای کلاینت اجازه می‌دهد تا زمانی که تعداد کلاینت‌ها به اندازه کافی کم است، مستقل از تعداد آن‌ها باقی بماند. 18 واحد بلندی صدا (یعنی تضعیف -6dB) اجازه می‌دهد تعداد برنامه‌های پخش دو برابر شود. پیش‌فرض 127 است.
flag
کنترل رفتار sndiod هنگامی که حداکثر بلندی صدای سخت‌افزار حاصل شده و یک برنامه جدید شروع به پخش می‌کند. این مورد تنها زمانی اتفاق می‌افتد که بلندی صدا با استفاده از گزینه -v به درستی تنظیم نشده باشد. اگر پرچم on باشد، بلندی صدای اصلی (مستر) به طور خودکار تنظیم می‌شود تا از اعوجاج و برش صدا (clipping) جلوگیری گردد. پیش‌فرض off است.
nframes
اندازه بلوک دستگاه صوتی بر حسب فریم. این تعداد فریم‌های بین تیک‌های ساعت صوتی است، یعنی دقت ساعت. اگر یک زیردستگاه با گزینه -t ایجاد شود و MTC برای همگام‌سازی استفاده گردد، دقت ساعت باید 96، 100 یا 120 تیک در ثانیه برای حداکثر دقت باشد. به عنوان مثال، 100 تیک در ثانیه در فرکانس 48000Hz متناظر با اندازه بلوک 480 فریم است. پیش‌فرض 480 یا نصف اندازه بافر (-b) در صورت تنظیم اندازه بافر است.

در خط فرمان، پارامترهای مربوط به هر دستگاه (-aberwz) باید قبل از تعریف دستگاه (-f) قرار گیرند، و پارامترهای مربوط به هر زیردستگاه (-Ccjmtvx) باید قبل از تعریف زیردستگاه (-s) قرار گیرند. تعاریف زیردستگاه (-s) باید پس از تعریف دستگاهی (-f) که به آن متصل می‌شوند بیایند.

اگر هیچ دستگاه صوتی (-f) مشخص نشود، تنظیمات به گونه‌ای اعمال می‌شوند که گویی دستگاه پیش‌فرض مشخص شده است. اگر هیچ زیردستگاهی (-s) برای یک دستگاه مشخص نشود، یک زیردستگاه پیش‌فرض متصل به آن ایجاد می‌شود. اگر یک دستگاه (-f) دو بار تعریف شود، هر دو تعریف ادغام می‌شوند: پارامترهای اولی استفاده می‌شوند اما زیردستگاه‌های (-s) هر دو تعریف ایجاد می‌گردند. دستگاه پیش‌فرض sndio(7) استفاده‌شده توسط sndiod عبارت است از rsnd/0 ، و زیردستگاه پیش‌فرض ارائه‌شده توسط sndiod عبارت است از snd/default .

اگر برای sndiod سیگنال SIGINT یا SIGTERM ارسال شود، خاتمه می‌یابد. اگر سیگنال SIGHUP ارسال شود، تمام دستگاه‌های صوتی و درگاه‌های MIDI را مجدداً باز می‌کند.

به طور پیش‌فرض، هنگامی که برنامه نمی‌تواند داده‌های ضبط‌شده را به اندازه کافی سریع بپذیرد یا نمی‌تواند داده‌ها را برای پخش به اندازه کافی سریع ارائه دهد، برنامه متوقف (pause) می‌شود، یعنی نمونه‌هایی که نمی‌توان نوشت دور ریخته می‌شوند و نمونه‌هایی که نمی‌توان خواند با سکوت جایگزین می‌گردند. اگر یک زیردستگاه با گزینه -t ایجاد شود، نمونه‌های ضبط‌شده دور ریخته می‌شوند، اما به محض رفع انسداد برنامه، همان مقدار سکوت نوشته خواهد شد تا به موقعیت زمانی صحیح برسد. به طور مشابه سکوت پخش می‌شود، اما به محض رفع انسداد برنامه همان مقدار از نمونه‌ها دور ریخته خواهد شد. این امر همگام‌سازی مناسب بین برنامه‌ها را تضمین می‌کند.

دیمن sndiod یک درگاه MIDI با همان نام زیردستگاه صوتی ارائه‌شده ایجاد می‌کند که برنامه‌های MIDI می‌توانند به آن متصل شوند. sndiod ساعت دستگاه صوتی را در دسترس قرار می‌دهد و اجازه می‌دهد ویژگی‌های دستگاه صوتی از طریق MIDI کنترل شوند.

یک کانال MIDI به هر جریان اختصاص می‌یابد و بلندی صدا با استفاده از کنترل‌کننده استاندارد صدا (شماره 7) تغییر می‌کند. به طور مشابه، هنگامی که کلاینت صوتی بلندی صدای خود را تغییر می‌دهد، همان پیام کنترل‌کننده MIDI به بیرون ارسال می‌شود؛ به عنوان مثال می‌تواند برای نظارت یا به عنوان بازخورد برای فیدرهای موتوری استفاده شود.

بلندی صدای اصلی را می‌توان با استفاده از پیام سیستمی انحصاری استاندارد master volume تغییر داد.

جریان‌های ایجادشده با گزینه -t توسط پیام‌های MMC زیر کنترل می‌شوند:

relocate
این پیام توسط کلاینت‌های صوتی sndiod نادیده گرفته می‌شود، اما موقعیت زمانی داده‌شده به عنوان یک پیام MTC “full frame” به درگاه‌های MIDI ارسال می‌شود و تمام دستگاه‌های تابع MTC را وادار به تغییر مکان به موقعیت داده‌شده می‌کند (به زیر مراجعه کنید).
start
تمام جریان‌ها را در حالت شروع قرار می‌دهد. در این حالت، sndiod منتظر می‌ماند تا تمام جریان‌ها برای شروع آماده شوند، و سپس آن‌ها را به طور همگام شروع می‌کند. پس از شروع، جریان‌های جدیدی می‌توانند ایجاد شوند (sndiod) اما تا انتقال بعدی از stop به start مسدود خواهند شد.
stop
تمام جریان‌ها را در حالت متوقف‌شده قرار می‌دهد (پیش‌فرض). در این حالت، هر جریانی که قصد شروع پخش یا ضبط را داشته باشد متوقف می‌شود. جریان‌های کلاینت که از قبل شروع شده‌اند تحت تأثیر قرار نمی‌گیرند تا زمانی که متوقف شوند و مجدداً تلاش کنند شروع شوند.

جریان‌های ایجادشده با گزینه -t ساعت دستگاه sndiod را با استفاده از MTC صادر می‌کنند، که اجازه می‌دهد نرم‌افزارها یا سخت‌افزارهای غیرصوتی با جریان صوتی همگام شوند. حداکثر دقت زمانی به دست می‌آید که تعداد بلوک‌ها در هر ثانیه با یکی از نرخ‌های استاندارد ساعت MTC (یعنی 96، 100 و 120 هرتز) برابر باشد. نرخ‌های نمونه‌برداری (-r) و اندازه‌های بلوک (-z) زیر توصیه می‌شوند:

  • 44100Hz،‏ 441 فریم (نرخ MTC برابر 100Hz است)
  • 48000Hz،‏ 400 فریم (نرخ MTC برابر 120Hz است)
  • 48000Hz،‏ 480 فریم (نرخ MTC برابر 100Hz است)
  • 48000Hz،‏ 500 فریم (نرخ MTC برابر 96Hz است)

به عنوان مثال، دستور زیر دو دستگاه ایجاد خواهد کرد: دستگاه پیش‌فرض snd/default و یک دستگاه تحت کنترل MIDI به نام snd/mmc:

$ sndiod -r 48000 -z 400 -s default -t slave -s mmc

جریان‌های متصل به snd/default به طور عادی رفتار می‌کنند، در حالی که جریان‌های متصل به snd/mmc منتظر سیگنال شروع MMC مانده و به طور همگام شروع به کار می‌کنند. صرف نظر از اینکه یک جریان به کدام دستگاه متصل است، پیچ تنظیم بلندی صدای پخش آن در دسترس قرار دارد.

اگر دستگاه‌های مشخص‌شده با -F در صورت نیاز در دسترس نباشند یا در حین اجرا جدا شوند، sndiod تلاش خواهد کرد تا به طور یکپارچه به آخرین دستگاه مشخص‌شده بازگردد.

دیمن sndiod به طور خودکار به دستگاه مشخص‌شده‌ای که در حین اجرا متصل شده است تغییر وضعیت نمی‌دهد. در عوض، باید از sndioctl(1) برای تغییر کنترل server.device استفاده شود.

به عنوان مثال، مشخص کردن یک دستگاه USB با -F به دنبال یک دستگاه PCI با -f به sndiod اجازه می‌دهد هنگام اتصال دستگاه USB ترجیحاً از آن استفاده کند و هنگام قطع شدن به دستگاه PCI بازگردد.

راه‌اندازی سرور با استفاده از پارامترهای پیش‌فرض، ایجاد یک زیردستگاه اضافی برای خروجی به کانال‌های 2:3 تنها (بلندگوهای عقب در اکثر کارت‌ها)، و در دسترس قرار دادن دستگاه‌های snd/default و snd/rear:

$ sndiod -s default -c 2:3 -s rear

راه‌اندازی سرور برای ایجاد زیردستگاه پیش‌فرض با بلندی صدای کم و یک زیردستگاه اضافی برای خروجی با بلندی صدای زیاد، و در دسترس قرار دادن دستگاه‌های snd/default و snd/max:

$ sndiod -v 65 -s default -v 127 -s max

راه‌اندازی سرور برای پیکربندی دستگاه صوتی جهت استفاده از فرکانس نمونه‌برداری 48kHz، اندازه بلوک 240 فریم، و بافرهای 2 بلوکی. تأخیر متناظر 10 میلی‌ثانیه است، یعنی زمانی که طول می‌کشد تا صدا 3.5 متر منتشر شود.

$ sndiod -r 48000 -b 480 -z 240

sndio(7)

نمونه‌برداری مجدد (resampling) کیفیت پایینی دارد؛ به ویژه از کاهش نرخ نمونه‌برداری (down-sampling) هنگام ضبط باید اجتناب شود.

اگر -a off استفاده شود، sndiod ابتدا زیردستگاه‌ها را برای ارائه ایجاد می‌کند و سپس سخت‌افزار صوتی را در صورت تقاضا باز می‌کند. از نظر فنی، این به sndiod اجازه می‌دهد تا تلاش کند از یکی از زیردستگاه‌هایی که خود ارائه می‌دهد به عنوان یک دستگاه صوتی استفاده کند، که باعث ایجاد بن‌بست (deadlock) می‌شود. هیچ چیزی وجود ندارد که مانع از آسیب زدن کاربر به خود با ایجاد چنین بن‌بستی شود.

September 26, 2026 Linux 6.12.107+deb13-amd64