lbajardsilogic@0: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ lbajardsilogic@0: lbajardsilogic@0: /* lbajardsilogic@0: Sonic Visualiser lbajardsilogic@0: An audio file viewer and annotation editor. lbajardsilogic@0: Centre for Digital Music, Queen Mary, University of London. lbajardsilogic@0: This file copyright 2006 Chris Cannam. lbajardsilogic@0: lbajardsilogic@0: This program is free software; you can redistribute it and/or lbajardsilogic@0: modify it under the terms of the GNU General Public License as lbajardsilogic@0: published by the Free Software Foundation; either version 2 of the lbajardsilogic@0: License, or (at your option) any later version. See the file lbajardsilogic@0: COPYING included with this distribution for more information. lbajardsilogic@0: */ lbajardsilogic@0: lbajardsilogic@0: #ifndef _SAMPLE_PLAYER_H_ lbajardsilogic@0: #define _SAMPLE_PLAYER_H_ lbajardsilogic@0: lbajardsilogic@0: #define DSSI_API_LEVEL 2 lbajardsilogic@0: lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: lbajardsilogic@0: class SamplePlayer lbajardsilogic@0: { lbajardsilogic@0: public: lbajardsilogic@0: static const DSSI_Descriptor *getDescriptor(unsigned long index); lbajardsilogic@0: lbajardsilogic@0: private: lbajardsilogic@0: SamplePlayer(int sampleRate); lbajardsilogic@0: ~SamplePlayer(); lbajardsilogic@0: lbajardsilogic@0: enum { lbajardsilogic@0: OutputPort = 0, lbajardsilogic@0: RetunePort = 1, lbajardsilogic@0: BasePitchPort = 2, lbajardsilogic@0: ConcertAPort = 3, lbajardsilogic@0: SustainPort = 4, lbajardsilogic@0: ReleasePort = 5, lbajardsilogic@0: PortCount = 6 lbajardsilogic@0: }; lbajardsilogic@0: lbajardsilogic@0: enum { lbajardsilogic@0: Polyphony = 128 lbajardsilogic@0: }; lbajardsilogic@0: lbajardsilogic@0: static const char *const portNames[PortCount]; lbajardsilogic@0: static const LADSPA_PortDescriptor ports[PortCount]; lbajardsilogic@0: static const LADSPA_PortRangeHint hints[PortCount]; lbajardsilogic@0: static const LADSPA_Properties properties; lbajardsilogic@0: static const LADSPA_Descriptor ladspaDescriptor; lbajardsilogic@0: static const DSSI_Descriptor dssiDescriptor; lbajardsilogic@0: static const DSSI_Host_Descriptor *hostDescriptor; lbajardsilogic@0: lbajardsilogic@0: static LADSPA_Handle instantiate(const LADSPA_Descriptor *, unsigned long); lbajardsilogic@0: static void connectPort(LADSPA_Handle, unsigned long, LADSPA_Data *); lbajardsilogic@0: static void activate(LADSPA_Handle); lbajardsilogic@0: static void run(LADSPA_Handle, unsigned long); lbajardsilogic@0: static void deactivate(LADSPA_Handle); lbajardsilogic@0: static void cleanup(LADSPA_Handle); lbajardsilogic@0: static char *configure(LADSPA_Handle, const char *, const char *); lbajardsilogic@0: static const DSSI_Program_Descriptor *getProgram(LADSPA_Handle, unsigned long); lbajardsilogic@0: static void selectProgram(LADSPA_Handle, unsigned long, unsigned long); lbajardsilogic@0: static int getMidiController(LADSPA_Handle, unsigned long); lbajardsilogic@0: static void runSynth(LADSPA_Handle, unsigned long, lbajardsilogic@0: snd_seq_event_t *, unsigned long); lbajardsilogic@0: static void receiveHostDescriptor(const DSSI_Host_Descriptor *descriptor); lbajardsilogic@0: static void workThreadCallback(LADSPA_Handle); lbajardsilogic@0: lbajardsilogic@0: void searchSamples(); lbajardsilogic@0: void loadSampleData(QString path); lbajardsilogic@0: void runImpl(unsigned long, snd_seq_event_t *, unsigned long); lbajardsilogic@0: void addSample(int, unsigned long, unsigned long); lbajardsilogic@0: lbajardsilogic@0: float *m_output; lbajardsilogic@0: float *m_retune; lbajardsilogic@0: float *m_basePitch; lbajardsilogic@0: float *m_concertA; lbajardsilogic@0: float *m_sustain; lbajardsilogic@0: float *m_release; lbajardsilogic@0: lbajardsilogic@0: float *m_sampleData; lbajardsilogic@0: size_t m_sampleCount; lbajardsilogic@0: int m_sampleRate; lbajardsilogic@0: lbajardsilogic@0: long m_ons[Polyphony]; lbajardsilogic@0: long m_offs[Polyphony]; lbajardsilogic@0: int m_velocities[Polyphony]; lbajardsilogic@0: long m_sampleNo; lbajardsilogic@0: lbajardsilogic@0: QString m_sampleDir; lbajardsilogic@0: QString m_program; lbajardsilogic@0: std::vector > m_samples; // program name, path lbajardsilogic@0: bool m_sampleSearchComplete; lbajardsilogic@0: int m_pendingProgramChange; lbajardsilogic@0: lbajardsilogic@0: QMutex m_mutex; lbajardsilogic@0: }; lbajardsilogic@0: lbajardsilogic@0: lbajardsilogic@0: #endif