Replace more instances new/delete with owning types (#4245)

* Use owning types when possible.

Note: the QByteArray s is detached to mimic previous behavior;
detach() guarantees that the QByteArray uniquely owns its data, since
otherwise it's COW. This may be relevant in case Plugin:instantiate
modifies s.data() -- this way the original QString is safe.

* Make m_filter a unique_ptr.

* Make m_activeRenderer a unique_ptr

* use std::string instead of strcpy + buffers
This commit is contained in:
Colin Wallace
2018-03-15 18:46:55 -07:00
committed by GitHub
parent 80ce77fc91
commit b706ee208d
7 changed files with 29 additions and 36 deletions

View File

@@ -26,6 +26,8 @@
#ifndef NOTE_PLAY_HANDLE_H
#define NOTE_PLAY_HANDLE_H
#include <memory>
#include "AtomicInt.h"
#include "BasicFilters.h"
#include "Note.h"
@@ -46,7 +48,7 @@ class EXPORT NotePlayHandle : public PlayHandle, public Note
MM_OPERATORS
public:
void * m_pluginData;
BasicFilters<> * m_filter;
std::unique_ptr<BasicFilters<>> m_filter;
// specifies origin of NotePlayHandle
enum Origins

View File

@@ -26,7 +26,7 @@
#ifndef RENDER_MANAGER_H
#define RENDER_MANAGER_H
#include <vector>
#include <memory>
#include "ProjectRenderer.h"
#include "OutputSettings.h"
@@ -70,7 +70,7 @@ private:
ProjectRenderer::ExportFileFormats m_format;
QString m_outputPath;
ProjectRenderer* m_activeRenderer;
std::unique_ptr<ProjectRenderer> m_activeRenderer;
QVector<Track*> m_tracksToRender;
QVector<Track*> m_unmuted;

View File

@@ -23,6 +23,7 @@
*/
#include <memory>
#include <QMessageBox>
#include "ImportFilter.h"
@@ -32,6 +33,8 @@
#include "ProjectJournal.h"
using std::unique_ptr;
ImportFilter::ImportFilter( const QString & _file_name,
const Descriptor * _descriptor ) :
Plugin( _descriptor, NULL ),
@@ -54,7 +57,8 @@ void ImportFilter::import( const QString & _file_to_import,
{
bool successful = false;
char * s = qstrdup( _file_to_import.toUtf8().constData() );
QByteArray s = _file_to_import.toUtf8();
s.detach();
// do not record changes while importing files
const bool j = Engine::projectJournal()->isJournalling();
@@ -62,21 +66,17 @@ void ImportFilter::import( const QString & _file_to_import,
for (const Plugin::Descriptor* desc : pluginFactory->descriptors(Plugin::ImportFilter))
{
Plugin * p = Plugin::instantiate( desc->name, NULL, s );
if( dynamic_cast<ImportFilter *>( p ) != NULL &&
dynamic_cast<ImportFilter *>( p )->tryImport( tc ) == true )
unique_ptr<Plugin> p(Plugin::instantiate( desc->name, NULL, s.data() ));
if( dynamic_cast<ImportFilter *>( p.get() ) != NULL &&
dynamic_cast<ImportFilter *>( p.get() )->tryImport( tc ) )
{
delete p;
successful = true;
break;
}
delete p;
}
Engine::projectJournal()->setJournalling( j );
delete[] s;
if( successful == false )
{
QMessageBox::information( NULL,

View File

@@ -161,9 +161,9 @@ void InstrumentSoundShaping::processAudioBuffer( sampleFrame* buffer,
int old_filter_cut = 0;
int old_filter_res = 0;
if( n->m_filter == NULL )
if( n->m_filter == nullptr )
{
n->m_filter = new BasicFilters<>( Engine::mixer()->processingSampleRate() );
n->m_filter = make_unique<BasicFilters<>>( Engine::mixer()->processingSampleRate() );
}
n->m_filter->setFilterType( m_filterModel.value() );

View File

@@ -53,7 +53,6 @@ NotePlayHandle::NotePlayHandle( InstrumentTrack* instrumentTrack,
PlayHandle( TypeNotePlayHandle, _offset ),
Note( n.length(), n.pos(), n.key(), n.getVolume(), n.getPanning(), n.detuning() ),
m_pluginData( NULL ),
m_filter( NULL ),
m_instrumentTrack( instrumentTrack ),
m_frames( 0 ),
m_totalFramesPlayed( 0 ),
@@ -155,8 +154,6 @@ NotePlayHandle::~NotePlayHandle()
m_subNotes.clear();
delete m_filter;
if( buffer() ) releaseBuffer();
unlock();

View File

@@ -29,6 +29,7 @@
#include "Song.h"
#include "BBTrackContainer.h"
#include "BBTrack.h"
#include "stdshims.h"
RenderManager::RenderManager(
@@ -40,17 +41,13 @@ RenderManager::RenderManager(
m_oldQualitySettings( Engine::mixer()->currentQualitySettings() ),
m_outputSettings(outputSettings),
m_format(fmt),
m_outputPath(outputPath),
m_activeRenderer(NULL)
m_outputPath(outputPath)
{
Engine::mixer()->storeAudioDevice();
}
RenderManager::~RenderManager()
{
delete m_activeRenderer;
m_activeRenderer = NULL;
Engine::mixer()->restoreAudioDevice(); // Also deletes audio dev.
Engine::mixer()->changeQuality( m_oldQualitySettings );
}
@@ -58,7 +55,7 @@ RenderManager::~RenderManager()
void RenderManager::abortProcessing()
{
if ( m_activeRenderer ) {
disconnect( m_activeRenderer, SIGNAL( finished() ),
disconnect( m_activeRenderer.get(), SIGNAL( finished() ),
this, SLOT( renderNextTrack() ) );
m_activeRenderer->abortProcessing();
}
@@ -68,8 +65,7 @@ void RenderManager::abortProcessing()
// Called to render each new track when rendering tracks individually.
void RenderManager::renderNextTrack()
{
delete m_activeRenderer;
m_activeRenderer = NULL;
m_activeRenderer.reset();
if( m_tracksToRender.isEmpty() )
{
@@ -93,7 +89,7 @@ void RenderManager::renderNextTrack()
int trackNum = m_tracksToRender.size() + 1;
// create a renderer for this track
m_activeRenderer = new ProjectRenderer(
m_activeRenderer = make_unique<ProjectRenderer>(
m_qualitySettings,
m_outputSettings,
m_format,
@@ -102,11 +98,11 @@ void RenderManager::renderNextTrack()
if ( m_activeRenderer->isReady() )
{
// pass progress signals through
connect( m_activeRenderer, SIGNAL( progressChanged( int ) ),
connect( m_activeRenderer.get(), SIGNAL( progressChanged( int ) ),
this, SIGNAL( progressChanged( int ) ) );
// when it is finished, render the next track
connect( m_activeRenderer, SIGNAL( finished() ),
connect( m_activeRenderer.get(), SIGNAL( finished() ),
this, SLOT( renderNextTrack() ) );
m_activeRenderer->startProcessing();
@@ -158,7 +154,7 @@ void RenderManager::renderTracks()
// Render the song into a single track
void RenderManager::renderProject()
{
m_activeRenderer = new ProjectRenderer(
m_activeRenderer = make_unique<ProjectRenderer>(
m_qualitySettings,
m_outputSettings,
m_format,
@@ -167,11 +163,11 @@ void RenderManager::renderProject()
if( m_activeRenderer->isReady() )
{
// pass progress signals through
connect( m_activeRenderer, SIGNAL( progressChanged( int ) ),
connect( m_activeRenderer.get(), SIGNAL( progressChanged( int ) ),
this, SIGNAL( progressChanged( int ) ) );
// as we have not queued any tracks, renderNextTrack will just clean up
connect( m_activeRenderer, SIGNAL( finished() ),
connect( m_activeRenderer.get(), SIGNAL( finished() ),
this, SLOT( renderNextTrack() ) );
m_activeRenderer->startProcessing();

View File

@@ -31,6 +31,7 @@
#ifdef LMMS_HAVE_OGGVORBIS
#include <string>
#include <vorbis/vorbisenc.h>
#include "Mixer.h"
@@ -71,9 +72,9 @@ bool AudioFileOgg::startEncoding()
{
vorbis_comment vc;
const char * comments = "Cool=This song has been made using LMMS";
int comment_length = strlen( comments );
char * user_comments = new char[comment_length + 1];
strcpy( user_comments, comments );
std::string user_comments_str(comments);
int comment_length = user_comments_str.size();
char * user_comments = &user_comments_str[0];
vc.user_comments = &user_comments;
vc.comment_lengths = &comment_length;
@@ -113,7 +114,6 @@ bool AudioFileOgg::startEncoding()
printf( "Mode initialization failed: invalid parameters for "
"bitrate\n" );
vorbis_info_clear( &m_vi );
delete[] user_comments;
return false;
}
@@ -169,12 +169,10 @@ bool AudioFileOgg::startEncoding()
{
// clean up
finishEncoding();
delete[] user_comments;
return false;
}
}
delete[] user_comments;
return true;
}