// Open Media file and return elapsed time in millseconds int Waveform::OpenfileMedia(AudioManager* media, wxString& error) { _media = media; views.clear(); if (_media != NULL) { float samplesPerLine = GetSamplesPerLineFromZoomLevel(mZoomLevel); WaveView wv(mZoomLevel, samplesPerLine, media); views.push_back(wv); mCurrentWaveView = 0; return media->LengthMS(); } else { return 0; } }
void Waveform::SetZoomLevel(int level) { mZoomLevel = level; if(!mIsInitialized){return;} mCurrentWaveView = NO_WAVE_VIEW_SELECTED; for(int i=0;i<views.size();i++) { if(views[i].GetZoomLevel() == mZoomLevel) { mCurrentWaveView = i; } } if (mCurrentWaveView == NO_WAVE_VIEW_SELECTED) { float samplesPerLine = GetSamplesPerLineFromZoomLevel(mZoomLevel); WaveView wv(mZoomLevel,samplesPerLine,m_left_data,mMediaTrackSize); views.push_back(wv); mCurrentWaveView = views.size()-1; } }
// Open Media file and return elapsed time in millseconds int Waveform::OpenfileMediaFile(const wxString &filename, wxString& error) { mpg123_handle *mh = NULL; int err; size_t buffer_size; int channels, encoding; long rate; err = mpg123_init(); if(err != MPG123_OK || (mh = mpg123_new(NULL, &err)) == NULL) { error = wxString::Format("Basic setup goes wrong: %s", mpg123_plain_strerror(err)); if (mh != NULL) { cleanup(mh); } return -1; } /* open the file and get the decoding format */ if( mpg123_open(mh, filename.c_str()) != MPG123_OK || mpg123_getformat(mh, &rate, &channels, &encoding) != MPG123_OK ) { error = wxString::Format("Trouble with mpg123: %s", mpg123_strerror(mh)); cleanup(mh); return -1; } if( encoding != MPG123_ENC_SIGNED_16 ) { error = "Encoding unsupported. Must be signed 16 bit."; cleanup(mh); return -2; } /* set the output format and open the output device */ m_bits = mpg123_encsize(encoding); m_rate = rate; m_channels = channels; /* Get Track Size */ mMediaTrackSize = GetTrackSize(mh,m_bits,m_channels); buffer_size = mpg123_outblock(mh); int size = (mMediaTrackSize+buffer_size)*m_bits*m_channels; char * trackData = (char*)malloc(size); LoadTrackData(mh,trackData, size); // Split data into left and right and normalize -1 to 1 m_left_data = (float*)malloc(sizeof(float)*mMediaTrackSize); if( m_channels == 2 ) { m_right_data = (float*)malloc(sizeof(float)*mMediaTrackSize); SplitTrackDataAndNormalize((signed short*)trackData,mMediaTrackSize,m_left_data,m_right_data); } else if( m_channels == 1 ) { NormalizeMonoTrackData((signed short*)trackData,mMediaTrackSize,m_left_data); } else { error = "More than 2 audio channels is not supported yet."; } views.clear(); float samplesPerLine = GetSamplesPerLineFromZoomLevel(mZoomLevel); WaveView wv(mZoomLevel,samplesPerLine,m_left_data,mMediaTrackSize); views.push_back(wv); mCurrentWaveView = 0; mpg123_close(mh); mpg123_delete(mh); mpg123_exit(); free(trackData); float seconds = (float)mMediaTrackSize * ((float)1/(float)rate); mAudioIsLoaded = true; return (int)(seconds * (float)1000); }