الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

الملفات الصوتية وحواسيب الكف

مغلق
بدأه بن العيد في 8 نوفمبر 2007 · 4 رد · 2,233 مشاهدة · في برمجة الأجهزة الكفية والمحمولة بالدوت نيت
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

سأحاول في هذا الموضوع شرح كيفية التعامل مع الملفات الصوتية وما يتعلق بها من مكتبات خارجية و تعديل في مستوى الصوت وغير ذلك.

post-91400-1194466269_thumb.jpg

الطريقة الأولى

تشغيل الصوت يكون بإعتماد الدالة 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);

ملاحظة: البرنامج غير كامل ويحتاج الكثير من التعديل.

WMAplayer.zip

الطريقة الثانية

الطريقة الثانية تتمثل في إعتماد المكتبة 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.zip

الطريقة الرابعة

تماثل هذه الطريقة سابقتها ولكن دون الحاجة المكتبةInterop.WMPLib.dllإنما يكفي إضافة المكتبة c:\windows\system32\wmp.dll عبر الإختيار Project->Add Reference...

وبذلك تتمكن أيضا من تشغيل ملفات الفيديو

يوجد طرق أخرى مثل إعتماد الدالةSndPlaySync لحواسيب الكف من جيل 2005 وما يليه وغيرها.

#2

شكرا اخي على هذا الشرح الوافي وكمعلومة اضافية يمكن تشغيل اكثر انواع الملفات عن طريق استخدام WMPLib مثلا MP3

جديد مدونتي الشخصية http://www.badwi.com

ادعو لنا بظاهر الغيب

MyBooksExchange.jpg

#3
اقتباس
شكرا اخي على هذا الشرح الوافي وكمعلومة اضافية يمكن تشغيل اكثر انواع الملفات عن طريق استخدام WMPLib مثلا MP3
اقتباس
الطريقة الثالثة لتشغيل الملفات الصوتية بإعتماد المكتبةInterop.WMPLib.dll هذه المكتبة هي إحدى توابع ال Windows Media Player

:P

#4

:) لم انتبه لوجود طريقة ثالثة ورابعة

جديد مدونتي الشخصية http://www.badwi.com

ادعو لنا بظاهر الغيب

MyBooksExchange.jpg

#5

السلام عليكم

راجع أيضا Waveform Audio

هذا الموضوع مغلق.

مواضيع مشابهة