1 #include "CoreAudioRenderer.h"
2 #include <iostream>
3 using namespace std;
4 #include <unistd.h>
5 
6 extern "C" {
7 #include "cmus/op.h"
8 #include "cmus/mixer.h"
9 }
10 
11 const char* program_name = "CoreAudioRenderer";
12 
CoreAudioRenderer()13 CoreAudioRenderer::CoreAudioRenderer()
14 {
15     op_pcm_ops.init();
16     op_mixer_ops.init();
17 }
18 
~CoreAudioRenderer()19 CoreAudioRenderer::~CoreAudioRenderer()
20 {
21     Close();
22     op_pcm_ops.exit();
23     op_mixer_ops.exit();
24 }
25 
Open()26 ErrorCode CoreAudioRenderer::Open()
27 {
28     int maxVol = 0;
29     op_mixer_ops.open(&maxVol);
30     return ErrorCode::Ok;
31 }
32 
Close()33 void CoreAudioRenderer::Close()
34 {
35     op_mixer_ops.close();
36 }
37 
Setup(int32_t & channels,int32_t & sampleRate,int32_t & bitsPerSample)38 ErrorCode CoreAudioRenderer::Setup(int32_t& channels, int32_t& sampleRate, int32_t& bitsPerSample)
39 {
40     op_pcm_ops.drop();
41     op_pcm_ops.close();
42 
43     const sample_format_t sf = sf_bits(bitsPerSample) | sf_rate(sampleRate) | sf_channels(channels) | sf_signed(1);
44     op_pcm_ops.open(sf, nullptr);
45 
46     return ErrorCode::Ok;
47 }
48 
Write(const char * buf,uint32_t len)49 ErrorCode CoreAudioRenderer::Write(const char* buf, uint32_t len)
50 {
51     op_pcm_ops.write(buf, static_cast<int>(len));
52     op_pcm_wait(len);
53     return ErrorCode::Ok;
54 }
55 
VolumeLevel() const56 int CoreAudioRenderer::VolumeLevel() const
57 {
58     int l, r;
59     op_mixer_ops.get_volume(&l, &r);
60     return (l + r) / 2;
61 }
62 
SetVolumeLevel(int avg)63 void CoreAudioRenderer::SetVolumeLevel(int avg)
64 {
65     op_mixer_ops.set_volume(avg, avg);
66 }
67 
Options() const68 std::vector<const BaseOption*> CoreAudioRenderer::Options() const
69 {
70     return {};
71 }
72