elanhickler

take class

Jan 9th, 2016
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.09 KB | None | 0 0
  1. class Take {
  2. public:
  3.     // constructor
  4.     Take(MediaItem* item) : item(item) { take = GetActiveTake(item); };
  5.     Take(MediaItem_Take* take) : take(take) { item = GetMediaItemTake_Item(take); };
  6.  
  7.     // conversion
  8.     operator MediaItem*() const { return item; }
  9.     operator MediaItem_Take*() const { return take; }
  10.     operator int() const { return GetMediaItemTakeInfo_Value(take, "IP_TAKENUMBER"); }
  11.     operator string() const { return GetTakeName(take); }
  12.  
  13.     // operator
  14.     const vector<double>& operator[](int i) { return m_audiobuf[i]; } //todo: error if audio is not loaded
  15.  
  16. private:
  17.     // basic properties
  18.     MediaItem_Take* take;
  19.     MediaItem* item;
  20.  
  21.     // audio properties
  22.     PCM_source* source = nullptr;
  23.     int m_srate = 0;
  24.     size_t m_frames = 0;
  25.     int m_nch = 0;
  26.     int m_bitdepth = 0;
  27.  
  28.     string m_audiofile_path;
  29.     int m_audiofile_frames = 0;
  30.     double m_audiofile_length = 0.0;
  31.  
  32.     vector<vector<double>> m_audiobuf;
  33.     double m_audiobuf_starttime = -1;
  34.     double m_audiobuf_endtime = -1;
  35.  
  36. public:
  37.     // getters
  38.     int idx() { return GetMediaItemTakeInfo_Value(take, "IP_TAKENUMBER"); }
  39.     int chanmode() { return GetMediaItemTakeInfo_Value(take, "I_CHANMODE"); }
  40.     double rate() { return GetMediaItemTakeInfo_Value(take, "D_PLAYRATE"); }
  41.     double vol() { return GetMediaItemTakeInfo_Value(take, "D_VOL"); }
  42.     double length() { return GetMediaItemInfo_Value(item, "D_LENGTH"); }
  43.  
  44.     string name() { return GetTakeName(take); }
  45.     int samplerate() { if (!m_srate) InitAudio(); return m_srate; }
  46.     int bitdepth() { if (!m_bitdepth) InitAudio(); return m_bitdepth; }
  47.     size_t frames() { return m_frames; }
  48.     int nch() { if (!m_nch) InitAudio(); return m_nch;}
  49.  
  50.     const vector<vector<double>>& audio() { return m_audiobuf; } //todo: error if audio is not loaded
  51.     int audiofile_frames() { return m_audiofile_frames; }
  52.     const string& audiofile_path() {  return m_audiofile_path; }
  53.  
  54.     // setters
  55.     void name(const string& s) { GetSetMediaItemTakeInfo_String(take, "P_NAME", (char*)s.c_str(), 1); }
  56.     void chanmode(int c) { SetMediaItemTakeInfo_Value(take, "I_CHANMODE", c); }
  57.  
  58.     // functions
  59. public:
  60.     void InitAudio();
  61.     void LoadAudio(double starttime = -1, double endtime = -1);
  62. };
  63.  
  64. void Take::InitAudio() {
  65.     source = GetMediaItemTake_Source(take);
  66.  
  67.     m_audiofile_path = source->GetFileName();
  68.     m_srate = source->GetSampleRate();
  69.     m_audiofile_frames = length() * m_srate;
  70.     m_audiofile_length = source->GetLength();
  71.     m_bitdepth = source->GetBitsPerSample();
  72.     m_nch = source->GetNumChannels();
  73. }
  74.  
  75. void Take::LoadAudio(double starttime, double endtime) {
  76.     if (!m_nch) InitAudio();
  77.  
  78.     if (starttime == -1) starttime = m_audiobuf_starttime = 0;
  79.     if (endtime == -1) { endtime = m_audiobuf_endtime = length(); }
  80.  
  81.     int initial_chanmode = chanmode();
  82.     chanmode(0);
  83.  
  84.     m_frames = (endtime - starttime) * (double)m_srate;
  85.     vector<double> buffer(m_frames * m_nch, 0);
  86.     AudioAccessor* accessor = CreateTakeAudioAccessor(take);
  87.     GetAudioAccessorSamples(accessor, m_srate, m_nch, starttime, m_frames, buffer.data());
  88.     DestroyAudioAccessor(accessor);
  89.  
  90.     chanmode(initial_chanmode);
  91.  
  92.     m_audiobuf = InterleavedToMultichannel(buffer.data(), m_nch, m_frames);
  93. }
Advertisement
Add Comment
Please, Sign In to add comment