summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/ardour/ardour/audioregion.h6
-rw-r--r--libs/ardour/ardour/coreaudiosource.h2
-rw-r--r--libs/ardour/ardour/sndfilesource.h1
-rw-r--r--libs/ardour/audioregion.cc31
4 files changed, 39 insertions, 1 deletions
diff --git a/libs/ardour/ardour/audioregion.h b/libs/ardour/ardour/audioregion.h
index 8e510b3e43..086544f3aa 100644
--- a/libs/ardour/ardour/audioregion.h
+++ b/libs/ardour/ardour/audioregion.h
@@ -73,7 +73,11 @@ class LIBARDOUR_API AudioRegion : public Region
bool speed_mismatch (float) const;
boost::shared_ptr<AudioSource> audio_source (uint32_t n=0) const;
-
+
+ // if several audio files associated with a region,
+ // information about file with MAX channel count will be provided
+ uint32_t get_related_audio_file_channel_count () const;
+
void set_scale_amplitude (gain_t);
gain_t scale_amplitude() const { return _scale_amplitude; }
diff --git a/libs/ardour/ardour/coreaudiosource.h b/libs/ardour/ardour/coreaudiosource.h
index 5e8e696bf9..44016b46a4 100644
--- a/libs/ardour/ardour/coreaudiosource.h
+++ b/libs/ardour/ardour/coreaudiosource.h
@@ -39,6 +39,8 @@ class LIBARDOUR_API CoreAudioSource : public AudioFileSource {
float sample_rate() const;
int update_header (framepos_t when, struct tm&, time_t);
+ uint32_t channel_count () const { return n_channels; }
+
int flush_header () {return 0;};
void set_header_timeline_position () {};
bool clamped_at_unity () const { return false; }
diff --git a/libs/ardour/ardour/sndfilesource.h b/libs/ardour/ardour/sndfilesource.h
index 5a4a11515c..45e049e35f 100644
--- a/libs/ardour/ardour/sndfilesource.h
+++ b/libs/ardour/ardour/sndfilesource.h
@@ -66,6 +66,7 @@ class LIBARDOUR_API SndFileSource : public AudioFileSource {
bool set_destructive (bool yn);
bool one_of_several_channels () const;
+ uint32_t channel_count () const { return _info.channels; }
bool clamped_at_unity () const;
diff --git a/libs/ardour/audioregion.cc b/libs/ardour/audioregion.cc
index 8113b261f9..13576c3ca5 100644
--- a/libs/ardour/audioregion.cc
+++ b/libs/ardour/audioregion.cc
@@ -49,6 +49,9 @@
#include "ardour/parameter_descriptor.h"
#include "ardour/progress.h"
+#include "ardour/sndfilesource.h"
+#include "ardour/coreaudiosource.h"
+
#include "i18n.h"
#include <locale.h>
@@ -1562,6 +1565,34 @@ AudioRegion::audio_source (uint32_t n) const
return boost::dynamic_pointer_cast<AudioSource>(source(n));
}
+uint32_t
+AudioRegion::get_related_audio_file_channel_count () const
+{
+ uint32_t chan_count = 0;
+ for (SourceList::const_iterator i = _sources.begin(); i != _sources.end(); ++i) {
+
+ boost::shared_ptr<SndFileSource> sndf = dynamic_pointer_cast<SndFileSource>(*i);
+ if (sndf ) {
+
+ if (sndf->channel_count() > chan_count) {
+ chan_count = sndf->channel_count();
+ }
+ }
+#ifdef HAVE_COREAUDIO
+ else {
+ boost::shared_ptr<CoreAudioSource> cauf = dynamic_pointer_cast<CoreAudioSource>(*i);
+ if (cauf) {
+ if (cauf->channel_count() > chan_count) {
+ chan_count = cauf->channel_count();
+ }
+ }
+ }
+#endif // HAVE_COREAUDIO
+ }
+
+ return chan_count;
+}
+
int
AudioRegion::adjust_transients (frameoffset_t delta)
{