أخيرا حل مشكلة الصوت مع OpenAL مثال بسيط يصلح كأساس لإستخدام المكتبة

الناقل : elmasry | الكاتب الأصلى : basha2002 | المصدر : www.arabteam2000-forum.com

بسم الله الرحمن الرحيم
بفضل من الله, و بعيدا عن الإتجاهات المغرضة التي تحث على إحتكار العلم :) أقدم لكم هذا الكود الذي يعد أشبه ببيئة أساسية لدمج نافذة مع مكتبة OpenAL الصوتية من خلال دوال الـAPI, ولأن ضيق الوقت لم يمكنني من ضبط مقالة جيدة فيها شرح كامل للكود, فإنني سوف أضع الملاحظات التالية.

* هذا الكود في حقيقته ما هو إلا عملية دمج بين إحدى دروس الـAPI الخاصة بالويندوز و بين إحدى دروس مكتبة OpenAL الصوتية, أما وصلات الدروس الأصلية فهي كالتالي:
http://winprog.org/tutorial/files/forgers-...rial-arabic.zip
http://www.devmaster.net/articles
* لكي يعمل هذا الدرس معك يجب أن تقوم بتثبيت مكتبة OpenAL كالتالي:
وضع الملفات الديناميكية ".dll" إما في نفس المكان الذي به الملف التنفيذي ".exe" و إما في ملفات النظام "system".
وضع ملفات المكتبة ".lib" في الملف "lib".
وضع الملفات الرأسية "header"في ملف واحد أسمه "AL" و وضعه في الملف "Include", و ذلك مراعاة لترتيب مسارات وضع الملفات الرأسية.

* بالنسبة للكود ذاته لى الملاحظات التالية:
على الرغم من الوضع الصحيح لملفات المكتبة, إلا أنه قد تجد المترجم يعطيك الخطأ الشهير "Link2001" و الذي يعني عدم العثور على ملفات المكتبة, عموما للتغلب على تلك المشكلة يتم وضع السطران التاليان لعمل نوع من الإتصال الإجباري و المباشر بالمكتبة.

#pragma comment (lib, "OpenAL32.lib")
#pragma comment (lib, "ALut.lib")

________________________________________________________________________________
__
و الآن ركز معي في السطور التالية:

        
        ShowWindow(hwnd, nCmdShow);
        UpdateWindow(hwnd);

                                alutInit(NULL, 0);       //أساسيات مكتبة الصوت
                                LoadALData();             //تحميل بيانات الصوت
        SetListenerValues(); //بيانات الشخص المستمع
          alSourcePlay(Source); //دالة تشغيل الصوت
        alGetError();             //دالة إيجاد الأخطاء

1.السطر alutInit إذا ما تم كتابته قبل ShowWindow , فإن الصوت سيعمل في نفس اللحظة التي ستظهر فيها النافذة, و السر في ذلك هو تعريف أساسيات الصوت قبل أن يتم رسم النافذة, أما إن ظل هذا السطر كما هو في مكانه, فإنه بعد ظهور النافذة سيتم الإنتظار بمعدل ثانية تقريبا كي يتم التعرف على مشغل الصوت ثم يظهر الصوت بعدها.

2.يجب أن تجئ أساسيات الصوت و تحميل بيانات الصوت كما في الترتيب الذي بالأعلى, بعدها لا يهم ترتيب السطور الثلاث التالية.

3.كلا من الدالتين alutInit و alutExit ما هما إلا إختصار لبيانات كثيرة كان عليك كتابتها, و الفضل لذلك يرجع لمكتبة ALUT و التي هي مكافئة لمكتبة GLUT في عملها, فهي توفر عليك الوقت و الجهد في كتابة دوال المقدمة و النهاية و تختصرهما لك في دالة واحدة بسيطة, عموما لمن يريد الدوال الأصلية لمكتبة OpenAL فهي كالتالي:
________________________________________________________________________________
__
دوال المقدمة
        //initialize OpenAL

        //Open device
        Device = alcOpenDevice((ALubyte*)"DirectSound3D");

        if (Device == NULL)
        {
                //we failed to initialize the device
                exit(-1);
        }

        //Create context(s)
        Context=alcCreateContext(Device,NULL);
        //Set active context
        alcMakeContextCurrent(Context);

_______________________________________________________________________________

دوال النهاية
        // Shutdown
        //Get active context
        Context=alcGetCurrentContext();
        //Get device for active context
        Device=alcGetContextsDevice(Context);
        //Disable context
        alcMakeContextCurrent(NULL);
        //Release context(s)
        alcDestroyContext(Context);
        //Close device
        alcCloseDevice(Device);

_______________________________________________________________________________

و في النهاية أحب أن أنوه إلى أن هذا الكود ما هو إلا محصلة إجتماع بين مكتبة OpenAL الأصلية و بين مكتبة الدوال الصوتية المختصرة ALUT و لذا يجب عليك تحميل االأثنين معا حتى ترى نتيجة مرضية, كل شئ ستحجده في الموقع الرسمي:
http://www.openal.com

و أي أستفسار أنا في الخدمة.
و السلام ختام
 
ملف مرفق(ملفات)
 
ملف مرفق  My_OpenAL_First.rar (62.04كيلو )