الشبكة العربية لمطوري الألعاب

خبير مشرف مؤيد مارديني هذه المشاركة مميزة مشاركة 1

سألخص في هذا الموضوع بعض طرق تشغيل الأصوات , و سأذكر كل طريقة باللغات Visual Basic .NET و #C و أحياناً بـ Visual Basic 6.0 :
----------
الطريقة الأولى : و هي الطريقة التي لا أفضلها شخصياً و تكون بالاعتماد على الـ API.
طبعاً هذه الطريقة لها الكثير من الثوابت سأذكر أربعة منها فقط :
****
أولاً : عن طريق اللغة الأشهر محلياً (Visual Basic 6) :
التعريف عنها يكون عادةً هكذا :
Private Declare Function PlaySound Lib "winmm.dll" _
Alias "PlaySoundA" (ByVal Name As String, ByVal hMod As Long, _
ByVal Flags As Long) As Long

و استخدامها هكذا :
PlaySound "C:\InStructurez.wav", 0, SND_FILENAME Or SND_ASYNC

و أشهر الثوابت التي تستخدمها يعلن عنها هكذا :
Const SND_SYNC = &H0          ' play synchronously
Const SND_ASYNC = &H1         ' play asynchronously
Const SND_FILENAME = &H20000  ' name is file name
Const SND_RESOURCE = &H40004  ' name is resource name or atom

أي يصبح الكود :
Const SND_SYNC = &H0           ' play synchronously
Const SND_ASYNC = &H1          ' play asynchronously
Const SND_FILENAME = &H20000   ' name is file name
Const SND_RESOURCE = &H40004   ' name is resource name or atom
Private Declare Function PlaySound Lib "winmm.dll" _
Alias "PlaySoundA" (ByVal Name As String, ByVal hMod As Long, _
ByVal Flags As Long) As Long
Private Sub Form_Load()
PlaySound "C:\InStructurez.wav", 0, SND_FILENAME Or SND_ASYNC
End Sub

****
ثانياً : عن طريق Visual Basic .NET :
التعريف عنها يكون عادة هكذا :
Declare Auto Function PlaySound Lib "winmm.dll" (ByVal Name _
As String, ByVal hMod As Integer, ByVal Flags As Integer) As Integer

و أشهر الثوابت التي تستخدمها يعلن عنها هكذ :
Public Const SND_SYNC = &H0          ' play synchronously
Public Const SND_ASYNC = &H1         ' play asynchronously
Public Const SND_FILENAME = &H20000  ' name is file name
Public Const SND_RESOURCE = &H40004  ' name is resource name or atom

و تشغيل الصوت يكون بهذه الطريقة :
PlaySound("C:\InStructurez.wav", Nothing, SND_FILENAME Or SND_ASYNC)

مثال (من MSDN) :
Public Class SoundClass
   Declare Auto Function PlaySound Lib "winmm.dll" (ByVal name _
      As String, ByVal hmod As Integer, ByVal flags As Integer) As Integer
   ' name specifies the sound file when the SND_FILENAME flag is set.
   ' hmod specifies an executable file handle.
   ' hmod must be Nothing if the SND_RESOURCE flag is not set.
   ' flags specifies which flags are set. 

   ' The PlaySound documentation lists all valid flags.
   Public Const SND_SYNC = &H0          ' play synchronously
   Public Const SND_ASYNC = &H1         ' play asynchronously
   Public Const SND_FILENAME = &H20000  ' name is file name
   Public Const SND_RESOURCE = &H40004  ' name is resource name or atom

   Public Sub PlaySoundFile(ByVal filename As String)
      ' Plays a sound from filename.
      PlaySound(filename, Nothing, SND_FILENAME Or SND_ASYNC)
   End Sub
End Class

Private Sub Button1_Click(ByVal sender As System.Object, _
      ByVal e As System.EventArgs) Handles Button1.Click
   Dim SoundInst As New SoundClass()
   SoundInst.PlaySoundFile("C:\ringout.wav")
End Sub

****
ثالثاً : عن طريق #C :
التعريف عنها يكون عادةً هكذا :
[System.Runtime.InteropServices.DllImport("winmm.DLL", 
EntryPoint = "PlaySound", SetLastError = true)]
private static extern bool PlaySound(string Name,
int hMod, int Flags);

و الثوابت :
const int SND_SYNC = 0x0000;          // play synchronously
const int SND_ASYNC = 0x0001;         // play asynchronously
const int SND_FILENAME = 0x00020000;  // name is file name
const int SND_RESOURCE = 0x00040004;  // name is resource name or atom

و الاستعمال هكذا :
PlaySound(@"C:\InStructurez.wav", 0, SND_SYNC);

مثال (من MSDN أيضاً) :
using System.Windows.Forms;

namespace WinSound
{
    public partial class Form1 : Form
    {
        private TextBox textBox1;
        private Button button1;

        public Form1()  //constructor
        {
            InitializeComponent();
        }

        [System.Runtime.InteropServices.DllImport("winmm.DLL",
        EntryPoint = "PlaySound", SetLastError = true)]
        private static extern bool PlaySound(string szSound, System.IntPtr hMod,
        PlaySoundFlags flags);

        [System.Flags] 
        public enum PlaySoundFlags : int
        {
            SND_SYNC = 0x0000,
            SND_ASYNC = 0x0001, 
            SND_NODEFAULT = 0x0002, 
            SND_LOOP = 0x0008, 
            SND_NOSTOP = 0x0010,
            SND_NOWAIT = 0x00002000, 
            SND_FILENAME = 0x00020000, 
            SND_RESOURCE = 0x00040004 
        }

        private void button1_Click (object sender, System.EventArgs e)
        {
            OpenFileDialog dialog1 = new OpenFileDialog(); 

            dialog1.Title = "Browse to find sound file to play";
            dialog1.InitialDirectory = @"c:\";
            dialog1.Filter = "Wav Files (*.wav)|*.wav";
            dialog1.FilterIndex = 2;
            dialog1.RestoreDirectory = true;

            if(dialog1.ShowDialog() == DialogResult.OK) 
            { 
                textBox1.Text = dialog1.FileName;
                PlaySound (dialog1.FileName, new System.IntPtr(),
 PlaySoundFlags.SND_SYNC);
            } 
        }
    }
}

****
----------
الطريقة الثانية : و تكون بالاعتماد على .NET Framework 2.0 حصراً , هذه الطريقة مفضلة و ممتازة إذا كنت تريد تشغيل صوت بسهولة و بدون متطلبات إضافية :
****
أولاً : عن طريق Visual Basic .NET :
الطريقة سهلة جداً و لا تحتاج لأي شرح , يمكن أن تتم بسطرين من الكود , هكذا :
Dim PlaySoundTest As New System.Media.SoundPlayer("C:\InStructurez.wav")
PlaySoundTest.Play()

****
ثانياً : عن طريق #C :
كما ذكرت الطريقة بسيطة جداً و تتم هكذا :
System.Media.SoundPlayer PlaySoundTest = 
new System.Media.SoundPlayer(@"C:\InStructurez.wav");
PlaySoundTest.Play();

****
----------
الطريقة الثالثة و الأخيرة و هي بالاعتماد على الـ DirecX , طريقة جيدة و لكنها تحتاج إعداد DirectX SDK على جهازك .
طبعاً عليك هنا استخدام مكتبات DirectX و بشكل خاص AudioVideoPlayback , الطريقة بسيطة أيضاً و تتلخص بما يلي :
****
أولاً : عن طريق Visual Basic .NET :
Dim PlaySoundTest As New _
Microsoft.DirectX.AudioVideoPlayback.Audio("C:\InStructurez.wav")
PlaySoundTest.Play()

****
ثانياً : عن طريق #C :
Microsoft.DirectX.AudioVideoPlayback.Audio PlaySoundTest =
new Microsoft.DirectX.AudioVideoPlayback.Audio(@"C:\InStructurez.wav");
PlaySoundTest.Play();

****
----------
تم تجريب جميع الأمثلة والكودات باستخدام Microsoft Visual Studio 6.0 و Microsoft Visual Studio 2005.
شكراً لقراءتك الموضوع,
Moayad Mardini

Moayad Mardini,
MSDN Forums Moderator

محترف مشرف عبد اللطيف حاجي علي مشاركة 2

جميل جداًّ... لكن ألا ترى معي أن المكان الأفضل لـ "مقالتك" هو في قسم الـ "مقالات" العلمية؟ مما يذكرني بضرورة تصنيف المقالات العلمية بحسب المستوى بالإضافة للمجال...

عبد اللطيف حاجي علي
مبرمج
In|Framez

خبير مشرف مؤيد مارديني مشاركة 3

التعليق على مشاركة Abdo Haji-Ali في Dec 16, 2005 2:31 :

> جميل جداًّ... لكن ألا ترى معي أن المكان الأفضل لـ "مقالتك"
> هو في قسم الـ "مقالات" العلمية؟ مما يذكرني بضرورة تصنيف
> المقالات العلمية بحسب المستوى بالإضافة للمجال...

لا مشكلة على الإطلاق في أن ينقل الإداريون الموضوع إلى قسم المقالات العلمية (على العكس أنا أحبذ ذلك), ما رأيكم ؟

شكراً
Moayad Mardini

Moayad Mardini,
MSDN Forums Moderator

خبير مدير وسام البهنسي مشاركة 4

كلا. هي ليست بالطول اللازم أو بحاجة لتنسيق معقد أو الكثير من الصور... مشاركة رائعة☺
طبعاً منتديات المبتدئين هي للأسئلة بالدرجة الأولى، ولكننا نرحب تماماً بمثل هذه المشاركات التعليمية... أنتم رائعون!

وسام البهنسي
مبرمج في إنفيديا وإنفريمز

خبير  أحمد عبد الغني مشاركة 5

> الطريقة الثالثة و الأخيرة و هي بالاعتماد على الـ DirecX ,
> طريقة جيدة و لكنها تحتاج إعداد DirectX SDK على جهازك

كلا لا تحتاج إلى إعداد الـ DirectX SDK كي يعمل برنامجك الذي يستخدم هذه الميزة. أنت بحاجة للتأكد من وجود الـ Managed DirectX Runtime وهو يتم تثبيته مع الـ DirectX SDK طبعاً، لكن عندما تريد نشر برنامجك، فلا تنشر الـ SDK طبعاً، وإنما ملف مكتبة الـ MDX فقط طبعاً (يتم إعداده وقت الـ setup بشكل مفضل)...

اللهم انصر أهلنا في فلسطين وآجرنا أن نكون عوناً لهم

خبير مشرف مؤيد مارديني مشاركة 6

التعليق على مشاركة أحمد عبد الغني في Dec 16, 2005 11:29 :
> كلا لا تحتاج إلى إعداد الـ DirectX SDK
> كي يعمل برنامجك الذي يستخدم هذه الميزة. أنت بحاجة للتأكد
> من وجود الـ Managed DirectX Runtime وهو يتم تثبيته
> مع الـ DirectX SDK طبعاً، لكن عندما تريد نشر برنامجك،
> فلا تنشر الـ SDK طبعاً، وإنما ملف مكتبة الـ MDX فقط
> طبعاً (يتم إعداده وقت الـ setup بشكل مفضل)...

قصدت من ذلك إعداد الـ SDK على جهازك و ليس على جهاز المستخدم
شكرا للمعلومة☺


التعليق على مشاركة وسام البهنسي في Dec 16, 2005 11:29 :
> طبعاً منتديات المبتدئين
> هي للأسئلة بالدرجة الأولى، ولكننا نرحب تماماً بمثل
> هذه المشاركات التعليمية... أنتم رائعون!

شكراً☺

Moayad Mardini

Moayad Mardini,
MSDN Forums Moderator

خبير  سعيد بسيوني مشاركة 7

ولتكتمل الصورة هزه الطريقة لتشغيل الأصوات من برنامج ++C. هناك أكثر من طريقة. منها الإجراء نفسه الذي زكره الأخ مؤيد في الـ VB6 :
BOOL PlaySound(LPCSTR pszSound,HMODULE hmod,DWORD fdwSound);

وهو معلن عنه في ملف الترويسة mmsystem.h وتحتاج إلى الربط مع المكتبة الستاتيكية winmm.lib كيف يتم بناء البرنامج من غير أخطاء. الأعلام (flags) الممكن تمريرها للبارامتر الأخير أيضا معرفة في ملف الترويسة نفسه ولها نفس القيم التي وضحتها يا مؤيد. مثال على نداء الإجراء:
#include 
int main(void)
{
	PlaySound("myfile.wav",NULL,SND_FILENAME|SND_ASYNC);
	return 0;
}

أيضا هناك الإجراء sndPlaySound وهو مبني على PlaySound. أما إن كنا نتحدث عن DirectX في الـ ++C فالموضوع بحاجة إلى كود طويل بجد.
ومن الجدير بالزكر ان من بين هزه الإجراءات كلها فإن فقط وحدة Microsoft.DirectX.AudioVideoPlayback.Audio تستطيع تشغيل ملفات أصوات بهيئات غير wav (مثلا mp3 أو adpcm wav) بسبب كون هزه الوحدة تعتمد على خدمات DirectShow ربنا يرحمه☺

خبير مشرف مؤيد مارديني مشاركة 8

شكراً يا أستاذ سعيد على هذه الإضافة التي أغنت الموضوع !
بالمناسبة شكراً لكم لاعتبار الموضوع "مشاركة مميزة"

Moayad Mardini

Moayad Mardini,
MSDN Forums Moderator

  mohamed hussien مشاركة 9

شكرا لهذه المعلومات القيمه هليمكن أرسالها الي الايميل
mohamedhussien
Add code here...

خبير مدير وسام البهنسي مشاركة 10

طبعاً... فقط حدد النص في المشاركة وقم بنسخه ثم لصقه في محتوى الرسالة ثم أرسلها لمن تريد (لنفسك كذلك)... هل هذا ما كنت تسأل عنه؟☺

وسام البهنسي
مبرمج في إنفيديا وإنفريمز