From 90d023f43a0018eadd145f1759d18738a4b2990e Mon Sep 17 00:00:00 2001 From: Javier Serrano Polo Date: Thu, 24 Aug 2006 00:19:17 +0000 Subject: [PATCH] - react to bb-track mute automation - added constructor to handle frozen patterns - use shared sample buffers git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/trunk/lmms@360 0778d3d1-df1d-0410-868b-ea421aaaa00d --- include/sample_play_handle.h | 11 ++++++++- src/core/sample_play_handle.cpp | 44 +++++++++++++++++++++++---------- 2 files changed, 41 insertions(+), 14 deletions(-) diff --git a/include/sample_play_handle.h b/include/sample_play_handle.h index 46ade5ad5..4b70628dd 100644 --- a/include/sample_play_handle.h +++ b/include/sample_play_handle.h @@ -32,6 +32,8 @@ #include "types.h" #include "engine.h" +class bbTrack; +class pattern; class sampleBuffer; class sampleTCO; class track; @@ -45,6 +47,7 @@ public: samplePlayHandle( const QString & _sample_file, engine * _engine ); samplePlayHandle( sampleBuffer * _sample_buffer ); samplePlayHandle( sampleTCO * _tco ); + samplePlayHandle( pattern * _pattern ); virtual ~samplePlayHandle(); virtual void play( void ); @@ -61,6 +64,11 @@ public: m_doneMayReturnTrue = _enable; } + void setBBTrack( bbTrack * _bb_track ) + { + m_bbTrack = _bb_track; + } + public slots: void setVolume( float _new_volume ); @@ -68,7 +76,6 @@ public slots: private: sampleBuffer * m_sampleBuffer; - const bool m_ownSampleBuffer; bool m_doneMayReturnTrue; f_cnt_t m_frame; @@ -79,6 +86,8 @@ private: float m_volume; track * m_track; + bbTrack * m_bbTrack; + } ; diff --git a/src/core/sample_play_handle.cpp b/src/core/sample_play_handle.cpp index 5897e6e3f..e5f189aaf 100644 --- a/src/core/sample_play_handle.cpp +++ b/src/core/sample_play_handle.cpp @@ -26,6 +26,9 @@ #include "sample_play_handle.h" +#include "bb_track.h" +#include "instrument_track.h" +#include "pattern.h" #include "sample_buffer.h" #include "sample_track.h" #include "buffer_allocator.h" @@ -38,13 +41,13 @@ samplePlayHandle::samplePlayHandle( const QString & _sample_file, playHandle( SAMPLE_PLAY_HANDLE ), engineObject( _engine ), m_sampleBuffer( new sampleBuffer( eng(), _sample_file ) ), - m_ownSampleBuffer( TRUE ), m_doneMayReturnTrue( TRUE ), m_frame( 0 ), m_audioPort( new audioPort( "samplePlayHandle", eng() ) ), m_ownAudioPort( TRUE ), m_volume( 1.0f ), - m_track( NULL ) + m_track( NULL ), + m_bbTrack( NULL ) { } @@ -54,14 +57,14 @@ samplePlayHandle::samplePlayHandle( const QString & _sample_file, samplePlayHandle::samplePlayHandle( sampleBuffer * _sample_buffer ) : playHandle( SAMPLE_PLAY_HANDLE ), engineObject( _sample_buffer->eng() ), - m_sampleBuffer( _sample_buffer ), - m_ownSampleBuffer( FALSE ), + m_sampleBuffer( sharedObject::ref( _sample_buffer ) ), m_doneMayReturnTrue( TRUE ), m_frame( 0 ), m_audioPort( new audioPort( "samplePlayHandle", eng() ) ), m_ownAudioPort( TRUE ), m_volume( 1.0f ), - m_track( NULL ) + m_track( NULL ), + m_bbTrack( NULL ) { } @@ -71,14 +74,31 @@ samplePlayHandle::samplePlayHandle( sampleBuffer * _sample_buffer ) : samplePlayHandle::samplePlayHandle( sampleTCO * _tco ) : playHandle( SAMPLE_PLAY_HANDLE ), engineObject( _tco->eng() ), - m_sampleBuffer( _tco->getSampleBuffer() ), - m_ownSampleBuffer( FALSE ), + m_sampleBuffer( sharedObject::ref( _tco->getSampleBuffer() ) ), m_doneMayReturnTrue( TRUE ), m_frame( 0 ), m_audioPort( ( (sampleTrack *)_tco->getTrack() )->getAudioPort() ), m_ownAudioPort( FALSE ), m_volume( 1.0f ), - m_track( _tco->getTrack() ) + m_track( _tco->getTrack() ), + m_bbTrack( NULL ) +{ +} + + + + +samplePlayHandle::samplePlayHandle( pattern * _pattern ) : + playHandle( SAMPLE_PLAY_HANDLE ), + engineObject( _pattern->eng() ), + m_sampleBuffer( sharedObject::ref( _pattern->getFrozenPattern() ) ), + m_doneMayReturnTrue( TRUE ), + m_frame( 0 ), + m_audioPort( _pattern->getInstrumentTrack()->getAudioPort() ), + m_ownAudioPort( FALSE ), + m_volume( 1.0f ), + m_track( _pattern->getInstrumentTrack() ), + m_bbTrack( NULL ) { } @@ -87,10 +107,7 @@ samplePlayHandle::samplePlayHandle( sampleTCO * _tco ) : samplePlayHandle::~samplePlayHandle() { - if( m_ownSampleBuffer == TRUE ) - { - delete m_sampleBuffer; - } + sharedObject::unref( m_sampleBuffer ); if( m_ownAudioPort ) { delete m_audioPort; @@ -117,7 +134,8 @@ void samplePlayHandle::play( const fpab_t _frame_base ) const fpab_t frames = eng()->getMixer()->framesPerAudioBuffer() - _frame_base; - if( !( m_track && m_track->muted() ) ) + if( !( m_track && m_track->muted() ) + && !( m_bbTrack && m_bbTrack->muted() ) ) { sampleFrame * buf = bufferAllocator::alloc( frames );