Read reads decoded data from the audio file
(pdata unsafe.Pointer, nbytes int)
| 76 | |
| 77 | // Read reads decoded data from the audio file |
| 78 | func (af *AudioFile) Read(pdata unsafe.Pointer, nbytes int) (int, error) { |
| 79 | |
| 80 | // Slice to access buffer |
| 81 | bs := (*[1 << 30]byte)(pdata)[0:nbytes:nbytes] |
| 82 | |
| 83 | // Reads wave file directly |
| 84 | if af.wavef != nil { |
| 85 | n, err := af.wavef.Read(bs) |
| 86 | if err != nil { |
| 87 | return 0, err |
| 88 | } |
| 89 | if !af.looping { |
| 90 | return n, nil |
| 91 | } |
| 92 | if n == nbytes { |
| 93 | return n, nil |
| 94 | } |
| 95 | // EOF reached. Position file at the beginning |
| 96 | _, err = af.wavef.Seek(int64(waveHeaderSize), 0) |
| 97 | if err != nil { |
| 98 | return 0, nil |
| 99 | } |
| 100 | // Reads next data into the remaining buffer space |
| 101 | n2, err := af.wavef.Read(bs[n:]) |
| 102 | if err != nil { |
| 103 | return 0, err |
| 104 | } |
| 105 | return n + n2, err |
| 106 | } |
| 107 | |
| 108 | // Decodes Ogg vorbis |
| 109 | decoded := 0 |
| 110 | for decoded < nbytes { |
| 111 | n, _, err := ov.Read(af.vorbisf, unsafe.Pointer(&bs[decoded]), nbytes-decoded, false, 2, true) |
| 112 | // Error |
| 113 | if err != nil { |
| 114 | return 0, err |
| 115 | } |
| 116 | // EOF |
| 117 | if n == 0 { |
| 118 | if !af.looping { |
| 119 | break |
| 120 | } |
| 121 | // Position file at the beginning |
| 122 | err = ov.PcmSeek(af.vorbisf, 0) |
| 123 | if err != nil { |
| 124 | return 0, err |
| 125 | } |
| 126 | } |
| 127 | decoded += n |
| 128 | } |
| 129 | if nbytes > 0 && decoded == 0 { |
| 130 | return 0, io.EOF |
| 131 | } |
| 132 | return decoded, nil |
| 133 | } |
| 134 | |
| 135 | // Seek sets the file reading position relative to the origin |
no test coverage detected