XAudio2の初期化&現状報告

お久しぶりです。EFです。

なかなかブログを書く気力がなく放置してました。
すみません。

いろいろあって学校を卒業して、今はアルバイトで働きながらニートしてます。


そういうことで最近触り始めたXAudio2の初期化を書きます。

その前に、XAudio2とは何ぞや?って人がいると思うので一言で説明すると、
「DirectSoundの後継」です。

XBOXとかあの辺と一緒になった感じだと思っていただければいいかと思います。(知識不足なので違うかもしれません)

そんなわけで以下は初期化コード。
事前にプロジェクトのVC++ディレクトリのインクルードディレクトリとライブラリディレクトリにDirectXのパスを通しておくこと。

// ----------------------------------include
#include <xaudio2.h>

// ----------------------------------global
IXAudio2*                g_pXAudio2 = nullptr;
IXAudio2MasteringVoice*  g_pXAudio2MasteringVoice = nullptr;

// ----------------------------------prototype
bool Init(); // 初期化関数
void Cleanup(); // 後処理関数

// エントリポイント
int main()
{
    if ( Init() )
    {
        // 初期化失敗
        Cleanup();
        return 1;
    }

    // 初期化成功
   
    
    // 後処理
    Cleanup();

    return 0;
}

// 初期化関数
bool Init()
{

    // COMライブラリ初期化
    if ( FAILED( CoInitializeEx( NULL, COINIT_MULTITHREADED ) ) )
    {
        return true;
    }

    // XAudio2のインスタンスを生成
    if ( FAILED( XAudio2Create( &g_pXAudio2, 0 ) ) )
    {
        return true;
    }

    // MasteringVoiceの生成
    if ( FAILED( g_pXAudio2->CreateMasteringVoice( &g_pXAudio2MasteringVoice ) ) )
    {
        return true;
    }

    return false;
}

// 後処理関数
void Cleanup()
{
    // MasteringVoiceが生成されていれば破棄
    if ( g_pXAudio2MasteringVoice != nullptr )
    {
        g_pXAudio2MasteringVoice->DestroyVoice();
        g_pXAudio2MasteringVoice = nullptr;
    }

    // XAudio2が生成されていれば破棄
    if ( g_pXAudio2 != nullptr )
    {
        g_pXAudio2->Release();
        g_pXAudio2 = nullptr;
    }

    // COMの破棄
    CoUninitialize();
}

コピペしてるわけではないので誤字があるかもしれません。
ちょっとだけ綺麗に書くように心がけてみました。
HRESULTでエラーを返すようなことはしてませんが、その辺がわかる人はちゃんと返しましょう。


今回はここまでです。お疲れ様でした。

OpenGL始めました

ラインで立方体描く!
マウス左ボタンで立方体が回転!
(ただのメモ書きなんて言えない…)

#include <stdlib.h>

#include <GL/glut.h>
#include <string>

using namespace std;

#define MAX_POINTS 100		// 記憶する点の数
GLint point[MAX_POINTS][2];	// 座標を記憶する配列
int pointNum = 0;		// 記憶した座標の数
int rubberBand = 0;		// ラバーバンドの消去

GLdouble vertex[][3] = 
{
	{ 0.0, 0.0, 0.0 }, 
	{ 1.0, 0.0, 0.0 }, 
	{ 1.0, 1.0, 0.0 }, 
	{ 0.0, 1.0, 0.0 }, 
	{ 0.0, 0.0, 1.0 }, 
	{ 1.0, 0.0, 1.0 }, 
	{ 1.0, 1.0, 1.0 }, 
	{ 0.0, 1.0, 1.0 }  
};

int edge[][2] = 
{
	{ 0, 1 },
	{ 1, 2 },
	{ 2, 3 },
	{ 3, 0 },
	{ 4, 5 },
	{ 5, 6 },
	{ 6, 7 },
	{ 7, 4 },
	{ 0, 4 },
	{ 1, 5 },
	{ 2, 6 },
	{ 3, 7 } 
};

void Display();
void Init();
void Resize(int w, int h);
void Mouse(int button, int state, int x, int y);
void Keybord(unsigned char key, int x, int y);
void Idle();

int main(int argc, char* argv[])
{
	string winName = "test window";

	// OpenGL初期化
	glutInit(&argc, argv);

	// ディスプレイの表示モード設定
	glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);

	// ウィンドウ生成
	glutInitWindowPosition(0, 0);
	glutInitWindowSize(400, 400);
	glutCreateWindow(winName.c_str());

	// ウィンドウが開かれたり、隠れて再び現れたりするとウィンドウを再描画する関数
	glutDisplayFunc(Display);

	// なにこれ
	glutReshapeFunc(Resize);

	// マウス
	glutMouseFunc(Mouse);

	// キーボード
	glutKeyboardFunc(Keybord);

	// アプリケーション初期化
	Init();

	// メインループ
	glutMainLoop();

	return 0;
}

void Display()
{
	// ウィンドウのクリア関数
	glClear(GL_COLOR_BUFFER_BIT);

	glLoadIdentity();
	
	// 視点位置と視線方向
	gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

	// 図形の回転
	static int rot = 0;
	glRotated((double)rot, 0.0, 1.0, 0.0);

	// 図形の描画
	glColor3d(0.0, 1.0, 0.0);
	glBegin(GL_LINES);
	for (int i = 0; i < 12; i++)
	{
		glVertex3dv(vertex[edge[i][0]]);
		glVertex3dv(vertex[edge[i][1]]);
	}
	glEnd();

	glutSwapBuffers();

	// 1周回ったら回転角を0に戻す
	if (++rot >= 360) rot = 0;
}

void Mouse(int button, int state, int x, int y)
{
	switch (button)
	{
	case GLUT_LEFT_BUTTON:
		if (state == GLUT_DOWN)
		{
			// アニメーション開始
			glutIdleFunc(Idle);
		}
		else
		{
			glutIdleFunc(0);
		}
		break;
	case GLUT_RIGHT_BUTTON:
		if (state == GLUT_DOWN)
		{
			glutPostRedisplay();
		}
		break;

	default:
		break;
	}
}

void Idle()
{
	glutPostRedisplay();
}

void Resize(int w, int h)
{
	glViewport(0, 0, w, h);

	// プロジェクション変換行列
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(30.0, (double)w / (double)h, 1.0, 100.0);

	// ビュー変換行列
	glMatrixMode(GL_MODELVIEW);
}


void Keybord(unsigned char key, int x, int y)
{
	switch (key)
	{
	case 'q':
	case 'Q':
	case '\033':	// '\033'はESCのASCIIコード
		exit(0);
	default:
		break;
	}
}

void Init()
{
	glClearColor(0.3, 0.3, 0.3, 1.0);
}

f:id:EorF:20151119020134p:plain

参考サイト:
GLUTによる「手抜き」OpenGL入門

TokyoEDGE2015参加しました。

今日はEvent for Diverse Game Engineersに参加しました。

参加した方々は現場のプロだったり学生だったりいろいろな方がいらっしゃいました。

 

セミナーの内容は

セッション

・shared_ptrとゲームプログラミングでのメモリ管理

Unreal Engine 4とUnreal C++でのプログラミング環境について

・元コンシューマ系PGがアケゲ開発やってみた ~アケゲ開発でのC++

 

LTタイトル

・思い描いてるものを形にするための事前準備

・JUCEで作るオーディオアプリケーション

プログラマ生存戦略 ~生き残る為に出世しろ~

 

の6本でした。

 

スマートポインタのマニアックな話から話題のゲームエンジンについて、生存戦略など面白いものが多かったです。

 

特に生存戦略は外では言えないアレコレを某サウンドプログラマさんがお話しをなさってました。

自分も将来のことを考えないといけないので大変ためになるお話でした。

 

いろいろな方とおしゃべりする中で自分の実力の低さを改めて感じました。

まだまだこれからではありますが、気を引き締めていかないといけないと思いました。

 

そして、登壇者、参加者の皆さまお疲れ様でした。またこういうイベントがあれば是非お逢いしましょう。

 

それでは。