السلام عليكم
سأحاول في هذا الموضوع شرح كيفية التعامل مع الملفات الصوتية وما يتعلق بها من مكتبات خارجية و تعديل في مستوى الصوت وغير ذلك.
الطريقة الأولى
تشغيل الصوت يكون بإعتماد الدالة WCE_PlaySound التي تأخذ إسم الملف الصوتي كمدخل رئيسي في حال التشغيل من البداية أو نص فارغ إذا أردنا إيقاف الصوت. المدخل الأخير للدالة يحدد كيفية القراءة: بشكل متزامن أم لا, إعادة القراءة وغير ذلك من الأنماط التي تم جمعها في القائمة Flags.
إذا أردنا التشغيل في جزء معين من الملف أو إثر التعطيل يمكن إستعمال الدالة WCE_PlaySoundBytesالتي تماثل الدالة السابقة لكن تأخذ كمدخل رئيسي مصفوفة من البايت.
كلتا الدالتان معرفتان في المكتبةCoredll.dll ويتم إستدعائهما بالطريقة التالية:
[DllImport("CoreDll.DLL", EntryPoint = "PlaySound", SetLastError = true)]
private extern static int WCE_PlaySound(string szSound, IntPtr hMod, int flags);
[DllImport("CoreDll.DLL", EntryPoint = "PlaySound", SetLastError = true)]
private extern static int WCE_PlaySoundBytes(byte[] szSound, IntPtr hMod, int flags);بهذه الكيفية نستدعي الدالتان اللتان عرفناهما مع ضرورة التأكد من وجود الملف الصوتي في المسار المحدد ونوعيته .wav
if (m_fileName != null) WCE_PlaySound(m_fileName, IntPtr.Zero, (int)(Flags.SND_ASYNC | Flags.SND_FILENAME)); else WCE_PlaySoundBytes(m_soundBytes, IntPtr.Zero, (int)(Flags.SND_ASYNC | Flags.SND_MEMORY));
WCE_PlaySound(m_fileName, IntPtr.Zero, (int)Flags.SND_LOOP);
بإعتماد الدالةWCE_PlaySound نستطيع تشغيل الملف الصوتي بكيفية متكررة عبر التعديل المناسب في المدخل الثالث للدالة
private enum Flags
{
SND_SYNC = 0x0000, /* play synchronously (default) */
SND_ASYNC = 0x0001, /* play asynchronously */
SND_NODEFAULT = 0x0002, /* silence (!default) if sound not found */
SND_MEMORY = 0x0004, /* pszSound points to a memory file */
SND_LOOP = 0x0008, /* loop the sound until next sndPlaySound */
SND_NOSTOP = 0x0010, /* don't stop any currently playing sound */
SND_NOWAIT = 0x00002000, /* don't wait if the driver is busy */
SND_ALIAS = 0x00010000, /* name is a registry alias */
SND_ALIAS_ID = 0x00110000, /* alias is a predefined ID */
SND_FILENAME = 0x00020000, /* name is file name */
SND_RESOURCE = 0x00040004 /* name is resource name or atom */
}نأتي الآن إلى الإطلاع وتعديل إعدادات الصوت لحاسوب الكف/المحاكي الدالتان waveOutSetVolume و waveOutGetVolume تمكنان من ذلك ويمكن تعريفهما بالكيفية التالية:
[DllImport("coredll.dll", SetLastError = true)]
public static extern int waveOutSetVolume(IntPtr device, int volume);
[DllImport("coredll.dll", SetLastError = true)]
public static extern int waveOutGetVolume(IntPtr device, ref int volume);تم تحديد مختلف مستويات الصوت بثوابت ترجعها الدالةwaveOutGetVolume وتيسر للمبرمج التعديل بالكيفية التي تناسبه. هذه قائمة مستويات الصوت:
public enum Volumes : int
{ OFF = 0,
LOW = 858993459,
NORMAL = 1717986918,
MEDIUM = -1717986919,
HIGH = -858993460,
VERY_HIGH = -1
}وبهذه الكيفية تتم ترجمة تلك الثوابت الى مجالات بسيطة الفهم و التعديل:
public static Volumes Volume
{ get
{ int v = (int)0;
waveOutGetVolume(IntPtr.Zero, ref v);
switch (v)
{ case (int)Volumes.OFF: return Volumes.OFF;
case (int)Volumes.LOW: return Volumes.LOW;
case (int)Volumes.NORMAL: return Volumes.NORMAL;
case (int)Volumes.MEDIUM: return Volumes.MEDIUM;
case (int)Volumes.HIGH: return Volumes.HIGH;
case (int)Volumes.VERY_HIGH: return Volumes.VERY_HIGH;
default: return Volumes.OFF;
}
}وأخيرا مثال بسيط حول تغير مستوى الصوت للجهاز/المحاكي
waveOutSetVolume(IntPtr.Zero, 100);
ملاحظة: البرنامج غير كامل ويحتاج الكثير من التعديل.
الطريقة الثانية
الطريقة الثانية تتمثل في إعتماد المكتبة fmodce.dll
في الملف المرفق مثال حول التعامل مع الملفات الصوتية مطور بال VB.Net وقد نسخت المثال من هذا الرابط
Simple_MP3_Player_for_PPC_src.zip
الطريقة الثالثة
الطريقة الثالثة لتشغيل الملفات الصوتية بإعتماد المكتبةInterop.WMPLib.dll هذه المكتبة هي إحدى توابع ال Windows Media Player
التشغيل يكون بالكيفية التالية:
WMPLib.WindowsMediaPlayer player = new WMPLib.WindowsMediaPlayer(); // play player.controls.play(); // pause player.controls.pause(); // stop player.controls.stop(); //...
والمكتبة مرفقة في الملف التالي:
الطريقة الرابعة
تماثل هذه الطريقة سابقتها ولكن دون الحاجة المكتبةInterop.WMPLib.dllإنما يكفي إضافة المكتبة c:\windows\system32\wmp.dll عبر الإختيار Project->Add Reference...
وبذلك تتمكن أيضا من تشغيل ملفات الفيديو
يوجد طرق أخرى مثل إعتماد الدالةSndPlaySync لحواسيب الكف من جيل 2005 وما يليه وغيرها.
