آشنایی با کتابخانه صوتی OpenAL

مدتی قبل در جایی از یک برنامه نیاز به استفاده از صداها پیدا کردم. به همین دلیل به دنبال یک ‏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();//توقف کامل پخش فایل صوتی
برنامه‌نویس ++‏C/C‏ - برنامه‌نویس سیستم‌های گرافیکی با استفاده از کتابخانه ‏OpenGL - برنامه‌نویس #‏C و ..‏

2 thoughts on “آشنایی با کتابخانه صوتی OpenAL

  1. سلام. خسته نباشید.من وقتی ابن کد رو اجرا میکنم میگه در لود کردن داده ها خطا وجود داره .میشه راهنماییم کنید که چیکار باید بکنم؟

    1. سلام
      متن کامل پیغام خطایی که دریافت میکنید رو برام بنویسید تا در صورت امکان راهنماییتون کنم

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

14 − سیزده =

Back To Top