/*
NAME
  audio_linux.go

AUTHORS
  Alan Noble <alan@ausocean.org>
  Trek Hopton <trek@ausocean.org>

LICENSE
  revid is Copyright (C) 2019 the Australian Ocean Lab (AusOcean)

  It is free software: you can redistribute it and/or modify them
  under the terms of the GNU General Public License as published by the
  Free Software Foundation, either version 3 of the License, or (at your
  option) any later version.

  It is distributed in the hope that it will be useful, but WITHOUT
  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
  for more details.

  You should have received a copy of the GNU General Public License
  in gpl.txt.  If not, see http://www.gnu.org/licenses.
*/

package revid

import (
	"fmt"
	"strconv"

	"bitbucket.org/ausocean/av/codec/codecutil"
	"bitbucket.org/ausocean/av/container/mts"
	"bitbucket.org/ausocean/av/device"
	"bitbucket.org/ausocean/av/device/alsa"
	"bitbucket.org/ausocean/utils/logger"
)

func (r *Revid) setupAudio() error {
	// Create new ALSA device.
	d := alsa.New(r.cfg.Logger)
	r.input = d

	// Configure ALSA device.
	r.cfg.Logger.Log(logger.Debug, "configuring input device")
	err := d.Setup(r.cfg)
	if _, ok := err.(device.MultiError); err != nil && ok {
		r.cfg.Logger.Log(logger.Warning, "errors from configuring input device", "errors", err)
	} else if err != nil {
		return err
	}
	r.cfg.Logger.Log(logger.Info, "input device configured")

	// Set revid's lexer.
	l, err := codecutil.NewByteLexer(d.DataSize())
	if err != nil {
		return err
	}
	r.lexTo = l.Lex

	// Add metadata.
	mts.Meta.Add("sampleRate", strconv.Itoa(int(r.cfg.SampleRate)))
	mts.Meta.Add("channels", strconv.Itoa(int(r.cfg.Channels)))
	mts.Meta.Add("period", fmt.Sprintf("%.6f", r.cfg.RecPeriod))
	mts.Meta.Add("bitDepth", strconv.Itoa(int(r.cfg.BitDepth)))

	switch r.cfg.InputCodec {
	case codecutil.PCM:
		mts.Meta.Add("codec", "pcm")
	case codecutil.ADPCM:
		mts.Meta.Add("codec", "adpcm")
	default:
		r.cfg.Logger.Log(logger.Fatal, "no audio codec set in config")
	}

	return nil
}