// Code generated by protoc-gen-go. DO NOT EDIT.
// source: chromiumos/config/api/software/audio_config.proto

package software

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	public_replication "go.chromium.org/chromiumos/config/go/public_replication"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

// Note that all files should be specified as paths relative to the root of a
// chromiumos checkout, e.g. "src/overlays/overlay-<target>/audio/HiFi.conf".
type AudioConfig struct {
	// Configures fields of AudioConfig that are made public.
	PublicReplication *public_replication.PublicReplication `protobuf:"bytes,9,opt,name=public_replication,json=publicReplication,proto3" json:"public_replication,omitempty"`
	// The name of the audio card.
	CardName string `protobuf:"bytes,1,opt,name=card_name,json=cardName,proto3" json:"card_name,omitempty"`
	// Path to the CRAS card configuration file.
	// See
	// https://chromium.googlesource.com/chromiumos/third_party/adhd/+/HEAD/cras/#card-configuration.
	CardConfigFile string `protobuf:"bytes,2,opt,name=card_config_file,json=cardConfigFile,proto3" json:"card_config_file,omitempty"`
	// Path to the dsp.ini configuration file.
	DspFile string `protobuf:"bytes,3,opt,name=dsp_file,json=dspFile,proto3" json:"dsp_file,omitempty"`
	// Path to the UCM file. Note that this is the UCM verb file (e.g.
	// "HiFi.conf"), NOT the UCM master file (e.g. <sound card name>.conf).
	UcmFile string `protobuf:"bytes,4,opt,name=ucm_file,json=ucmFile,proto3" json:"ucm_file,omitempty"`
	// Path to the UCM master file (e.g. <sound card name>.conf).
	UcmMasterFile string `protobuf:"bytes,5,opt,name=ucm_master_file,json=ucmMasterFile,proto3" json:"ucm_master_file,omitempty"`
	// UCM suffix, if any.
	UcmSuffix string `protobuf:"bytes,6,opt,name=ucm_suffix,json=ucmSuffix,proto3" json:"ucm_suffix,omitempty"`
	// Path to the ALSA module config file.
	ModuleFile string `protobuf:"bytes,7,opt,name=module_file,json=moduleFile,proto3" json:"module_file,omitempty"`
	// Path to the boards specific settings board.ini file.
	BoardFile string `protobuf:"bytes,8,opt,name=board_file,json=boardFile,proto3" json:"board_file,omitempty"`
	// Path to the sound_card_init config (e.g. <card_id>.yaml).
	SoundCardInitFile string `protobuf:"bytes,10,opt,name=sound_card_init_file,json=soundCardInitFile,proto3" json:"sound_card_init_file,omitempty"`
	// The short name of sound card.
	CardId               string   `protobuf:"bytes,11,opt,name=card_id,json=cardId,proto3" json:"card_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *AudioConfig) Reset()         { *m = AudioConfig{} }
func (m *AudioConfig) String() string { return proto.CompactTextString(m) }
func (*AudioConfig) ProtoMessage()    {}
func (*AudioConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_c0f10fd6e3e19027, []int{0}
}

func (m *AudioConfig) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_AudioConfig.Unmarshal(m, b)
}
func (m *AudioConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_AudioConfig.Marshal(b, m, deterministic)
}
func (m *AudioConfig) XXX_Merge(src proto.Message) {
	xxx_messageInfo_AudioConfig.Merge(m, src)
}
func (m *AudioConfig) XXX_Size() int {
	return xxx_messageInfo_AudioConfig.Size(m)
}
func (m *AudioConfig) XXX_DiscardUnknown() {
	xxx_messageInfo_AudioConfig.DiscardUnknown(m)
}

var xxx_messageInfo_AudioConfig proto.InternalMessageInfo

func (m *AudioConfig) GetPublicReplication() *public_replication.PublicReplication {
	if m != nil {
		return m.PublicReplication
	}
	return nil
}

func (m *AudioConfig) GetCardName() string {
	if m != nil {
		return m.CardName
	}
	return ""
}

func (m *AudioConfig) GetCardConfigFile() string {
	if m != nil {
		return m.CardConfigFile
	}
	return ""
}

func (m *AudioConfig) GetDspFile() string {
	if m != nil {
		return m.DspFile
	}
	return ""
}

func (m *AudioConfig) GetUcmFile() string {
	if m != nil {
		return m.UcmFile
	}
	return ""
}

func (m *AudioConfig) GetUcmMasterFile() string {
	if m != nil {
		return m.UcmMasterFile
	}
	return ""
}

func (m *AudioConfig) GetUcmSuffix() string {
	if m != nil {
		return m.UcmSuffix
	}
	return ""
}

func (m *AudioConfig) GetModuleFile() string {
	if m != nil {
		return m.ModuleFile
	}
	return ""
}

func (m *AudioConfig) GetBoardFile() string {
	if m != nil {
		return m.BoardFile
	}
	return ""
}

func (m *AudioConfig) GetSoundCardInitFile() string {
	if m != nil {
		return m.SoundCardInitFile
	}
	return ""
}

func (m *AudioConfig) GetCardId() string {
	if m != nil {
		return m.CardId
	}
	return ""
}

func init() {
	proto.RegisterType((*AudioConfig)(nil), "chromiumos.config.api.software.AudioConfig")
}

func init() {
	proto.RegisterFile("chromiumos/config/api/software/audio_config.proto", fileDescriptor_c0f10fd6e3e19027)
}

var fileDescriptor_c0f10fd6e3e19027 = []byte{
	// 357 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x92, 0xc1, 0x4e, 0xe3, 0x30,
	0x10, 0x86, 0xd5, 0xed, 0x6e, 0xdb, 0x38, 0xda, 0x5d, 0x1a, 0x21, 0x11, 0x40, 0x40, 0xc5, 0x01,
	0xf5, 0x94, 0xa8, 0xf4, 0xc0, 0x89, 0x03, 0x54, 0x42, 0xea, 0x01, 0x84, 0xca, 0x8d, 0x4b, 0xe4,
	0xda, 0x4e, 0x18, 0x29, 0xce, 0x58, 0x4e, 0x2c, 0x78, 0x3f, 0x5e, 0x0c, 0x65, 0x4c, 0xa9, 0x20,
	0x3d, 0xe6, 0xff, 0xbe, 0x7f, 0x6c, 0x2b, 0xc3, 0x66, 0xe2, 0xc5, 0xa2, 0x06, 0xa7, 0xb1, 0x4e,
	0x05, 0x56, 0x39, 0x14, 0x29, 0x37, 0x90, 0xd6, 0x98, 0x37, 0xaf, 0xdc, 0xaa, 0x94, 0x3b, 0x09,
	0x98, 0x79, 0x92, 0x18, 0x8b, 0x0d, 0x46, 0xa7, 0xdb, 0x4a, 0xf2, 0x09, 0xb8, 0x81, 0x64, 0x53,
	0x39, 0xba, 0xee, 0x8e, 0x34, 0x6e, 0x5d, 0x82, 0xc8, 0xac, 0x32, 0x25, 0x08, 0xde, 0x00, 0x56,
	0x3b, 0x22, 0x3f, 0xfe, 0xfc, 0xbd, 0xcf, 0xc2, 0x9b, 0xf6, 0xd4, 0x05, 0x75, 0xa3, 0x9c, 0x45,
	0x5d, 0x37, 0x0e, 0x26, 0xbd, 0x69, 0x78, 0x79, 0x95, 0x74, 0xef, 0xb2, 0x63, 0xf0, 0x23, 0x45,
	0xab, 0x6d, 0xb2, 0x1a, 0x9b, 0x9f, 0x51, 0x74, 0xcc, 0x02, 0xc1, 0xad, 0xcc, 0x2a, 0xae, 0x55,
	0xdc, 0x9b, 0xf4, 0xa6, 0xc1, 0x6a, 0xd4, 0x06, 0x0f, 0x5c, 0xab, 0x68, 0xca, 0xf6, 0x08, 0xfa,
	0x33, 0xb2, 0x1c, 0x4a, 0x15, 0xff, 0x22, 0xe7, 0x5f, 0x9b, 0xfb, 0xab, 0xde, 0x41, 0xa9, 0xa2,
	0x43, 0x36, 0x92, 0xb5, 0xf1, 0x46, 0x9f, 0x8c, 0xa1, 0xac, 0xcd, 0x06, 0x39, 0xa1, 0x3d, 0xfa,
	0xed, 0x91, 0x13, 0x9a, 0xd0, 0x05, 0xfb, 0xdf, 0x22, 0xcd, 0xeb, 0x46, 0x59, 0x6f, 0xfc, 0x21,
	0xe3, 0xaf, 0x13, 0xfa, 0x9e, 0x52, 0xf2, 0x4e, 0x18, 0x6b, 0xbd, 0xda, 0xe5, 0x39, 0xbc, 0xc5,
	0x03, 0x52, 0x02, 0x27, 0xf4, 0x13, 0x05, 0xd1, 0x19, 0x0b, 0x35, 0x4a, 0x57, 0x2a, 0x3f, 0x62,
	0x48, 0x9c, 0xf9, 0x68, 0xd3, 0x5f, 0x63, 0xfb, 0x10, 0xe2, 0x23, 0xdf, 0xa7, 0x84, 0x70, 0xca,
	0xf6, 0x6b, 0x74, 0x95, 0xcc, 0xe8, 0xb1, 0x50, 0x41, 0xe3, 0x45, 0x46, 0xe2, 0x98, 0xd8, 0x82,
	0x5b, 0xb9, 0xac, 0xa0, 0xa1, 0xc2, 0x01, 0x1b, 0x7a, 0x55, 0xc6, 0x21, 0x39, 0x83, 0xf6, 0x73,
	0x29, 0x6f, 0xe7, 0xcf, 0xb3, 0x02, 0xbf, 0xfe, 0x4e, 0x82, 0xb6, 0x48, 0xbb, 0x6b, 0x51, 0xe0,
	0xb7, 0x65, 0x5b, 0x0f, 0x68, 0x03, 0xe6, 0x1f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x9f, 0x60, 0x78,
	0xeb, 0x95, 0x02, 0x00, 0x00,
}
