Форум автозвука и установки музыки в автомобиль
Показано с 1 по 10 из 2599

USB DAC и USB Audio для Android

Комбинированный просмотр

  1. #1
    Магнитола SPL Начальник смены
    Репутация Репутация
    Репутация Репутация Репутация Репутация Репутация Репутация Репутация Репутация Репутация Репутация Репутация Репутация Репутация
    Репутация: 288136 Аватар для Pterodon
    Регистрация
    21.08.2010
    Город/село
    Москва
    Сообщений
    2,696
    Спасибо (Раздал)
    1505
    Спасибо (Получил)
    3009

    Re: USB DAC и USB Audio для Android

    aluver, это всё круто, только вот за счёт чего происходит изменение амплитуды? Готовые тексты в интернетах я и сам могу найти


  2. #2
    Активист Бригадир
    Репутация Репутация Репутация Репутация Репутация Репутация Репутация Репутация Репутация Репутация Репутация Репутация Репутация
    Репутация: 66830 Аватар для aluver
    Регистрация
    17.02.2015
    Город/село
    Москва, ЮЗАО
    Сообщений
    581
    Спасибо (Раздал)
    315
    Спасибо (Получил)
    627

    Re: USB DAC и USB Audio для Android

    Цитата Сообщение от Pterodon Посмотреть сообщение
    aluver, это всё круто, только вот за счёт чего происходит изменение амплитуды? Готовые тексты в интернетах я и сам могу найти
    Вопрос не совсем понятен. Программно конечно же. В андроиде, например, за это обычно по умолчанию отвечает AudioManager, а может отвечать и альса - смотря какая конфигурация или как ее настроить... Все можно найти в тех же "интернетах"...
    Чистая арифметика. PCM поток - это просто 44100 значений амплитуды звукового сигнала в секунду, каждое из которых описано 16-битной цифрой. Уменьшил громкость вполовину - софт делит все значения амплитуды потока на 2.


  3. #3
    Магнитола SPL Начальник смены
    Репутация Репутация
    Репутация Репутация Репутация Репутация Репутация Репутация Репутация Репутация Репутация Репутация Репутация Репутация Репутация
    Репутация: 288136 Аватар для Pterodon
    Регистрация
    21.08.2010
    Город/село
    Москва
    Сообщений
    2,696
    Спасибо (Раздал)
    1505
    Спасибо (Получил)
    3009

    Re: USB DAC и USB Audio для Android

    Цитата Сообщение от aluver Посмотреть сообщение
    Вопрос не совсем понятен. Программно конечно же. В андроиде, например, за это обычно по умолчанию отвечает AudioManager, а может отвечать и альса - смотря какая конфигурация или как ее настроить... Все можно найти в тех же "интернетах"...
    Чистая арифметика. PCM поток - это просто 44100 значений амплитуды звукового сигнала в секунду, каждое из которых описано 16-битной цифрой. Уменьшил громкость вполовину - софт делит все значения амплитуды потока на 2.
    Вот теперь я понял. Спасибо


  4. #4
    Авторитет Старший мастер
    Репутация Репутация Репутация
    Репутация Репутация Репутация Репутация Репутация Репутация Репутация Репутация Репутация Репутация Репутация Репутация
    Репутация: 375213
    Регистрация
    02.12.2013
    Город/село
    город-село Москва, ЮЗАО
    Сообщений
    3,757
    Спасибо (Раздал)
    13942
    Спасибо (Получил)
    3582

    Re: USB DAC и USB Audio для Android

    Как мне кажется, aluver, в двух своих ответах все очень правильно описал!


  5. #5
    Ушел в ЛАС Технический директор Array Репутация: лучше не знать Аватар для HoSStiA
    Регистрация
    11.01.2004
    Город/село
    Столиця
    Сообщений
    13,050
    Спасибо (Раздал)
    11289
    Спасибо (Получил)
    14942
    Автор

    Re: USB DAC и USB Audio для Android

    Цитата Сообщение от aluver Посмотреть сообщение
    Вопрос не совсем понятен. Программно конечно же. В андроиде, например, за это обычно по умолчанию отвечает AudioManager, а может отвечать и альса - смотря какая конфигурация или как ее настроить... Все можно найти в тех же "интернетах"...
    Чистая арифметика. PCM поток - это просто 44100 значений амплитуды звукового сигнала в секунду, каждое из которых описано 16-битной цифрой. Уменьшил громкость вполовину - софт делит все значения амплитуды потока на 2.
    В Android-системах с полноценной ALSA установка громкости может происходить и средствами звукового адаптера (через параметры микшера), что выясняется через изучения кода AudioHAL-библиотеки:
    Код:
    status_t ALSAMixer::setMasterVolume(float volume)
    {
        mixer_info_t *info = mixerMasterProp[SND_PCM_STREAM_PLAYBACK].mInfo;
        if (!info || !info->elem) return INVALID_OPERATION;
    
        long minVol = info->min;
        long maxVol = info->max;
    
        // Make sure volume is between bounds.
        long vol = minVol + volume * (maxVol - minVol);
        if (vol > maxVol) vol = maxVol;
        if (vol < minVol) vol = minVol;
    
        info->volume = vol;
        snd_mixer_selem_set_playback_volume_all (info->elem, vol);
    
        return NO_ERROR;
    }
    
    ...
    
    status_t ALSAMixer::setVolume(uint32_t device, float left, float right)
    {
        LOGD("ALSAMixer::setVolume left = %f , right = %f", left, right);
    
        for (int j = 0; mixerProp[j][SND_PCM_STREAM_PLAYBACK].device; j++)
            if (mixerProp[j][SND_PCM_STREAM_PLAYBACK].device & device) {
    
                mixer_info_t *info = mixerProp[j][SND_PCM_STREAM_PLAYBACK].mInfo;
                if (!info || !info->elem) return INVALID_OPERATION;
    
                long minVol = info->min;
                long maxVol = info->max;
    
                // Make sure volume is between bounds.
                long vol = minVol + left * (maxVol - minVol);
                if (vol > maxVol) vol = maxVol;
                if (vol < minVol) vol = minVol;
    
                //add by chenjq
                snd_ctl_elem_info_t *ctl_info;
                snd_hctl_elem_t *hctl_elem;
                unsigned int Nmax = 6, N = left * 5 + 1, *tlv;
                float dB_min, dB_max, dB_vol, dB_step, e = 2.71828;
                int err;
    
                if (((selem_none_t *)snd_mixer_elem_get_private(info->elem))->ctls[CTL_GLOBAL_VOLUME].elem) {
                   hctl_elem = ((selem_none_t *)snd_mixer_elem_get_private(info->elem))->ctls[CTL_GLOBAL_VOLUME].elem;
                } else if (((selem_none_t *)snd_mixer_elem_get_private(info->elem))->ctls[CTL_PLAYBACK_VOLUME].elem) {
                    hctl_elem = ((selem_none_t *)snd_mixer_elem_get_private(info->elem))->ctls[CTL_PLAYBACK_VOLUME].elem;
                } else if (((selem_none_t *)snd_mixer_elem_get_private(info->elem))->ctls[CTL_CAPTURE_VOLUME].elem) {
                    hctl_elem = ((selem_none_t *)snd_mixer_elem_get_private(info->elem))->ctls[CTL_CAPTURE_VOLUME].elem;
                } else {
                    LOGE("snd_mixer_elem_get_private(info->elem)->ctls[type].elem type error");
                    goto __skip_tlv;
                }
    
                snd_ctl_elem_info_alloca(&ctl_info);
                if ((err = snd_hctl_elem_info(hctl_elem, ctl_info)) < 0) { //snd_hctl_elem_t
                    LOGE("snd_hctl_elem_info error: %s", snd_strerror(err));
                    goto __skip_tlv;
                }
    
                if (!snd_ctl_elem_info_is_tlv_readable(ctl_info))
                    goto __skip_tlv;
    
                tlv = (unsigned int *)malloc(4096);
    
                if ((err = snd_hctl_elem_tlv_read(hctl_elem, tlv, 4096)) < 0) {
                    LOGE("element TLV read error: %s", snd_strerror(err));
                    free(tlv);
                    goto __skip_tlv;
                }
                /*
                 * change vol to fix setting incall volume error
                 */
    
                dB_min = (int)tlv[2];
                dB_step = tlv[3] & 0xffff;
                dB_min /= 100;
                dB_step /= 100;
                dB_max = dB_min + dB_step * (info->max - info->min);
    
                dB_vol = 20 * log((Nmax * pow(e, dB_min / 20) + N * (pow(e, dB_max / 20) - pow(e, dB_min / 20))) / Nmax);
    
                vol = (long)(info->min + (dB_vol - dB_min) / dB_step);
    
                LOGD("min = %d.%02ddB, step = %d.%02ddB, mute = %d",
                    ((int)tlv[2]) / 100, (((int)tlv[2]) ? -((int)tlv[2]) : ((int)tlv[2])) % 100,
                    (tlv[3] & 0xffff) / 100, ((tlv[3] & 0xffff) ? -(tlv[3] & 0xffff) : (tlv[3] & 0xffff)) % 100,
                    (tlv[3] >> 16) & 1);
    
                LOGD("dB_min = %f, dB_step = %f, dB_max = %f, dB_vol = %f",
                    dB_min,
                    dB_step,
                    dB_max,
                    dB_vol);
    
                LOGD("N = %d, vol = %ld", N, vol);
                free(tlv);
    
    __skip_tlv:
                //add by chenjq end
    
                info->volume = vol;
                snd_mixer_selem_set_playback_volume_all (info->elem, vol);
            }
    
        return NO_ERROR;
    }
    , что предопределено на уровне AudioFlinger, через который по умолчанию оперирует AudioManager (в частности, AudioSystem::setStreamVolume):
    Код:
    status_t AudioSystem::setStreamVolume(audio_stream_type_t stream, float value,
            audio_io_handle_t output)
    {
        if (uint32_t(stream) >= AUDIO_STREAM_CNT) return BAD_VALUE;
        const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger();
        if (af == 0) return PERMISSION_DENIED;
        af->setStreamVolume(stream, value, output);
        return NO_ERROR;
    }
    
    ...
    
    
    status_t AudioFlinger::setMasterVolume(float value)
    {
        status_t ret = initCheck();
        if (ret != NO_ERROR) {
            return ret;
        }
    
        // check calling permissions
        if (!settingsAllowed()) {
            return PERMISSION_DENIED;
        }
    
        Mutex::Autolock _l(mLock);
        mMasterVolume = value;
    
        // Set master volume in the HALs which support it.
        for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
            AutoMutex lock(mHardwareLock);
            AudioHwDevice *dev = mAudioHwDevs.valueAt(i);
    
            mHardwareStatus = AUDIO_HW_SET_MASTER_VOLUME;
            if (dev->canSetMasterVolume()) {
                dev->hwDevice()->set_master_volume(dev->hwDevice(), value);
            }
            mHardwareStatus = AUDIO_HW_IDLE;
        // Now set the master volume in each playback thread.  Playback threads
        // assigned to HALs which do not have master volume support will apply
        // master volume during the mix operation.  Threads with HALs which do
        // support master volume will simply ignore the setting.
        for (size_t i = 0; i < mPlaybackThreads.size(); i++)
            mPlaybackThreads.valueAt(i)->setMasterVolume(value);
    
        return NO_ERROR;
    }
    Следовательно, управление громкостью звука в системах с Android OS может быть передано звуковому адаптеру, в котором данная функция реализована аппаратно.


  6. #6
    Активист Бригадир
    Репутация Репутация Репутация Репутация Репутация Репутация Репутация Репутация Репутация Репутация Репутация Репутация Репутация
    Репутация: 66830 Аватар для aluver
    Регистрация
    17.02.2015
    Город/село
    Москва, ЮЗАО
    Сообщений
    581
    Спасибо (Раздал)
    315
    Спасибо (Получил)
    627

    Re: USB DAC и USB Audio для Android

    Цитата Сообщение от HoSStiA Посмотреть сообщение
    В Android-системах с полноценной ALSA установка громкости может происходить и средствами звукового адаптера (через параметры микшера)
    По этому поводу возникает вопрос. В случае, если я регулирую громкость через микшер самой ALSA, то как определить, регулируется ли она программно, либо аппаратно? Сам до сих пор думал, - что только располагая знаниями об аппаратной возможности такого устройства.
    И совсем уж глупый вопрос. Если устройство все-таки может регулировать громкость аппаратно, то есть ли разница в получаемом результате между симпл-контролами и обычными контролами микшера альсы при их использовании?
    Например:
    alsa_amixer -c2 sset 'PCM' 90%
    или
    alsa_amixer -c2 cset numid=0 90%
    (описание параметров amixer на примере линукс)

    Про регулировку громкости на HiFimeDIY Sabre U2 на сайте производителя сказано лишь
    Volume Level is controlled by the normal volume control keys on your computer. (no need to use the volume control inside iTunes etc.) - See more at: http://hifimediy.com/DACs/ready-made....RThRHnDm.dpuf
    А вот например в описании HiFime 9018 Asynchronous High resolution USB DAC уже есть кое-то, но не совсем понятное:
    Volume level responds to computer hot keys, -however only in 8 steps. This is the behaviour of SA9227 USB receiver. You can fine tune volume level in software. - See more at: http://hifimediy.com/DACs/ready-made....f3jxqg1s.dpuf
    А вот в третьем примере, с HiFime 9018D USB DAC, объяснено поинтереснее:
    ...has a digital controlled lossless volume control...
    255 steps volume control with MCU
    This DAC utilises a ultra low power MCU chip to control the volume level output from the DAC chip, from 0-127.5dB in 0.5dB steps. This is different from controlling volume at USB level which reduces the signal level going into the DAC chip and causes loss of dynamic range and lower SNR when volume is reduced. Using a digital volume control this way will be better than an analog one unless you have a analog volume control that has a lower noise floor than the DAC itself. You would need a exceptionally low noise analog volume control to beat the Sabre chip impressive -127dB. An explanation from Sabre chip makes ESS Technology: http://www.esstech.com/PDF/digital-v...me-control.pdf - See more at: http://hifimediy.com/DACs/ready-made....foo4jiXE.dpuf
    Но опять же, при регулировке громкости на стороне Андроид, эти плюшки задействоваться, судя по всему, не будут. Поправьте меня, если я не прав. Где найти такой девайс, который бы без потерь управлялся по громкости из андроид? А если еще и не в аналоге, а в цифре для дальнейшего вывода по оптике? Такой точно не найдем... А ужас пятиметрового шнурка USB до багажника нам точно не нужен.
    Цитата Сообщение от HoSStiA Посмотреть сообщение
    Следовательно, управление громкостью звука в системах с Android OS может быть передано звуковому адаптеру, в котором данная функция реализована аппаратно.
    Вот и выходит, что смысла оно все равно для Android'ных инсталлов не имеет. Проще сделать софтовую цифровую регулировку с предварительным увеличением битности.
    Если только... не найдется чудо-девайса, который сам внутри себя будет апсемплить полученный сигнал, и уже после регулировать громкость, опираясь на значения контролов микшера, получаемых из андроида по USB.


  7. #7
    Энтузиаст Установщик
    Репутация Репутация Репутация Репутация Репутация Репутация Репутация
    Репутация: 3262 Аватар для Рус1
    Регистрация
    24.02.2011
    Город/село
    Оренбургская обл.
    Сообщений
    113
    Спасибо (Раздал)
    19
    Спасибо (Получил)
    30

    Re: USB DAC и USB Audio для Android

    ,aluver,
    Как у вас на rk3066 происходит отключение usb plaer pro ?
    И отключается ли дак с отключением ГУ ?


  8. #8
    Активист Бригадир
    Репутация Репутация Репутация Репутация Репутация Репутация Репутация Репутация Репутация Репутация Репутация Репутация Репутация
    Репутация: 66830 Аватар для aluver
    Регистрация
    17.02.2015
    Город/село
    Москва, ЮЗАО
    Сообщений
    581
    Спасибо (Раздал)
    315
    Спасибо (Получил)
    627

    Re: USB DAC и USB Audio для Android

    Цитата Сообщение от Рус1 Посмотреть сообщение
    ,aluver,
    Как у вас на rk3066 происходит отключение usb plaer pro ?
    И отключается ли дак с отключением ГУ ?
    USB Audio Player Pro не устанавливал на ГУ. Ничего не могу сказать. Пробовать пока не имею возможности.


  9. #9
    Энтузиаст Установщик
    Репутация Репутация Репутация Репутация Репутация Репутация Репутация
    Репутация: 3262 Аватар для Рус1
    Регистрация
    24.02.2011
    Город/село
    Оренбургская обл.
    Сообщений
    113
    Спасибо (Раздал)
    19
    Спасибо (Получил)
    30

    Re: USB DAC и USB Audio для Android

    Цитата Сообщение от aluver Посмотреть сообщение
    USB Audio Player Pro не устанавливал на ГУ. Ничего не могу сказать. Пробовать пока не имею возможности.
    Чем пользуетесь ?
    Онкио ? Хибби ?


Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  
  cc by-nc-sa