Delphi / DirectSound / DirectShow / Audio Visualization

Audio Player؛ پروژه آموزشی پخش و نمایش صدا با Delphi

Audio Player یک پروژه دسکتاپ ویندوزی با Delphi است که فایل صوتی را decode و پخش می‌کند، شکل موج صدا را نشان می‌دهد، spectrum analyzer و VU meter زنده دارد و چند افکت صوتی DirectSound را روی صدا اعمال می‌کند.

این سورس برای یادگیری برنامه‌نویسی صوتی در Delphi آماده شده است؛ یعنی تمرکز آن روی قابل‌خواندن بودن کد، build ساده‌تر، استفاده از کنترل‌های استاندارد VCL و حذف نیاز به نصب کامپوننت‌های اضافی است.

اسکرین‌شات برنامه Audio Player در ویندوز
زبانDelphi / Object Pascal
رابط کاربریVCL
پخش صداDirectSound
خواندن فایلDirectShow + Sample Grabber
تست‌شده باDelphi 7 و RAD Studio 13
دانلودسورس کامل پروژه

این برنامه چه کار می‌کند؟

  • فایل‌های صوتی WAV و بسیاری از فایل‌های MP3 را در ویندوز باز و پخش می‌کند.
  • فایل صوتی را به PCM تبدیل می‌کند و داده آماده پخش را داخل DirectSound buffer قرار می‌دهد.
  • شکل موج فایل صوتی را نمایش می‌دهد و امکان zoom روی waveform دارد.
  • موقع پخش، spectrum analyzer زنده با FFT داخلی نمایش می‌دهد.
  • سطح صدای چپ و راست را با VU meter شبیه LED نشان می‌دهد.
  • کنترل‌های پخش مثل Play، Stop، موقعیت پخش، Volume، Pan و Frequency را در اختیار کاربر می‌گذارد.
  • افکت‌های DirectSound مثل Chorus، Compressor، Distortion، Echo، Flanger، Gargle، ParamEQ و Reverb را فعال یا غیرفعال می‌کند.

چرا این پروژه برای یادگیری خوب است؟

این پروژه فقط یک player ساده نیست. داخل آن چند بخش واقعی از برنامه‌نویسی صوتی ویندوز را کنار هم می‌بینید: خواندن فایل صوتی، decode کردن به PCM، ساخت DirectSound buffer، رسم waveform، محاسبه FFT برای spectrum، نمایش VU meter و کنترل چند افکت صوتی.

سورس پروژه طوری مرتب شده که برای اجرا نیاز به نصب Graphics32، dspFFT، پلاگین جداگانه یا کامپوننت اختصاصی نداشته باشد. بیشتر بخش‌های نمایشی با VCL استاندارد، TPaintBox و bitmap off-screen انجام شده‌اند تا هم قابل فهم باشند و هم در Delphiهای قدیمی‌تر بهتر کار کنند.

راهنمای کامپایل

فایل ZIP شامل سورس برنامه، فرم اصلی، unitهای کمکی، فایل‌های پروژه و پوشه DirectX9 است. فایل اصلی پروژه DSTest.dpr است.

کامپایل با Delphi 7

Delphi 7 به‌صورت پیش‌فرض headerهای لازم DirectX/DirectShow را ندارد. برای همین پوشه DirectX9 داخل بسته قرار داده شده است. قبل از build این مسیر را به Library Path اضافه کنید:

Tools → Environment Options → Library → Library Path

Add:
<project folder>\DirectX9

بعد از اضافه کردن مسیر، فایل DSTest.dpr را باز کنید و پروژه را build کنید.

کامپایل با RAD Studio جدید

پروژه با RAD Studio 13 هم تست شده است. برای خروجی قابل پیش‌بینی‌تر، target را روی Win32 بگذارید. اختلاف امضای IDirectSoundBuffer.Lock بین headerهای قدیمی و جدید با unit کوچک DSoundCompat.pas مدیریت شده است، بنابراین کد اصلی نیاز به تغییر دستی در پارامترهای Lock ندارد.

برای تست اولیه، اول یک فایل WAV یا MP3 کوتاه انتخاب کنید. بعد از مطمئن شدن از build و playback، فایل‌های طولانی‌تر را امتحان کنید.

داخل سورس چه چیزهایی می‌بینید؟

  • MainUnit.pas: منطق اصلی فرم، کنترل‌های پخش، رسم waveform، VU meter، spectrum و مدیریت افکت‌ها.
  • AudioReader.pas: لایه ساده‌تر برای خواندن فایل صوتی و تحویل دادن داده PCM به برنامه.
  • cbAudioFileRead.pas: reader داخلی پروژه با DirectShow graph، Sample Grabber callback و pre-allocation برای گرفتن PCM.
  • DSoundCompat.pas: wrapper کوچک برای سازگاری DirectSound buffer locking بین Delphi قدیمی و RAD Studio جدید.
  • SimpleFFT.pas: پیاده‌سازی سبک FFT برای نمایش spectrum analyzer.
  • ReSample.pas: تبدیل ساده sample rate/channel format در مواقع لازم.

نکات فنی

  • MP3/WAV ابتدا توسط DirectShow خوانده و به PCM تبدیل می‌شود؛ سپس DirectSound برای playback استفاده می‌شود.
  • برای جلوگیری از کندی در decode فایل‌های چند دقیقه‌ای، buffer خروجی قبل از شروع decode تقریباً pre-allocate می‌شود.
  • VU meter و spectrum بیشتر برای نمایش زنده و جذاب صدا طراحی شده‌اند، نه اندازه‌گیری دقیق آزمایشگاهی.
  • افکت‌ها از قابلیت‌های DirectSound استفاده می‌کنند و ممکن است رفتار آن‌ها بسته به ویندوز، driver و پشتیبانی سیستم کمی فرق کند.

محدودیت‌ها

  • برنامه کل audio decode شده را در حافظه نگه می‌دارد؛ برای همین برای فایل‌های خیلی طولانی طراحی نشده است. برای استفاده راحت، فایل‌های کمتر از حدود ۶ تا ۷ دقیقه پیشنهاد می‌شوند.
  • پشتیبانی MP3 به DirectShow filters نصب‌شده روی ویندوز وابسته است. بیشتر MP3های معمولی کار می‌کنند، اما بعضی فایل‌ها ممکن است به خاطر encoding یا filter chain سیستم باز نشوند.
  • این پروژه آموزشی است و قرار نیست جایگزین playerهای کامل و تجاری مثل VLC یا foobar2000 باشد.
  • برای بیشترین سازگاری، فایل WAV/PCM ساده بهترین گزینه تست است.