media_audio_loader.cpp 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /*
  2. This file is part of Telegram Desktop,
  3. the official desktop application for the Telegram messaging service.
  4. For license and copyright information please follow this link:
  5. https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
  6. */
  7. #include "media/audio/media_audio_loader.h"
  8. namespace Media {
  9. AudioPlayerLoader::AudioPlayerLoader(
  10. const Core::FileLocation &file,
  11. const QByteArray &data,
  12. bytes::vector &&buffer)
  13. : _file(file)
  14. , _data(data)
  15. , _bytes(std::move(buffer)) {
  16. }
  17. AudioPlayerLoader::~AudioPlayerLoader() {
  18. if (_access) {
  19. _file.accessDisable();
  20. _access = false;
  21. }
  22. }
  23. bool AudioPlayerLoader::check(
  24. const Core::FileLocation &file,
  25. const QByteArray &data) {
  26. return (this->_file == file) && (this->_data.size() == data.size());
  27. }
  28. void AudioPlayerLoader::saveDecodedSamples(not_null<QByteArray*> samples) {
  29. Expects(_savedSamples.isEmpty());
  30. Expects(!_holdsSavedSamples);
  31. samples->swap(_savedSamples);
  32. _holdsSavedSamples = true;
  33. }
  34. void AudioPlayerLoader::takeSavedDecodedSamples(
  35. not_null<QByteArray*> samples) {
  36. Expects(samples->isEmpty());
  37. Expects(_holdsSavedSamples);
  38. samples->swap(_savedSamples);
  39. _holdsSavedSamples = false;
  40. }
  41. bool AudioPlayerLoader::holdsSavedDecodedSamples() const {
  42. return _holdsSavedSamples;
  43. }
  44. void AudioPlayerLoader::dropDecodedSamples() {
  45. _savedSamples = {};
  46. _holdsSavedSamples = false;
  47. }
  48. int AudioPlayerLoader::bytesPerBuffer() {
  49. if (!_bytesPerBuffer) {
  50. _bytesPerBuffer = samplesFrequency() * sampleSize();
  51. }
  52. return _bytesPerBuffer;
  53. }
  54. bool AudioPlayerLoader::openFile() {
  55. if (_data.isEmpty() && _bytes.empty()) {
  56. if (_f.isOpen()) _f.close();
  57. if (!_access) {
  58. if (!_file.accessEnable()) {
  59. LOG(("Audio Error: could not open file access '%1', "
  60. "data size '%2', error %3, %4"
  61. ).arg(_file.name()
  62. ).arg(_data.size()
  63. ).arg(_f.error()
  64. ).arg(_f.errorString()));
  65. return false;
  66. }
  67. _access = true;
  68. }
  69. _f.setFileName(_file.name());
  70. if (!_f.open(QIODevice::ReadOnly)) {
  71. LOG(("Audio Error: could not open file '%1', "
  72. "data size '%2', error %3, %4"
  73. ).arg(_file.name()
  74. ).arg(_data.size()
  75. ).arg(_f.error()
  76. ).arg(_f.errorString()));
  77. return false;
  78. }
  79. }
  80. _dataPos = 0;
  81. return true;
  82. }
  83. } // namespace Media