forked from LeenkxTeam/LNXSDK
		
	
		
			
				
	
	
		
			66 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#include <Kore/Audio2/Audio.h>
 | 
						|
#include <Kore/Audio3/Audio.h>
 | 
						|
 | 
						|
using namespace Kore;
 | 
						|
 | 
						|
namespace {
 | 
						|
	const int channelCount = 64;
 | 
						|
	Audio3::Channel channels[channelCount];
 | 
						|
 | 
						|
	void callback(uint32_t samples) {
 | 
						|
		for (int i = 0; i < channelCount; ++i) {
 | 
						|
			channels[i].callback(samples);
 | 
						|
		}
 | 
						|
		for (int i = 0; i < samples; ++i) {
 | 
						|
			float value = 0;
 | 
						|
			for (int i = 0; i < channelCount; ++i) {
 | 
						|
				value += *(float *)&channels[i].buffer.data[Audio2::buffer.readLocation];
 | 
						|
				channels[i].buffer.readLocation += 4;
 | 
						|
				if (channels[i].buffer.readLocation >= channels[i].buffer.dataSize) {
 | 
						|
					channels[i].buffer.readLocation = 0;
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			*(float *)&Audio2::buffer.channels[0][Audio2::buffer.writeLocation] = value;
 | 
						|
			*(float *)&Audio2::buffer.channels[1][Audio2::buffer.writeLocation] = value;
 | 
						|
			Audio2::buffer.writeLocation += 1;
 | 
						|
			if (Audio2::buffer.writeLocation >= Audio2::buffer.dataSize) {
 | 
						|
				Audio2::buffer.writeLocation = 0;
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
void Audio3::init() {
 | 
						|
	for (int i = 0; i < channelCount; ++i) {
 | 
						|
		channels[i].active = false;
 | 
						|
		channels[i].buffer.readLocation = 0;
 | 
						|
		channels[i].buffer.writeLocation = 0;
 | 
						|
		channels[i].buffer.dataSize = 128 * 1024;
 | 
						|
		channels[i].buffer.data = new u8[channels[i].buffer.dataSize];
 | 
						|
	}
 | 
						|
	Audio2::init();
 | 
						|
	Audio2::audioCallback = callback;
 | 
						|
}
 | 
						|
 | 
						|
void Audio3::update() {
 | 
						|
	Audio2::update();
 | 
						|
}
 | 
						|
 | 
						|
void Audio3::shutdown() {
 | 
						|
	Audio2::shutdown();
 | 
						|
}
 | 
						|
 | 
						|
Audio3::Channel *Audio3::createChannel(vec3 origin, AudioCallback callback) {
 | 
						|
	for (int i = 0; i < channelCount; ++i) {
 | 
						|
		if (!channels[i].active) {
 | 
						|
			return &channels[i];
 | 
						|
		}
 | 
						|
	}
 | 
						|
	return nullptr;
 | 
						|
}
 | 
						|
 | 
						|
void Audio3::destroyChannel(Channel *channel) {
 | 
						|
	channel->active = false;
 | 
						|
}
 |