overte-HifiExperiments/Source/audio.h
2013-01-25 11:16:42 -08:00

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__) */