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; | ||
|  | } |