في MCI، إعداد كارت الصوت للعمل

This article is available in English too, check it out here.

في درس سابق تكلمنا عن كيفية إنشاء مسجل صوتي بالـ C والـ C# وتكلمنا عن كيفية تجهيز كارت الصوت للعمل وكيفية التسجيل وتشغيل الملفات الصوتية.

وقد استقبلنا العديد من الآراء والأسئلة من القراء ورأينا أننا أهملنا نقطة هامة في شرح هذا الموضوع وهي كيفية إعداد كارت الصوت (هذا مصطلح عام نقصد به Multimedia Input/Output Devices كما تعرف)، إعداد خصائصه.

واليوم نستكمل في هذا الموضوع عن كيفية تحديد الخصائص مثل قوة القناة الصوتية Channel، حجم الصوت Volume، المعدل Sampling Rate وغيرها للـ Device المستخدم.

مثل جميع الأوامر الأخرى الخاصة بـ MCI، لتحديد خصائص الـ Device يجب عليك استخدام إما أمر نصي String أو رقمي Command، وفي موضوعنا هذا فإننا نستخدم الأخيرة، فلذلك سوف نستخدم الأمر الرقمي الخاص بتحديد خصائص الـ Device ألا وهو MCI_SET.

يستخدم الأمر MCI_SET لتحديد خصائص الـ Device وبياناته. وبما أن كل Device له الخصائص الخاصة به (مثلا الفيديو يختلف عن الصوت) فإن مدخلات الأمر MCI_SET تختلف بدورها.

لن نخرج عن سياق موضوعنا الأصلي والذي يتكلم عن الصوتيات (عمليات الـ Waveform) فقط. ولذلك فإننا سنستخدم المدخل MCI_WAVE_SET_PARMS والذي يستخدم مع الصوتيات Waveform والذي له التكوين التالي:

typedef struct {
  DWORD_PTR dwCallback;
  DWORD     dwTimeFormat;
  DWORD     dwAudio;
  UINT      wInput;
  UINT      wOutput;
  WORD      wFormatTag;
  WORD      wReserved2;
  WORD      nChannels;
  WORD      wReserved3;
  DWORD     nSamplesPerSec;
  DWORD     nAvgBytesPerSec;
  WORD      nBlockAlign;
  WORD      wReserved4;
  WORD      wBitsPerSample;
  WORD      wReserved5;
} MCI_WAVE_SET_PARMS;

هذا التركيب Structure يحوي جميع البيانات التي يمكنك تحديدها للـ Device المطلوب، للبساطة والاختصار لن نفصل في شرح العناصر الخاصة بهذا التركيب ولكن يمكنك فهم فائدة هذه العناصر وكيفية تحديدها من خلال فقط قراءة أسمائها. وإذا احتجت معلومات أكثر يمكنك القراءة في شرح الـ MSDN لـ MCI_WAVE_SET_PARMS Structure.

كما تعرف، إذا كنت تستخدم لغة خاصة بالدوت نت مثل الـ C# فإنك لن يمكنك استخدام هذا التركيب مباشرة في برنامجك لأنه خاص ببرمجة الويندوز Windows API. ولذلك ستحتاج إلى عملية Marshaling أي عملية تحويل هذا التركيب ليصبح قابل للتعامل معه من خلال بيئة الدوت نت. وهذا هو الـ Marshaling Structure لهذا التركيب في C#:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct MCI_WAVE_SET_PARMS
{
  public IntPtr dwCallback;
  public uint     dwTimeFormat;
  public uint     dwAudio;
  public uint      wInput;
  public uint      wOutput;
  public ushort      wFormatTag;
  public ushort      wReserved2;
  public ushort      nChannels;
  public ushort      wReserved3;
  public uint     nSamplesPerSec;
  public uint     nAvgBytesPerSec;
  public ushort      nBlockAlign;
  public ushort      wReserved4;
  public ushort      wBitsPerSample;
  public ushort      wReserved5;
}

الآن أصبحت جاهزا لكتابة الكود الخاص بك (تحتاج إلى المساعدة؟ راجع هذا الدرس.)

عرفت كيفية تحديد الخصائص للـ MCI Device. ماذا عن كيفية استرجاع هذه البيانات؟ هل تتذكر في الموضوع الرئيسي كيف كنا نسترجع حالة الـ Device (يعمل، يقوم بالتسجيل، متوقف مؤقتا، متوقف، غير جاهز للعمل، إلخ)؟

بالطبع تتذكرها وتتذكر الأمر الذي استخدمناه هناك وهو MCI_STATUS والذي يستخدم لمعرفة الحالة وجميع البيانات الخاصة بهذا الـ Device (ولكننا قد تكلمنا وقتها عن كيفية استرجاع الحالة فقط.)

باستخدام الخيار MCI_STATUS_ITEM مع الأمر MCI_STATUS وباستخدام خيارات الاستعلام مثل MCI_DGV_STATUS_VOLUME (للاستعلام عن حجم الصوت) يمكنك استرجاع جميع البيانات التي قمت بتحديدها باستخدام الأمر MCI_SET.

المزيد عن الأمر MCI_STATUS اقرأ القسم ’الحالة Status‘ في موضوعنا الأصلي. المزيد؟ اقرأ في MSDN عن MCI_STATUS Command.

اترك تعليقا

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

شعار ووردبريس.كوم

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   /  تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   /  تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   /  تغيير )

Connecting to %s