Skip to content

Commit

Permalink
Upgrade golangci-lint, more linters (#65)
Browse files Browse the repository at this point in the history
  • Loading branch information
joeturki authored Jan 12, 2025
1 parent e8536fe commit 08e06e0
Show file tree
Hide file tree
Showing 16 changed files with 367 additions and 232 deletions.
47 changes: 30 additions & 17 deletions .golangci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,17 +25,32 @@ linters-settings:
- ^os.Exit$
- ^panic$
- ^print(ln)?$
varnamelen:
max-distance: 12
min-name-length: 2
ignore-type-assert-ok: true
ignore-map-index-ok: true
ignore-chan-recv-ok: true
ignore-decls:
- i int
- n int
- w io.Writer
- r io.Reader
- b []byte

linters:
enable:
- asciicheck # Simple linter to check that your code does not contain non-ASCII identifiers
- bidichk # Checks for dangerous unicode character sequences
- bodyclose # checks whether HTTP response body is closed successfully
- containedctx # containedctx is a linter that detects struct contained context.Context field
- contextcheck # check the function whether use a non-inherited context
- cyclop # checks function and package cyclomatic complexity
- decorder # check declaration order and count of types, constants, variables and functions
- dogsled # Checks assignments with too many blank identifiers (e.g. x, _, _, _, := f())
- dupl # Tool for code clone detection
- durationcheck # check for two durations multiplied together
- err113 # Golang linter to check the errors handling expressions
- errcheck # Errcheck is a program for checking for unchecked errors in go programs. These unchecked errors can be critical bugs in some cases
- errchkjson # Checks types passed to the json encoding functions. Reports unsupported types and optionally reports occations, where the check for the returned error can be omitted.
- errname # Checks that sentinel errors are prefixed with the `Err` and error types are suffixed with the `Error`.
Expand All @@ -46,66 +61,64 @@ linters:
- forcetypeassert # finds forced type assertions
- gci # Gci control golang package import order and make it always deterministic.
- gochecknoglobals # Checks that no globals are present in Go code
- gochecknoinits # Checks that no init functions are present in Go code
- gocognit # Computes and checks the cognitive complexity of functions
- goconst # Finds repeated strings that could be replaced by a constant
- gocritic # The most opinionated Go source code linter
- gocyclo # Computes and checks the cyclomatic complexity of functions
- godot # Check if comments end in a period
- godox # Tool for detection of FIXME, TODO and other comment keywords
- err113 # Golang linter to check the errors handling expressions
- gofmt # Gofmt checks whether code was gofmt-ed. By default this tool runs with -s option to check for code simplification
- gofumpt # Gofumpt checks whether code was gofumpt-ed.
- goheader # Checks is file header matches to pattern
- goimports # Goimports does everything that gofmt does. Additionally it checks unused imports
- gomoddirectives # Manage the use of 'replace', 'retract', and 'excludes' directives in go.mod.
- gomodguard # Allow and block list linter for direct Go module dependencies. This is different from depguard where there are different block types for example version constraints and module recommendations.
- goprintffuncname # Checks that printf-like functions are named with `f` at the end
- gosec # Inspects source code for security problems
- gosimple # Linter for Go source code that specializes in simplifying a code
- govet # Vet examines Go source code and reports suspicious constructs, such as Printf calls whose arguments do not align with the format string
- grouper # An analyzer to analyze expression groups.
- importas # Enforces consistent import aliases
- ineffassign # Detects when assignments to existing variables are not used
- lll # Reports long lines
- maintidx # maintidx measures the maintainability index of each function.
- makezero # Finds slice declarations with non-zero initial length
- misspell # Finds commonly misspelled English words in comments
- nakedret # Finds naked returns in functions greater than a specified function length
- nestif # Reports deeply nested if statements
- nilerr # Finds the code that returns nil even if it checks that the error is not nil.
- nilnil # Checks that there is no simultaneous return of `nil` error and an invalid value.
- nlreturn # nlreturn checks for a new line before return and branch statements to increase code clarity
- noctx # noctx finds sending http request without context.Context
- predeclared # find code that shadows one of Go's predeclared identifiers
- revive # golint replacement, finds style mistakes
- staticcheck # Staticcheck is a go vet on steroids, applying a ton of static analysis checks
- stylecheck # Stylecheck is a replacement for golint
- tagliatelle # Checks the struct tags.
- tenv # tenv is analyzer that detects using os.Setenv instead of t.Setenv since Go1.17
- tparallel # tparallel detects inappropriate usage of t.Parallel() method in your Go test codes
- thelper # thelper detects golang test helpers without t.Helper() call and checks the consistency of test helpers
- typecheck # Like the front-end of a Go compiler, parses and type-checks Go code
- unconvert # Remove unnecessary type conversions
- unparam # Reports unused function parameters
- unused # Checks Go code for unused constants, variables, functions and types
- varnamelen # checks that the length of a variable's name matches its scope
- wastedassign # wastedassign finds wasted assignment statements
- whitespace # Tool for detection of leading and trailing whitespace
disable:
- depguard # Go linter that checks if package imports are in a list of acceptable packages
- containedctx # containedctx is a linter that detects struct contained context.Context field
- cyclop # checks function and package cyclomatic complexity
- funlen # Tool for detection of long functions
- gocyclo # Computes and checks the cyclomatic complexity of functions
- godot # Check if comments end in a period
- gomnd # An analyzer to detect magic numbers.
- gochecknoinits # Checks that no init functions are present in Go code
- gomodguard # Allow and block list linter for direct Go module dependencies. This is different from depguard where there are different block types for example version constraints and module recommendations.
- interfacebloat # A linter that checks length of interface.
- ireturn # Accept Interfaces, Return Concrete Types
- lll # Reports long lines
- maintidx # maintidx measures the maintainability index of each function.
- makezero # Finds slice declarations with non-zero initial length
- nakedret # Finds naked returns in functions greater than a specified function length
- nestif # Reports deeply nested if statements
- nlreturn # nlreturn checks for a new line before return and branch statements to increase code clarity
- mnd # An analyzer to detect magic numbers
- nolintlint # Reports ill-formed or insufficient nolint directives
- paralleltest # paralleltest detects missing usage of t.Parallel() method in your Go test
- prealloc # Finds slice declarations that could potentially be preallocated
- promlinter # Check Prometheus metrics naming via promlint
- rowserrcheck # checks whether Err of rows is checked successfully
- sqlclosecheck # Checks that sql.Rows and sql.Stmt are closed.
- testpackage # linter that makes you use a separate _test package
- thelper # thelper detects golang test helpers without t.Helper() call and checks the consistency of test helpers
- varnamelen # checks that the length of a variable's name matches its scope
- tparallel # tparallel detects inappropriate usage of t.Parallel() method in your Go test codes
- wrapcheck # Checks that errors returned from external packages are wrapped
- wsl # Whitespace Linter - Forces you to use empty lines!

Expand Down
18 changes: 13 additions & 5 deletions decoder.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,13 @@ import (
"github.com/pion/opus/internal/silk"
)

// Decoder decodes the Opus bitstream into PCM
// Decoder decodes the Opus bitstream into PCM.
type Decoder struct {
silkDecoder silk.Decoder
silkBuffer []float32
}

// NewDecoder creates a new Opus Decoder
// NewDecoder creates a new Opus Decoder.
func NewDecoder() Decoder {
return Decoder{
silkDecoder: silk.NewDecoder(),
Expand Down Expand Up @@ -47,7 +47,13 @@ func (d *Decoder) decode(in []byte, out []float32) (bandwidth Bandwidth, isStere
}

for _, encodedFrame := range encodedFrames {
err := d.silkDecoder.Decode(encodedFrame, out, tocHeader.isStereo(), cfg.frameDuration().nanoseconds(), silk.Bandwidth(cfg.bandwidth()))
err := d.silkDecoder.Decode(
encodedFrame,
out,
tocHeader.isStereo(),
cfg.frameDuration().nanoseconds(),
silk.Bandwidth(cfg.bandwidth()),
)
if err != nil {
return 0, false, err
}
Expand All @@ -56,24 +62,26 @@ func (d *Decoder) decode(in []byte, out []float32) (bandwidth Bandwidth, isStere
return cfg.bandwidth(), tocHeader.isStereo(), nil
}

// Decode decodes the Opus bitstream into S16LE PCM
// Decode decodes the Opus bitstream into S16LE PCM.
func (d *Decoder) Decode(in, out []byte) (bandwidth Bandwidth, isStereo bool, err error) {
bandwidth, isStereo, err = d.decode(in, d.silkBuffer)
if err != nil {
return
}

err = bitdepth.ConvertFloat32LittleEndianToSigned16LittleEndian(d.silkBuffer, out, 3)

return
}

// DecodeFloat32 decodes the Opus bitstream into F32LE PCM
// DecodeFloat32 decodes the Opus bitstream into F32LE PCM.
func (d *Decoder) DecodeFloat32(in []byte, out []float32) (bandwidth Bandwidth, isStereo bool, err error) {
bandwidth, isStereo, err = d.decode(in, d.silkBuffer)
if err != nil {
return
}

resample.Up(d.silkBuffer, out, 3)

return
}
5 changes: 5 additions & 0 deletions decoder_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ var (
)

func loadTestOgg(tb testing.TB) []byte {
tb.Helper()

if *testoggfile == "" {
tb.Skip("-oggfile not specified")
}
Expand All @@ -37,6 +39,7 @@ func loadTestOgg(tb testing.TB) []byte {
if _testogg.err != nil {
tb.Fatal("unable to load -oggfile", _testogg.err)
}

return _testogg.data
}

Expand All @@ -49,6 +52,8 @@ func BenchmarkDecode(b *testing.B) {
}

func benchmarkData(b *testing.B, data []byte) {
b.Helper()

var out [1920]byte
ogg, _, err := oggreader.NewWith(bytes.NewReader(data))
if err != nil {
Expand Down
6 changes: 3 additions & 3 deletions examples/decode/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import (
"github.com/pion/opus/pkg/oggreader"
)

func main() {
func main() { // nolint:cyclop
if len(os.Args) != 3 {
panic("Usage: <in-file> <out-file>")
}
Expand All @@ -30,7 +30,7 @@ func main() {
}

out := make([]byte, 1920)
f, err := os.Create(os.Args[2])
fd, err := os.Create(os.Args[2])
if err != nil {
panic(err)
}
Expand All @@ -54,7 +54,7 @@ func main() {
panic(err)
}

if _, err := f.Write(out); err != nil {
if _, err := fd.Write(out); err != nil {
panic(err)
}
}
Expand Down
2 changes: 1 addition & 1 deletion internal/bitdepth/bitdepth.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import (
"math"
)

// ConvertFloat32LittleEndianToSigned16LittleEndian converts a f32le to s16le
// ConvertFloat32LittleEndianToSigned16LittleEndian converts a f32le to s16le.
func ConvertFloat32LittleEndianToSigned16LittleEndian(in []float32, out []byte, resampleCount int) error {
currIndex := 0
for i := range in {
Expand Down
21 changes: 12 additions & 9 deletions internal/rangecoding/decoder.go
Original file line number Diff line number Diff line change
Expand Up @@ -103,27 +103,28 @@ func (r *Decoder) Init(data []byte) {
//
// https://datatracker.ietf.org/doc/html/rfc6716#section-4.1.3.3
func (r *Decoder) DecodeSymbolWithICDF(cumulativeDistributionTable []uint) uint32 {
var k, scale, total, symbol, low, high uint32
var k, scale, total, symbol, low, high uint32 //nolint:varnamelen

total = uint32(cumulativeDistributionTable[0])
total = uint32(cumulativeDistributionTable[0]) //nolint:gosec // G115
cumulativeDistributionTable = cumulativeDistributionTable[1:]

scale = r.rangeSize / total
symbol = r.highAndCodedDifference/scale + 1
symbol = total - uint32(localMin(uint(symbol), uint(total)))
symbol = total - uint32(localMin(uint(symbol), uint(total))) //nolint:gosec // G115

// nolint: revive
for k = 0; uint32(cumulativeDistributionTable[k]) <= symbol; k++ {
for k = 0; uint32(cumulativeDistributionTable[k]) <= symbol; k++ { //nolint:gosec // G115
}

high = uint32(cumulativeDistributionTable[k])
high = uint32(cumulativeDistributionTable[k]) //nolint:gosec // G115
if k != 0 {
low = uint32(cumulativeDistributionTable[k-1])
low = uint32(cumulativeDistributionTable[k-1]) //nolint:gosec // G115
} else {
low = 0
}

r.update(scale, low, high, total)

return k
}

Expand All @@ -134,7 +135,7 @@ func (r *Decoder) DecodeSymbolWithICDF(cumulativeDistributionTable []uint) uint3
//
// https://datatracker.ietf.org/doc/html/rfc6716#section-4.1.3.2
func (r *Decoder) DecodeSymbolLogP(logp uint) uint32 {
var k uint32
var k uint32 //nolint:varnamelen
scale := r.rangeSize >> logp

if r.highAndCodedDifference >= scale {
Expand All @@ -154,11 +155,12 @@ func (r *Decoder) getBit() uint32 {
index := r.bitsRead / 8
offset := r.bitsRead % 8

if index > uint(len(r.data)-1) {
if index > uint(len(r.data)-1) { //nolint:gosec // G115
return 0
}

r.bitsRead++

return uint32((r.data[index] >> (7 - offset)) & 1)
}

Expand Down Expand Up @@ -213,7 +215,7 @@ func (r *Decoder) update(scale, low, high, total uint32) {
r.normalize()
}

// SetInternalValues is used when using the RangeDecoder when testing
// SetInternalValues is used when using the RangeDecoder when testing.
func (r *Decoder) SetInternalValues(data []byte, bitsRead uint, rangeSize uint32, highAndCodedDifference uint32) {
r.data = data
r.bitsRead = bitsRead
Expand All @@ -225,5 +227,6 @@ func localMin(a, b uint) uint {
if a < b {
return a
}

return b
}
Loading

0 comments on commit 08e06e0

Please sign in to comment.