libSDL2pp/tests/live_audiodevice.cc
Dmitry Marakasov 24482d85f6 Follow SDL2 include path conventions
Though these are broken and error prone, as they ignore the possibility
of conflicts between SDL, SDL2 and wrappers thereof discarding useful
include path prefix (SDL2/), since SDL and satellite libraries follow
these it's too hard to stay away.

So don't use prefixes for SDL include paths any longer.
2017-02-08 13:19:04 +03:00

125 lines
2.6 KiB
C++

#include <atomic>
#include <algorithm>
#include <vector>
#include <SDL.h>
#include <SDL2pp/SDL2pp.hh>
#include "testing.h"
#include "movetest.hh"
using namespace SDL2pp;
BEGIN_TEST(int, char*[])
SDL sdl(SDL_INIT_AUDIO);
static constexpr int samplerate = 48000;
AudioSpec spec(samplerate, AUDIO_S16SYS, 1, 4096);
std::atomic_long callback_requests(0);
AudioDevice device(NullOpt, 0, spec, [&callback_requests](Uint8* stream, int len) {
std::fill(stream, stream + len, 0);
++callback_requests;
});
MOVE_TEST(AudioDevice, device, Get, 0)
{
// Default state
EXPECT_TRUE(device.GetStatus(), SDL_AUDIO_PAUSED);
EXPECT_TRUE(callback_requests == 0);
long saved_reqs = callback_requests;
// Unpause
device.Pause(false);
EXPECT_TRUE(device.GetStatus(), SDL_AUDIO_PLAYING);
SDL_Delay(1000);
EXPECT_TRUE(callback_requests > saved_reqs);
// Pause
device.Pause(true);
EXPECT_TRUE(device.GetStatus(), SDL_AUDIO_PLAYING);
saved_reqs = callback_requests;
SDL_Delay(1000);
EXPECT_TRUE(callback_requests == saved_reqs);
device.Pause(false);
{
// Lock
AudioDevice::LockHandle lock = device.Lock();
saved_reqs = callback_requests;
SDL_Delay(1000);
EXPECT_TRUE(callback_requests == saved_reqs);
{
// Recursive lock
AudioDevice::LockHandle lock1(lock);
AudioDevice::LockHandle lock2, lock4;
lock2 = lock1;
AudioDevice::LockHandle lock3(std::move(lock1));
lock4 = std::move(lock2);
SDL_Delay(1000);
}
EXPECT_TRUE(callback_requests == saved_reqs);
}
// Unlocked
SDL_Delay(1000);
EXPECT_TRUE(callback_requests > saved_reqs);
// Change callback
device.ChangeCallback([&callback_requests](Uint8* stream, int len) {
std::fill(stream, stream + len, 0);
--callback_requests;
});
saved_reqs = callback_requests;
SDL_Delay(1000);
EXPECT_TRUE(callback_requests < saved_reqs);
}
#if SDL_VERSION_ATLEAST(2, 0, 4)
{
// Queue won't work for callbacked device
EXPECT_EXCEPTION(device.QueueAudio(0, 0), Exception);
AudioDevice device2 = AudioDevice(NullOpt, 0, spec);
static constexpr size_t buflen = 1024 * 1024;
std::vector<char> zeroes(buflen);
device2.QueueAudio(zeroes.data(), buflen);
// Not sure if safe to check for equality; may it
// already suck in some data?
EXPECT_EQUAL(device2.GetQueuedAudioSize(), buflen);
device2.Pause(false);
// This will suck in some data
SDL_Delay(1000);
EXPECT_TRUE(device2.GetQueuedAudioSize() < buflen);
device2.ClearQueuedAudio();
EXPECT_EQUAL(device2.GetQueuedAudioSize(), (Uint32)0);
}
#endif
END_TEST()