paulxstretch/Source/PS_Source/Player.h
2017-11-13 17:06:08 +02:00

138 lines
3.6 KiB
C++

/*
Copyright (C) 2011 Nasca Octavian Paul
Author: Nasca Octavian Paul
This program is free software; you can redistribute it and/or modify
it under the terms of version 2 of the GNU General Public License
as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License (version 2) for more details.
You should have received a copy of the GNU General Public License (version 2)
along with this program; if not, write to the Free Software Foundation,
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#pragma once
#ifdef PLAYERCLASSSTILLPRESENT
#include <string>
#include "Input/AInputS.h"
#include "ProcessedStretch.h"
#include "BinauralBeats.h"
#include "Mutex.h"
#include "globals.h"
using StretchRef = std::shared_ptr<ProcessedStretch>;
class Player:public Thread{
public:
Player();
~Player();
void startplay(String filename, REALTYPE startpos,REALTYPE rap, int fftsize,bool bypass,ProcessParameters *ppar,
BinauralBeatsParameters *bbpar, double loop_start, double loop_end, int numoutchans);
//startpos is from 0 (start) to 1.0 (end of file)
void stop();
void pause();
void freeze();
void setrap(REALTYPE newrap);
void seek(REALTYPE pos);
void getaudiobuffer(int nsamples, float *out);//data este stereo
enum ModeType{
MODE_PLAY,MODE_STOP,MODE_PREPARING,MODE_PAUSE
};
ModeType getmode();
struct player_soundfile_info_t{
float position = 0.0f;//0 is for start, 1 for end
double liveposition = 0.0;
int playing=0;
int samplerate=0;
bool eof=false;
}info;
bool is_freeze(){
return freeze_mode;
};
void set_window_type(FFTWindow window);
void set_volume(REALTYPE vol);
void set_onset_detection_sensitivity(REALTYPE onset);
void set_process_parameters(ProcessParameters *ppar,BinauralBeatsParameters *bbpar);
std::unique_ptr<BinauralBeats> binaural_beats;
void setPreBufferAmount(double x) { m_prebufferamount = jlimit(0.1,2.0, x); }
private:
void run() override;
std::unique_ptr<InputS> ai;
std::vector<StretchRef> m_stretchers;
std::vector<float> inbuf_i;
int inbufsize;
Mutex taskmutex,bufmutex;
ModeType mode;
enum TaskMode{
TASK_NONE, TASK_START, TASK_STOP,TASK_SEEK,TASK_RAP,TASK_PARAMETERS, TASK_ONSET
};
struct player_task_t {
TaskMode mode;
REALTYPE startpos=0.0;
REALTYPE rap;
int fftsize;
String filename;
int m_num_outchans = 2;
bool bypass;
ProcessParameters *ppar;
BinauralBeatsParameters *bbpar;
double m_loop_start = 0.0;
double m_loop_end = 1.0;
}newtask,task;
struct{
float2dvector m_inbuf;
}inbuf;
struct player_outbuf_t{
int n;//how many buffers
float3dvector channeldatas;
int size;//size of one buffer
int computek,outk;//current buffer
int outpos;//the sample position in the current buffer (for out)
int nfresh;//how many buffers are fresh added and need to be played
//nfresh==0 for empty buffers, nfresh==n-1 for full buffers
std::vector<float> in_position;//the position(for input samples inside the input file) of each buffers
}outbuf;
bool first_in_buf;
void newtaskcheck();
void computesamples();
bool freeze_mode,bypass_mode,paused;
REALTYPE volume,onset_detection_sensitivity;
String current_filename;
FFTWindow window_type;
double m_prebufferamount = 0.2;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(Player)
};
#endif