I use Exoplayer to play encrypted audio. I create ecryptyedDataSourceFacotory and I tried to play encrypted audio. it's working fine even when seek to forward position but when seek to back position, sound does not play.
how can I fix it?.
below code is EncryptedDataSource and added to Exoplayer. Some code is unused because I tried some way to solve this problem.
class EncryptedDataSource(private val context: Context, var fileName: String) : DataSource {
companion object {
const val AES_BLOCK_SIZE = 16
}
private var inputStream: FileInputStream? = null
private lateinit var uri: Uri
private var dataSpec: DataSpec? = null
private val transferListeners = mutableListOf<TransferListener?>()
private var mBytesRemaining: Long = 0
private var isOpen = false
override fun addTransferListener(transferListener: TransferListener?) {
transferListeners.add(transferListener)
}
override fun open(dataSpec: DataSpec?): Long {
uri = dataSpec?.uri!!
this.dataSpec = dataSpec
if (isOpen) return mBytesRemaining
setupInputStream()
skipToPosition(dataSpec)
computeBytesRemaining(dataSpec)
isOpen = true
transferListeners.forEach { it?.onTransferStart(this, dataSpec, false) }
return dataSpec?.length ?: 0L
}
override fun read(buffer: ByteArray?, offset: Int, readLength: Int): Int {
if (readLength == 0)
return C.RESULT_END_OF_INPUT
else return inputStream?.read(buffer, offset, readLength) ?: 0
}
override fun getUri(): Uri? {
return uri
}
override fun close() {
inputStream?.close()
}
private fun computeBytesRemaining(dataSpec: DataSpec) {
if (dataSpec.length.toInt() != C.LENGTH_UNSET) {
mBytesRemaining = dataSpec.length;
} else {
mBytesRemaining = inputStream?.available()?.toLong() ?: 0L
if (mBytesRemaining.toInt() == Integer.MAX_VALUE) {
mBytesRemaining = C.LENGTH_UNSET.toLong()
}
}
}
private fun setupInputStream(){
val masterKeyAlias: String = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC)
val file = File(context.getExternalFilesDir(Environment.DIRECTORY_MUSIC), fileName)
val encryptedFile: EncryptedFile = EncryptedFile.Builder(
file!!,
context,
masterKeyAlias,
EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB
).build()
inputStream = encryptedFile.openFileInput()
}
private fun skipToPosition(dataSpec: DataSpec) {
inputStream?.forceSkip(dataSpec.position)
}
}