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.