summaryrefslogtreecommitdiff
path: root/firmware/target/hosted/ibasso/audiohw-ibasso.c
blob: 447e133eba36b4f7e51976ad92d640005039eaaa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/***************************************************************************
 *             __________               __   ___
 *   Open      \______   \ ____   ____ |  | _\_ |__   _______  ___
 *   Source     |       _//  _ \_/ ___\|  |/ /| __ \ /  _ \  \/  /
 *   Jukebox    |    |   (  <_> )  \___|    < | \_\ (  <_> > <  <
 *   Firmware   |____|_  /\____/ \___  >__|_ \|___  /\____/__/\_ \
 *                     \/            \/     \/    \/            \/
 *
 * Copyright (C) 2014 by Ilia Sergachev: Initial Rockbox port to iBasso DX50
 * Copyright (C) 2014 by Mario Basister: iBasso DX90 port
 * Copyright (C) 2014 by Simon Rothen: Initial Rockbox repository submission, additional features
 * Copyright (C) 2014 by Udo Schläpfer: Code clean up, additional features
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ****************************************************************************/


#include "config.h"
#include "debug.h"
#include "pcm_sw_volume.h"
#include "settings.h"

#include "debug-ibasso.h"
#include "pcm-ibasso.h"


void audiohw_close(void)
{
    TRACE;

    pcm_close_device();
}


void set_software_volume(void)
{
    /* -73dB (?) minimum software volume in decibels. See pcm-internal.h. */
    static const int SW_VOLUME_MIN = 730;

    int sw_volume_l = 0;
    int sw_volume_r = 0;

    if(global_settings.balance > 0)
    {
        if(global_settings.balance == 100)
        {
            sw_volume_l = PCM_MUTE_LEVEL;
        }
        else
        {
            sw_volume_l -= SW_VOLUME_MIN * global_settings.balance / 100;
        }
    }
    else if(global_settings.balance < 0)
    {
        if(global_settings.balance == -100)
        {
            sw_volume_r = PCM_MUTE_LEVEL;
        }
        else
        {
            sw_volume_r = SW_VOLUME_MIN * global_settings.balance / 100;
        }
    }

    DEBUGF("DEBUG %s: global_settings.balance: %d, sw_volume_l: %d, sw_volume_r: %d.",
           __func__,
           global_settings.balance,
           sw_volume_l,
           sw_volume_r);

    /* Emulate balance with software volume. */
    pcm_set_master_volume(sw_volume_l, sw_volume_r);
}