mirror of
https://github.com/cookiengineer/audacity
synced 2025-04-30 07:39:42 +02:00
166 lines
5.3 KiB
C++
166 lines
5.3 KiB
C++
/**********************************************************************
|
|
|
|
Audacity: A Digital Audio Editor
|
|
|
|
SampleBlock.h
|
|
|
|
**********************************************************************/
|
|
|
|
#ifndef __AUDACITY_SAMPLE_BLOCK__
|
|
#define __AUDACITY_SAMPLE_BLOCK__
|
|
|
|
#include "audacity/Types.h"
|
|
|
|
#include <functional>
|
|
#include <memory>
|
|
#include <unordered_set>
|
|
|
|
class AudacityProject;
|
|
class ProjectFileIO;
|
|
class XMLWriter;
|
|
|
|
class SampleBlock;
|
|
using SampleBlockPtr = std::shared_ptr<SampleBlock>;
|
|
class SampleBlockFactory;
|
|
using SampleBlockFactoryPtr = std::shared_ptr<SampleBlockFactory>;
|
|
using SampleBlockFactoryFactory =
|
|
std::function< SampleBlockFactoryPtr( AudacityProject& ) >;
|
|
|
|
using SampleBlockID = long long;
|
|
|
|
class MinMaxRMS
|
|
{
|
|
public:
|
|
float min = 0;
|
|
float max = 0;
|
|
float RMS = 0;
|
|
};
|
|
|
|
class SqliteSampleBlockFactory;
|
|
|
|
///\brief Abstract class allows access to contents of a block of sound samples,
|
|
/// serialization as XML, and reference count management that can suppress
|
|
/// reclamation of its storage
|
|
class SampleBlock
|
|
{
|
|
public:
|
|
virtual ~SampleBlock();
|
|
|
|
virtual void CloseLock() = 0;
|
|
|
|
virtual SampleBlockID GetBlockID() const = 0;
|
|
|
|
// If !mayThrow and there is an error, ignores it and returns zero.
|
|
// That may be appropriate when only attempting to display samples, not edit.
|
|
size_t GetSamples(samplePtr dest,
|
|
sampleFormat destformat,
|
|
size_t sampleoffset,
|
|
size_t numsamples, bool mayThrow = true);
|
|
|
|
virtual size_t GetSampleCount() const = 0;
|
|
|
|
//! Non-throwing, should fill with zeroes on failure
|
|
virtual bool
|
|
GetSummary256(float *dest, size_t frameoffset, size_t numframes) = 0;
|
|
//! Non-throwing, should fill with zeroes on failure
|
|
virtual bool
|
|
GetSummary64k(float *dest, size_t frameoffset, size_t numframes) = 0;
|
|
|
|
/// Gets extreme values for the specified region
|
|
// If !mayThrow and there is an error, ignores it and returns zeroes.
|
|
// That may be appropriate when only attempting to display samples, not edit.
|
|
MinMaxRMS GetMinMaxRMS(
|
|
size_t start, size_t len, bool mayThrow = true);
|
|
|
|
/// Gets extreme values for the entire block
|
|
// If !mayThrow and there is an error, ignores it and returns zeroes.
|
|
// That may be appropriate when only attempting to display samples, not edit.
|
|
MinMaxRMS GetMinMaxRMS(bool mayThrow = true) const;
|
|
|
|
virtual size_t GetSpaceUsage() const = 0;
|
|
|
|
virtual void SaveXML(XMLWriter &xmlFile) = 0;
|
|
|
|
protected:
|
|
virtual size_t DoGetSamples(samplePtr dest,
|
|
sampleFormat destformat,
|
|
size_t sampleoffset,
|
|
size_t numsamples) = 0;
|
|
|
|
virtual MinMaxRMS DoGetMinMaxRMS(size_t start, size_t len) = 0;
|
|
|
|
virtual MinMaxRMS DoGetMinMaxRMS() const = 0;
|
|
};
|
|
|
|
// Makes a useful function object
|
|
inline std::function< void(const SampleBlock&) >
|
|
BlockSpaceUsageAccumulator (unsigned long long &total)
|
|
{
|
|
return [&total]( const SampleBlock &block ){
|
|
total += block.GetSpaceUsage();
|
|
};
|
|
};
|
|
|
|
///\brief abstract base class with methods to produce @ref SampleBlock objects
|
|
class SampleBlockFactory
|
|
{
|
|
public:
|
|
// Install global function that produces a sample block factory object for
|
|
// a given project; the factory has methods that later make sample blocks.
|
|
// Return the previously installed factory.
|
|
static SampleBlockFactoryFactory RegisterFactoryFactory(
|
|
SampleBlockFactoryFactory newFactory );
|
|
|
|
// Invoke the installed factory (throw an exception if none was installed)
|
|
static SampleBlockFactoryPtr New( AudacityProject &project );
|
|
|
|
virtual ~SampleBlockFactory();
|
|
|
|
// Returns a non-null pointer or else throws an exception
|
|
SampleBlockPtr Create(constSamplePtr src,
|
|
size_t numsamples,
|
|
sampleFormat srcformat);
|
|
|
|
// Returns a non-null pointer or else throws an exception
|
|
SampleBlockPtr CreateSilent(
|
|
size_t numsamples,
|
|
sampleFormat srcformat);
|
|
|
|
// Returns a non-null pointer or else throws an exception
|
|
SampleBlockPtr CreateFromXML(
|
|
sampleFormat srcformat,
|
|
const wxChar **attrs);
|
|
|
|
using SampleBlockIDs = std::unordered_set<SampleBlockID>;
|
|
/*! @return ids of all sample blocks created by this factory and still extant */
|
|
virtual SampleBlockIDs GetActiveBlockIDs() = 0;
|
|
|
|
//! Type of function that is informed when a block is about to be deleted
|
|
using BlockDeletionCallback = std::function< void(const SampleBlock&) >;
|
|
|
|
//! Install a callback, returning the previously installed callback
|
|
virtual BlockDeletionCallback SetBlockDeletionCallback(
|
|
BlockDeletionCallback callback ) = 0;
|
|
|
|
protected:
|
|
// The override should throw more informative exceptions on error than the
|
|
// default InconsistencyException thrown by Create
|
|
virtual SampleBlockPtr DoCreate(constSamplePtr src,
|
|
size_t numsamples,
|
|
sampleFormat srcformat) = 0;
|
|
|
|
// The override should throw more informative exceptions on error than the
|
|
// default InconsistencyException thrown by CreateSilent
|
|
virtual SampleBlockPtr DoCreateSilent(
|
|
size_t numsamples,
|
|
sampleFormat srcformat) = 0;
|
|
|
|
// The override should throw more informative exceptions on error than the
|
|
// default InconsistencyException thrown by CreateFromXML
|
|
virtual SampleBlockPtr DoCreateFromXML(
|
|
sampleFormat srcformat,
|
|
const wxChar **attrs) = 0;
|
|
};
|
|
|
|
#endif
|