Преобразование одного плавающего числа в java со знаком PCM, сокращенно javax.sampled. SourceDataLine имеет слишком много строк? - PullRequest
0 голосов
/ 13 февраля 2020

В качестве отправной точки у меня есть метод, который работает. Но, похоже, слишком много строк или перекрывающихся действий. Если вы мастер аудио, вы сразу же увидите, как все это сделать. Так как же это свести?

public static byte[] float16toDualByte(byte[] twoPlaces, float f_val) {

    short val_as_short = (short) (f_val * 32768);//signed short.16bit.

    twoPlaces[0] = (byte) (val_as_short >>> 8);
    twoPlaces[1] = (byte) val_as_short;

    ByteBuffer buf = ByteBuffer.wrap(twoPlaces);
    buf.order(ByteOrder.LITTLE_ENDIAN);
    short turned = buf.asShortBuffer().get(0);

    twoPlaces[0] = (byte) (turned >>> 8);
    twoPlaces[1] = (byte) turned;
    return twoPlaces;

}

1 Ответ

0 голосов
/ 13 февраля 2020

Я обнаружил у soft идею, что превратить масштабированный float первым в int. И это сработало! Этот метод дает массив из двух байтов, готовый для записи в javax.sound.sampled.SourceDataLine. Эти два байта представляют один монофрейм. С SourceDataLine нужно понять одну вещь: это имя дается с точки зрения физической звуковой карты. Этот человечек внутри звуковой карты, ожидающий передачи образца в разъем. С точки зрения пользователя это означает вывод на звуковую карту.

  public byte[] simpleSwap(byte[] twoPlaces, float f_val) {

    int val_as_short = (int) (f_val * 32768);//signed short.16bit as int.
    int swapped = ((val_as_short >> 8) & 0xff) | ((val_as_short & 0xff) << 8);
    twoPlaces[0] = (byte) (swapped >>> 8);
    twoPlaces[1] = (byte) swapped;
    return twoPlaces;

}
...