c-ize the bass-example a bit more

This commit is contained in:
Erik Faye-Lund 2010-01-09 19:47:48 +01:00
parent 70bcea33ab
commit 76d3fc55f7

View File

@ -73,126 +73,128 @@ void die(const char *fmt, ...)
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
#define WINDOWED 1
const unsigned int width = 800; const unsigned int width = 800;
const unsigned int height = 600; const unsigned int height = 600;
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
int ret = 0; IDirect3D9 *d3d;
try IDirect3DDevice9 *dev;
{ HWND hwnd;
// initialize directx HSTREAM stream;
IDirect3D9 *d3d = Direct3DCreate9(D3D_SDK_VERSION);
if (NULL == d3d) throw std::string("update directx, fool.");
// create a window static D3DPRESENT_PARAMETERS present_parameters = {
HWND hwnd = CreateWindowEx(0, "static", "GNU Rocket Example", WS_POPUP | WS_VISIBLE, 0, 0, width, height, 0, 0, GetModuleHandle(0), 0); width, height, D3DFMT_X8R8G8B8, 3,
D3DMULTISAMPLE_NONE, 0, D3DSWAPEFFECT_DISCARD,
0, TRUE, 1, D3DFMT_D24S8, 0, 0
};
// create the device struct sync_track *clear_r, *clear_g, *clear_b;
IDirect3DDevice9 *device = NULL; struct sync_track *cam_rot, *cam_dist;
static D3DPRESENT_PARAMETERS present_parameters = {width, height, D3DFMT_X8R8G8B8, 3, D3DMULTISAMPLE_NONE, 0, D3DSWAPEFFECT_DISCARD, 0, WINDOWED, 1, D3DFMT_D24S8, 0, WINDOWED ? 0 : D3DPRESENT_RATE_DEFAULT, 0};
if (D3D_OK != d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &present_parameters, &device))
throw std::string("could not create device. you computer SUCKS!");
// init BASS /* initialize directx */
int soundDevice = 1; d3d = Direct3DCreate9(D3D_SDK_VERSION);
if (!BASS_Init(soundDevice, 44100, 0, hwnd, 0)) throw std::string("failed to init bass"); if (!d3d)
die("update directx, fool.");
// load tune /* create a window */
HSTREAM stream = BASS_StreamCreateFile(false, "tune.ogg", 0, 0, BASS_MP3_SETPOS | ((0 == soundDevice) ? BASS_STREAM_DECODE : 0)); hwnd = CreateWindowEx(0, "static", "GNU Rocket Example",
if (!stream) throw std::string("failed to open tune"); WS_POPUP | WS_VISIBLE, 0, 0, width, height, 0, 0,
GetModuleHandle(0), 0);
if (!hwnd)
die("failed to create window");
sync_device *rocket = sync_create_device("sync"); /* create the device */
if (!rocket) if (FAILED(d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
die("something went wrong - failed to connect to host?"); hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &present_parameters,
&dev)))
die("could not create device. you computer SUCKS!");
/* init BASS */
if (!BASS_Init(-1, 44100, 0, hwnd, 0))
die("failed to init bass");
stream = BASS_StreamCreateFile(false, "tune.ogg", 0, 0, 0);
if (!stream)
die("failed to open tune");
sync_device *rocket = sync_create_device("sync");
if (!rocket)
die("something went wrong - failed to connect to host?");
#ifndef SYNC_PLAYER #ifndef SYNC_PLAYER
sync_set_callbacks(rocket, &bass_cb, (void *)stream); sync_set_callbacks(rocket, &bass_cb, (void *)stream);
#endif #endif
// get tracks /* get tracks */
struct sync_track clear_r = sync_get_track(rocket, "clear.r");
*clearRTrack = sync_get_track(rocket, "clear.r"), clear_g = sync_get_track(rocket, "clear.g");
*clearGTrack = sync_get_track(rocket, "clear.g"), clear_b = sync_get_track(rocket, "clear.b");
*clearBTrack = sync_get_track(rocket, "clear.b"), cam_rot = sync_get_track(rocket, "cam.rot"),
*camRotTrack = sync_get_track(rocket, "cam.rot"), cam_dist = sync_get_track(rocket, "cam.dist");
*camDistTrack = sync_get_track(rocket, "cam.dist");
LPD3DXMESH cubeMesh = NULL; LPD3DXMESH cubeMesh = NULL;
if (FAILED(D3DXCreateBox( if (FAILED(D3DXCreateBox(dev, 1.0f, 1.0f, 1.0f,
device, &cubeMesh, NULL)))
1.0f, 1.0f, 1.0f, return -1;
&cubeMesh, NULL
)))
return -1;
// let's roll! /* let's roll! */
BASS_Start(); BASS_Start();
BASS_ChannelPlay(stream, false); BASS_ChannelPlay(stream, false);
bool done = false; bool done = false;
while (!done) while (!done) {
{ double row = bass_get_row(stream);
double row = bass_get_row(stream); sync_update(rocket, row);
sync_update(rocket, row);
// setup clear color /* draw */
D3DXCOLOR clearColor(
sync_get_val(clearRTrack, row),
sync_get_val(clearGTrack, row),
sync_get_val(clearBTrack, row),
0.0
);
// paint the window D3DXCOLOR clearColor(
device->BeginScene(); sync_get_val(clear_r, row),
device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER | D3DCLEAR_STENCIL, clearColor, 1.0f, 0); sync_get_val(clear_g, row),
sync_get_val(clear_b, row),
0.0
);
/* D3DXMATRIX world; dev->BeginScene();
device->SetTransform(D3DTS_WORLD, &world); */ dev->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER | D3DCLEAR_STENCIL, clearColor, 1.0f, 0);
float rot = sync_get_val(camRotTrack, row); float rot = sync_get_val(cam_rot, row);
float dist = sync_get_val(camDistTrack, row); float dist = sync_get_val(cam_dist, row);
D3DXVECTOR3 eye(sin(rot) * dist, 0, cos(rot) * dist); D3DXVECTOR3 eye(sin(rot) * dist, 0, cos(rot) * dist);
D3DXVECTOR3 at(0, 0, 0); D3DXVECTOR3 at(0, 0, 0);
D3DXVECTOR3 up(0, 1, 0); D3DXVECTOR3 up(0, 1, 0);
D3DXMATRIX view; D3DXMATRIX view;
D3DXMatrixLookAtLH(&view, &(eye + at), &at, &up); D3DXMatrixLookAtLH(&view, &(eye + at), &at, &up);
device->SetTransform(D3DTS_WORLD, &view); dev->SetTransform(D3DTS_VIEW, &view);
D3DXMATRIX proj; D3DXMATRIX proj;
D3DXMatrixPerspectiveFovLH(&proj, D3DXToRadian(60), 4.0f / 3, 0.1f, 1000.f); D3DXMatrixPerspectiveFovLH(&proj, D3DXToRadian(60), 4.0f / 3, 0.1f, 1000.f);
device->SetTransform(D3DTS_PROJECTION, &proj); dev->SetTransform(D3DTS_PROJECTION, &proj);
cubeMesh->DrawSubset(0); cubeMesh->DrawSubset(0);
device->EndScene(); dev->EndScene();
device->Present(0, 0, 0, 0); dev->Present(0, 0, 0, 0);
BASS_Update(0); // decrease the chance of missing vsync BASS_Update(0); /* decrease the chance of missing vsync */
MSG msg; MSG msg;
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
{ TranslateMessage(&msg);
TranslateMessage(&msg); DispatchMessage(&msg);
DispatchMessage(&msg);
if (WM_QUIT == msg.message) done = true; if (WM_QUIT == msg.message ||
if ((WM_KEYDOWN == msg.message) && (VK_ESCAPE == LOWORD(msg.wParam))) done = true; (WM_KEYDOWN == msg.message &&
} VK_ESCAPE == LOWORD(msg.wParam)))
done = true;
} }
BASS_StreamFree(stream);
BASS_Free();
device->Release();
d3d->Release();
DestroyWindow(hwnd);
} catch (const std::exception &e) {
die(e.what());
} catch (const std::string &str) {
die(str.c_str());
} }
BASS_StreamFree(stream);
BASS_Free();
dev->Release();
d3d->Release();
DestroyWindow(hwnd);
return 0; return 0;
} }