مدتی قبل در جایی از یک برنامه نیاز به استفاده از صداها پیدا کردم. به همین دلیل به دنبال یک API قوی و در عین حال ساده برای وارد کردن صداها در برنامم گشتم. نتایج بررسی هام منتهی شد به آشنا شدنم با کتابخانه جالب و قدرتمند (OpenAL (Open Audio Library
با استفاده از این کتابخانه شما میتونید از صداها در برنامه هاتون به راحتی استفاده کنید. میتونید هر جایی که لازم بود فایلی صوتی رو پخش یا پخش اون رو متوقف کنید.
البته طبق توضیحاتی که در معرفی این کتابخانه آورده شده OpenAL قابلیت های زیادی برای کار با صداها به صورت حرفه ای (به طور مثال ساخت بازی ها) داره اما برای من که نیاز به تنظیمات خاصی روی صدا در برنامم نداشتم هم بسیار خوب و قابل استفاده بود.
نکته بسیار مثبت دیگه ای هم که برای من داشت شباهت شکلی و ساختاری بسیار زیادش با کتابخانه گرافیکی OpenGL بود. در حقیقت در ساخت OpenAL از شیوه ساخت و نامگذاری OpenGL الهام گرفته شده و میتونه کامل کننده این کتابخانه باشه.
مزیت مهم دیگه ی این API کراس پلتفرم (cross-platform) بودن اونه و میتونید کدهای نوشته شده در به طور مثال ویندوز را عینا در لینوکس نیز کامپایل و اجرا کنید.
این کتابخانه به مانند OpenGL با زبان C نوشته شده اما در مورد اینکه در چه زبان های به غیر از C/C++ قابل استفاده است تحقیقی نکردم.
برای اینکه بتونید با فایل های صوتی درون برنامتون با راحتی بیشتری کار کنید و نیازی به برنامه نویسی سطح پایین برای لود فایل ها نداشته باشید میتونید کتابخانه تکمیلی ALUT رو هم دانلود و نصب کنید.
در این لینک تمام کتابخانه ها و فایل های مورد نیاز برای نصب OpenAL در پلتفرمهای مختلف برای دانلود وجود داره. همچنین اگر از اوبونتو استفاده میکنید میتوانید از طریق مخازن آن OpenAL و ALUT را به راحتی نصب و راه اندازی نمایید. (مخازن توزیع های دیگر را جستجو نکردم ولی به احتمال قوی در مخازن توزیع های دیگر هم موجود باشند)
بعد از نصب میتوانید از این کد برای آشنایی با OpenAL و تست کامپایل و اجرای اون استفاده نمایید.
من کد برنامه ی بالا رو با اندکی تغییرات به صورت object orienter درآوردم که استفاده از اون رو بسیار راحتتر میکنه:
// #include "stdafx.h" #include <iostream> using namespace std; #include <AL/al.h> #include <AL/alc.h> #include <AL/alut.h> class Sound { public: Sound(char* theFileName) { SourcePos[0] = 0.f; SourcePos[1] = 0.f; SourcePos[2]= 0.f; SourceVel[0] = 0.f; SourceVel[1] = 0.f; SourceVel[2] = 0.f; ListenerPos[0] = 0.f; ListenerPos[1] = 0.f; ListenerPos[2] = 0.f; ListenerVel[0] = 0.f; ListenerVel[1] = 0.f; ListenerVel[2] = 0.f; ListenerOri[0] = 0.f; ListenerOri[1] = 0.f; ListenerOri[2] = -1.f; ListenerOri[3] = 0.f; ListenerOri[4] = 1.f; ListenerOri[5] = 0.f; // Load the wav data. if(LoadALData(theFileName) == AL_FALSE) //method 1: LoadALData() { printf("Error loading data."); //return 0; } SetListenerValues(); //method 2: void SetListenerValues() } /* ~Sound() We have allocated memory for our buffers and sources which needs to be returned to the system. This function frees that memory. */ ~Sound() { alDeleteBuffers(1, &Buffer); alDeleteSources(1, &Source); alutExit(); } void play()const{ alSourcePlay(Source); } void pause()const{ alSourcePause(Source); } void stop()const{ alSourceStop(Source); } ALuint getSource(){ return Source; } private: /* ALboolean LoadALData() This function will load our sample data from the disk using the Alut utility and send the data into OpenAL as a buffer. A source is then also created to play that buffer. */ ALboolean LoadALData(char* theFileName) { // Variables to load into. ALenum format; ALsizei size; ALvoid* data; ALsizei freq; ALboolean loop; // Load wav data into a buffer. alGenBuffers(1, &Buffer); if(alGetError() != AL_NO_ERROR) return AL_FALSE; // Load any of your favourite wav song here alutLoadWAVFile( (ALbyte*)(theFileName), &format, &data, &size, &freq, &loop); alBufferData(Buffer, format, data, size, freq); alutUnloadWAV(format, data, size, freq); // Bind the buffer with the source. alGenSources(1, &Source); if(alGetError() != AL_NO_ERROR) return AL_FALSE; alSourcei (Source, AL_BUFFER, Buffer ); alSourcef (Source, AL_PITCH, 1.0 ); alSourcef (Source, AL_GAIN, 1.0 ); alSourcefv(Source, AL_POSITION, SourcePos); alSourcefv(Source, AL_VELOCITY, SourceVel); alSourcei (Source, AL_LOOPING, true ); // Do another error check and return. if(alGetError() == AL_NO_ERROR) return AL_TRUE; return AL_FALSE; } /* void SetListenerValues() We already defined certain values for the Listener, but we need to tell OpenAL to use that data. This function does just that. */ void SetListenerValues() { alListenerfv(AL_POSITION, ListenerPos); alListenerfv(AL_VELOCITY, ListenerVel); alListenerfv(AL_ORIENTATION, ListenerOri); } ALuint Buffer; // Buffers to hold sound data. ALuint Source; // Sources are points of emitting sound. ALfloat SourcePos[3]; // Position of the source sound. ALfloat SourceVel[3]; // Velocity of the source sound. ALfloat ListenerPos[3]; // Position of the Listener. ALfloat ListenerVel[3]; // Velocity of the Listener. ALfloat ListenerOri[6]; // Orientation of the Listener. (first 3 elements are "at", second 3 are "up") // Also note that these should be units of '1'. }; int main(int argc, char *argv[]) { // Initialize OpenAL and clear the error bit. alutInit(NULL, 0); alGetError(); cout << "Play OpenAL waveform audio file" << endl; cout << "Type a character controls:" << endl; cout << "p) To Play" << endl; cout << "s) To Stop playing" << endl; cout << "h) To Hold / Pause playing" << endl; cout << "q) To Quit playing" << endl << endl; Sound alarmSound(""); // Loop. char c = ' '; while(c != 'q') { c = getchar(); switch(c) { // Pressing 'p' will begin playing the sample. case 'p': alarmSound.play(); break; // Pressing 's' will stop the sample from playing. case 's': alarmSound.stop(); break; // Pressing 'h' will pause the sample. case 'h': alarmSound.pause(); break; case 'q': exit(1); } } return 0; } //
میتونید کلاس Sound را در پروژه خودتون اضافه کنید و از خطوط زیر برای تعریف و استفاده از فایل های صوتی خودتون استفاده کنید. به این ترتیب:
Sound objSound("مسیر و نام کامل فایل صوتی از نوع ویو"); objSound.play();// پخش فایل صوتی ObjSound.pause();//نگهداشتن موقتی پخش فایل صوتی ObjSound.stop();//توقف کامل پخش فایل صوتی
سلام. خسته نباشید.من وقتی ابن کد رو اجرا میکنم میگه در لود کردن داده ها خطا وجود داره .میشه راهنماییم کنید که چیکار باید بکنم؟
سلام
متن کامل پیغام خطایی که دریافت میکنید رو برام بنویسید تا در صورت امکان راهنماییتون کنم