summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2015-05-05 01:02:22 +0200
committerwm4 <wm4@nowhere>2015-05-05 01:11:16 +0200
commit305a85cc9aa169a75317acb55e539f49d420f629 (patch)
tree607f68bf596e7a18519dcbd12b31142db7dadede
parentf719b8164df707dbfbaeec2a9b1e785a9080a23a (diff)
downloadmpv-305a85cc9aa169a75317acb55e539f49d420f629.tar.bz2
mpv-305a85cc9aa169a75317acb55e539f49d420f629.tar.xz
ao_coreaudio_utils: add a format negotiation helper function
-rw-r--r--audio/out/ao_coreaudio_utils.c34
-rw-r--r--audio/out/ao_coreaudio_utils.h3
2 files changed, 37 insertions, 0 deletions
diff --git a/audio/out/ao_coreaudio_utils.c b/audio/out/ao_coreaudio_utils.c
index 21ffbf0dc8..79189380ab 100644
--- a/audio/out/ao_coreaudio_utils.c
+++ b/audio/out/ao_coreaudio_utils.c
@@ -268,6 +268,40 @@ void ca_print_asbd(struct ao *ao, const char *description,
talloc_free(format);
}
+// Return whether new is an improvement over old (req is the requested format).
+bool ca_asbd_is_better(AudioStreamBasicDescription *req,
+ AudioStreamBasicDescription *old,
+ AudioStreamBasicDescription *new)
+{
+ if (req->mFormatID != new->mFormatID)
+ return false;
+
+ int mpfmt_req = ca_asbd_to_mp_format(old);
+ int mpfmt_new = ca_asbd_to_mp_format(new);
+ if (!mpfmt_new)
+ return false;
+
+ if (mpfmt_req != mpfmt_new) {
+ int mpfmt_old = ca_asbd_to_mp_format(old);
+ if (af_format_conversion_score(mpfmt_req, mpfmt_old) >
+ af_format_conversion_score(mpfmt_req, mpfmt_new))
+ return false;
+ }
+
+ if (req->mSampleRate != new->mSampleRate) {
+ if (old->mSampleRate > new->mSampleRate)
+ return false;
+ }
+
+ if (req->mChannelsPerFrame != new->mChannelsPerFrame) {
+ if (old->mChannelsPerFrame > new->mChannelsPerFrame ||
+ new->mChannelsPerFrame > MP_NUM_CHANNELS)
+ return false;
+ }
+
+ return true;
+}
+
int64_t ca_frames_to_us(struct ao *ao, uint32_t frames)
{
return frames / (float) ao->samplerate * 1e6;
diff --git a/audio/out/ao_coreaudio_utils.h b/audio/out/ao_coreaudio_utils.h
index b5f8e7f2ba..2e87cb472d 100644
--- a/audio/out/ao_coreaudio_utils.h
+++ b/audio/out/ao_coreaudio_utils.h
@@ -58,6 +58,9 @@ void ca_print_asbd(struct ao *ao, const char *description,
bool ca_asbd_equals(const AudioStreamBasicDescription *a,
const AudioStreamBasicDescription *b);
int ca_asbd_to_mp_format(const AudioStreamBasicDescription *asbd);
+bool ca_asbd_is_better(AudioStreamBasicDescription *req,
+ AudioStreamBasicDescription *old,
+ AudioStreamBasicDescription *new);
int64_t ca_frames_to_us(struct ao *ao, uint32_t frames);
int64_t ca_get_latency(const AudioTimeStamp *ts);