/* 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 */ #ifndef PLAYER_H #define PLAYER_H #include #include "Input/AInputS.h" #include "Input/VorbisInputS.h" #include "Input/MP3InputS.h" #include "ProcessedStretch.h" #include "Thread.h" #include "BinauralBeats.h" #include "Mutex.h" #include "globals.h" #define PA_SOUND_BUFFER_SIZE 8192 class Player:public Thread{ public: Player(); ~Player(); void startplay(std::string filename, REALTYPE startpos,REALTYPE rap, int fftsize,FILE_TYPE intype,bool bypass,ProcessParameters *ppar,BinauralBeatsParameters *bbpar); //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{ float position;//0 is for start, 1 for end int playing; int samplerate; bool eof; }info; bool is_freeze(){ return freeze_mode; }; void set_window_type(FFTWindow window); void set_volume(REALTYPE vol); void set_process_parameters(ProcessParameters *ppar,BinauralBeatsParameters *bbpar); BinauralBeats *binaural_beats; private: void run(); InputS *ai; ProcessedStretch *stretchl,*stretchr; short int *inbuf_i; int inbufsize; Mutex taskmutex,bufmutex; ModeType mode; enum TaskMode{ TASK_NONE, TASK_START, TASK_STOP,TASK_SEEK,TASK_RAP,TASK_PARAMETERS }; struct { TaskMode mode; REALTYPE startpos; REALTYPE rap; int fftsize; std::string filename; FILE_TYPE intype; bool bypass; ProcessParameters *ppar; BinauralBeatsParameters *bbpar; }newtask,task; struct{ REALTYPE *l,*r; }inbuf; struct{ int n;//how many buffers float **datal,**datar;//array of buffers 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 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; std::string current_filename; FFTWindow window_type; }; #endif