mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-07-22 23:24:56 +02:00
93 lines
2.4 KiB
C++
93 lines
2.4 KiB
C++
//
|
|
// audio.h
|
|
// interface
|
|
//
|
|
// Created by Stephen Birarda on 1/22/13.
|
|
// Copyright (c) 2013 Rosedale Lab. All rights reserved.
|
|
//
|
|
|
|
#ifndef __interface__audio__
|
|
#define __interface__audio__
|
|
|
|
#include <iostream>
|
|
#include "portaudio.h"
|
|
#include "head.h"
|
|
|
|
#define BUFFER_LENGTH_BYTES 1024
|
|
#define PHASE_DELAY_AT_90 20
|
|
#define AUDIO_SOURCES 2
|
|
|
|
class Audio {
|
|
public:
|
|
// initializes audio I/O
|
|
static bool init();
|
|
static bool init(Head* mainHead);
|
|
|
|
static void sourceSetup();
|
|
|
|
// terminates audio I/O
|
|
static bool terminate();
|
|
private:
|
|
struct AudioSource {
|
|
glm::vec3 position;
|
|
int16_t *audioData;
|
|
int16_t *delayBuffer;
|
|
int lengthInSamples;
|
|
int samplePointer;
|
|
|
|
AudioSource() {
|
|
samplePointer = 0;
|
|
|
|
// alloc memory for sample delay buffer
|
|
delayBuffer = new int16_t[PHASE_DELAY_AT_90];
|
|
memset(delayBuffer, 0, sizeof(int16_t) * PHASE_DELAY_AT_90);
|
|
};
|
|
|
|
~AudioSource() {
|
|
delete[] delayBuffer;
|
|
delete[] audioData;
|
|
}
|
|
};
|
|
|
|
static void readFile(const char *filename, struct AudioSource *source);
|
|
static bool initialized;
|
|
|
|
static struct AudioData {
|
|
Head* linkedHead;
|
|
AudioSource sources[AUDIO_SOURCES];
|
|
|
|
AudioData() {
|
|
sources[0] = AudioSource();
|
|
sources[1] = AudioSource();
|
|
sources[2] = AudioSource();
|
|
}
|
|
|
|
// ~AudioData() {
|
|
// delete sources[0];
|
|
// delete sources[1];
|
|
// delete sources[2];
|
|
// }
|
|
} *data;
|
|
|
|
// protects constructor so that public init method is used
|
|
Audio();
|
|
|
|
// hold potential error returned from PortAudio functions
|
|
static PaError err;
|
|
|
|
// audio stream handle
|
|
static PaStream *stream;
|
|
|
|
// give access to AudioData class from audioCallback
|
|
friend int audioCallback (const void*, void*, unsigned long, const PaStreamCallbackTimeInfo*, PaStreamCallbackFlags, void*);
|
|
};
|
|
|
|
// Audio callback called by portaudio.
|
|
int audioCallback (const void *inputBuffer,
|
|
void *outputBuffer,
|
|
unsigned long framesPerBuffer,
|
|
const PaStreamCallbackTimeInfo *timeInfo,
|
|
PaStreamCallbackFlags statusFlags,
|
|
void *userData);
|
|
|
|
#endif /* defined(__interface__audio__) */
|