Update CapturingAudioSink to dump after audio processors

This ensures data modifications like channel mapping or
bitrate changes are correctly captured in the dump files.

PiperOrigin-RevId: 732129701
This commit is contained in:
tonihei 2025-02-28 07:20:05 -08:00 committed by Copybara-Service
parent 2088697a19
commit 796df136d7
8 changed files with 226 additions and 209 deletions

View File

@ -29,7 +29,6 @@ import androidx.media3.exoplayer.ExoPlayer;
import androidx.media3.exoplayer.Renderer; import androidx.media3.exoplayer.Renderer;
import androidx.media3.exoplayer.RenderersFactory; import androidx.media3.exoplayer.RenderersFactory;
import androidx.media3.exoplayer.audio.AudioSink; import androidx.media3.exoplayer.audio.AudioSink;
import androidx.media3.exoplayer.audio.DefaultAudioSink;
import androidx.media3.exoplayer.source.MediaSource; import androidx.media3.exoplayer.source.MediaSource;
import androidx.media3.exoplayer.source.ProgressiveMediaSource; import androidx.media3.exoplayer.source.ProgressiveMediaSource;
import androidx.media3.extractor.mkv.MatroskaExtractor; import androidx.media3.extractor.mkv.MatroskaExtractor;
@ -67,9 +66,7 @@ public class FlacPlaybackTest {
} }
private static void playAndAssertAudioSinkInput(String fileName) throws Exception { private static void playAndAssertAudioSinkInput(String fileName) throws Exception {
CapturingAudioSink audioSink = CapturingAudioSink audioSink = CapturingAudioSink.create();
new CapturingAudioSink(
new DefaultAudioSink.Builder(ApplicationProvider.getApplicationContext()).build());
TestPlaybackRunnable testPlaybackRunnable = TestPlaybackRunnable testPlaybackRunnable =
new TestPlaybackRunnable( new TestPlaybackRunnable(

View File

@ -34,7 +34,6 @@ import androidx.media3.exoplayer.ExoPlayer;
import androidx.media3.exoplayer.Renderer; import androidx.media3.exoplayer.Renderer;
import androidx.media3.exoplayer.RenderersFactory; import androidx.media3.exoplayer.RenderersFactory;
import androidx.media3.exoplayer.audio.AudioSink; import androidx.media3.exoplayer.audio.AudioSink;
import androidx.media3.exoplayer.audio.DefaultAudioSink;
import androidx.media3.exoplayer.source.MediaSource; import androidx.media3.exoplayer.source.MediaSource;
import androidx.media3.exoplayer.source.ProgressiveMediaSource; import androidx.media3.exoplayer.source.ProgressiveMediaSource;
import androidx.media3.extractor.mp4.Mp4Extractor; import androidx.media3.extractor.mp4.Mp4Extractor;
@ -63,9 +62,7 @@ public class IamfPlaybackTest {
} }
private static void playAndAssertAudioSinkOutput(String fileName) throws Exception { private static void playAndAssertAudioSinkOutput(String fileName) throws Exception {
CapturingAudioSink audioSink = CapturingAudioSink audioSink = CapturingAudioSink.create();
new CapturingAudioSink(
new DefaultAudioSink.Builder(ApplicationProvider.getApplicationContext()).build());
TestPlaybackRunnable testPlaybackRunnable = TestPlaybackRunnable testPlaybackRunnable =
new TestPlaybackRunnable( new TestPlaybackRunnable(

View File

@ -29,7 +29,6 @@ import androidx.media3.exoplayer.ExoPlayer;
import androidx.media3.exoplayer.Renderer; import androidx.media3.exoplayer.Renderer;
import androidx.media3.exoplayer.RenderersFactory; import androidx.media3.exoplayer.RenderersFactory;
import androidx.media3.exoplayer.audio.AudioSink; import androidx.media3.exoplayer.audio.AudioSink;
import androidx.media3.exoplayer.audio.DefaultAudioSink;
import androidx.media3.exoplayer.source.MediaSource; import androidx.media3.exoplayer.source.MediaSource;
import androidx.media3.exoplayer.source.ProgressiveMediaSource; import androidx.media3.exoplayer.source.ProgressiveMediaSource;
import androidx.media3.extractor.mkv.MatroskaExtractor; import androidx.media3.extractor.mkv.MatroskaExtractor;
@ -74,9 +73,7 @@ public class OpusPlaybackTest {
} }
private void playUri(String fileName) throws Exception { private void playUri(String fileName) throws Exception {
CapturingAudioSink audioSink = CapturingAudioSink audioSink = CapturingAudioSink.create();
new CapturingAudioSink(
new DefaultAudioSink.Builder(ApplicationProvider.getApplicationContext()).build());
TestPlaybackRunnable testPlaybackRunnable = TestPlaybackRunnable testPlaybackRunnable =
new TestPlaybackRunnable( new TestPlaybackRunnable(

View File

@ -7,88 +7,88 @@ AudioSink:
sampleRate = 48000 sampleRate = 48000
buffer #0: buffer #0:
time = 1000000000000 time = 1000000000000
data = 225023649 data = 1217833679
buffer #1: buffer #1:
time = 1000000096000 time = 1000000096000
data = 455106306 data = 558614672
buffer #2: buffer #2:
time = 1000000192000 time = 1000000192000
data = 2025727297 data = -709714787
buffer #3: buffer #3:
time = 1000000288000 time = 1000000288000
data = 758514657 data = 1367870571
buffer #4: buffer #4:
time = 1000000384000 time = 1000000384000
data = 1044986473 data = -141229457
buffer #5: buffer #5:
time = 1000000480000 time = 1000000480000
data = -2030029695 data = 1287758361
buffer #6: buffer #6:
time = 1000000576000 time = 1000000576000
data = 1907053281 data = 1125289147
buffer #7: buffer #7:
time = 1000000672000 time = 1000000672000
data = -1974954431 data = -1677383475
buffer #8: buffer #8:
time = 1000000768000 time = 1000000768000
data = -206248383 data = 2130742861
buffer #9: buffer #9:
time = 1000000864000 time = 1000000864000
data = 1484984417 data = -1292320253
buffer #10: buffer #10:
time = 1000000960000 time = 1000000960000
data = -1306117439 data = -456587163
buffer #11: buffer #11:
time = 1000001056000 time = 1000001056000
data = 692829792 data = 748981534
buffer #12: buffer #12:
time = 1000001152000 time = 1000001152000
data = 1070563058 data = 1550456016
buffer #13: buffer #13:
time = 1000001248000 time = 1000001248000
data = -1444096479 data = 1657906039
buffer #14: buffer #14:
time = 1000001344000 time = 1000001344000
data = 1753016419 data = -762677083
buffer #15: buffer #15:
time = 1000001440000 time = 1000001440000
data = 1947797953 data = -1343810763
buffer #16: buffer #16:
time = 1000001536000 time = 1000001536000
data = 266121411 data = 1137318783
buffer #17: buffer #17:
time = 1000001632000 time = 1000001632000
data = 1275494369 data = -1891318229
buffer #18: buffer #18:
time = 1000001728000 time = 1000001728000
data = 372077825 data = -472068495
buffer #19: buffer #19:
time = 1000001824000 time = 1000001824000
data = -993079679 data = 832315001
buffer #20: buffer #20:
time = 1000001920000 time = 1000001920000
data = 177307937 data = 2054935175
buffer #21: buffer #21:
time = 1000002016000 time = 1000002016000
data = 2037083009 data = 57921641
buffer #22: buffer #22:
time = 1000002112000 time = 1000002112000
data = -435776287 data = 2132759067
buffer #23: buffer #23:
time = 1000002208000 time = 1000002208000
data = 1867447329 data = -1742540521
buffer #24: buffer #24:
time = 1000002304000 time = 1000002304000
data = 1884495937 data = 1657024301
buffer #25: buffer #25:
time = 1000002400000 time = 1000002400000
data = -804673375 data = -585080145
buffer #26: buffer #26:
time = 1000002496000 time = 1000002496000
data = -588531007 data = 427271397
buffer #27: buffer #27:
time = 1000002592000 time = 1000002592000
data = -1064642970 data = -364201340
buffer #28: buffer #28:
time = 1000002688000 time = 1000002688000
data = -1771406207 data = -627965287

View File

@ -8,415 +8,415 @@ AudioSink:
outputChannels = [0, 2, 1, 5, 3, 4] outputChannels = [0, 2, 1, 5, 3, 4]
buffer #0: buffer #0:
time = 1000000000000 time = 1000000000000
data = 376017869 data = 234043725
buffer #1: buffer #1:
time = 1000000021000 time = 1000000021000
data = -1501081867 data = -580791691
buffer #2: buffer #2:
time = 1000000041000 time = 1000000041000
data = -1886525659 data = -1973782107
buffer #3: buffer #3:
time = 1000000061000 time = 1000000061000
data = 1927220572 data = 1529931548
buffer #4: buffer #4:
time = 1000000081000 time = 1000000081000
data = 1788008940 data = -174178004
buffer #5: buffer #5:
time = 1000000101000 time = 1000000101000
data = -15902575 data = 1892687377
buffer #6: buffer #6:
time = 1000000121000 time = 1000000121000
data = -1301740855 data = -413626423
buffer #7: buffer #7:
time = 1000000141000 time = 1000000141000
data = 621832609 data = -595815775
buffer #8: buffer #8:
time = 1000000161000 time = 1000000161000
data = -1588303803 data = 1775558213
buffer #9: buffer #9:
time = 1000000181000 time = 1000000181000
data = 423082548 data = 278415988
buffer #10: buffer #10:
time = 1000000201000 time = 1000000201000
data = 808505936 data = -1167220656
buffer #11: buffer #11:
time = 1000000221000 time = 1000000221000
data = -1092493157 data = 1786323675
buffer #12: buffer #12:
time = 1000000241000 time = 1000000241000
data = -725659694 data = -1686815982
buffer #13: buffer #13:
time = 1000000261000 time = 1000000261000
data = -722218981 data = -1503850981
buffer #14: buffer #14:
time = 1000000281000 time = 1000000281000
data = 280616064 data = 1852969920
buffer #15: buffer #15:
time = 1000000301000 time = 1000000301000
data = 1182192471 data = -714258025
buffer #16: buffer #16:
time = 1000000321000 time = 1000000321000
data = 375143304 data = 358778760
buffer #17: buffer #17:
time = 1000000341000 time = 1000000341000
data = -474611788 data = 1972203316
buffer #18: buffer #18:
time = 1000000361000 time = 1000000361000
data = 315949873 data = -1724152783
buffer #19: buffer #19:
time = 1000000381000 time = 1000000381000
data = -1751860033 data = -390156801
buffer #20: buffer #20:
time = 1000000401000 time = 1000000401000
data = -2141575433 data = -1216014025
buffer #21: buffer #21:
time = 1000000421000 time = 1000000421000
data = -1759699799 data = 1345693353
buffer #22: buffer #22:
time = 1000000441000 time = 1000000441000
data = -1006359333 data = -89432933
buffer #23: buffer #23:
time = 1000000461000 time = 1000000461000
data = -243379314 data = 1599421134
buffer #24: buffer #24:
time = 1000000481000 time = 1000000481000
data = -1627306664 data = -401786024
buffer #25: buffer #25:
time = 1000000501000 time = 1000000501000
data = -757395606 data = 1298478122
buffer #26: buffer #26:
time = 1000000521000 time = 1000000521000
data = -903517963 data = -123106251
buffer #27: buffer #27:
time = 1000000541000 time = 1000000541000
data = 758333744 data = 358397360
buffer #28: buffer #28:
time = 1000000561000 time = 1000000561000
data = -353919780 data = 1606505052
buffer #29: buffer #29:
time = 1000000581000 time = 1000000581000
data = 1573994512 data = 717118992
buffer #30: buffer #30:
time = 1000000601000 time = 1000000601000
data = 454984797 data = 1863602589
buffer #31: buffer #31:
time = 1000000621000 time = 1000000621000
data = 121370022 data = -1165998042
buffer #32: buffer #32:
time = 1000000641000 time = 1000000641000
data = -1549807559 data = 1932879417
buffer #33: buffer #33:
time = 1000000661000 time = 1000000661000
data = -660414046 data = -1589619358
buffer #34: buffer #34:
time = 1000000681000 time = 1000000681000
data = -2068819284 data = 379595052
buffer #35: buffer #35:
time = 1000000701000 time = 1000000701000
data = -1759557231 data = -2127236143
buffer #36: buffer #36:
time = 1000000721000 time = 1000000721000
data = -216211463 data = 345678777
buffer #37: buffer #37:
time = 1000000741000 time = 1000000741000
data = -270655305 data = 1810184887
buffer #38: buffer #38:
time = 1000000761000 time = 1000000761000
data = 1904218932 data = -766380364
buffer #39: buffer #39:
time = 1000000781000 time = 1000000781000
data = -457511627 data = 354834037
buffer #40: buffer #40:
time = 1000000801000 time = 1000000801000
data = -916250571 data = 474011509
buffer #41: buffer #41:
time = 1000000821000 time = 1000000821000
data = -1352402544 data = -1707332016
buffer #42: buffer #42:
time = 1000000841000 time = 1000000841000
data = -1406715357 data = 623940003
buffer #43: buffer #43:
time = 1000000861000 time = 1000000861000
data = -160423302 data = 606630394
buffer #44: buffer #44:
time = 1000000881000 time = 1000000881000
data = -562315050 data = 1109677590
buffer #45: buffer #45:
time = 1000000901000 time = 1000000901000
data = -1285137896 data = -1576058536
buffer #46: buffer #46:
time = 1000000921000 time = 1000000921000
data = 967514144 data = -90398112
buffer #47: buffer #47:
time = 1000000941000 time = 1000000941000
data = -443593130 data = 71274198
buffer #48: buffer #48:
time = 1000000961000 time = 1000000961000
data = -2053337994 data = -40310602
buffer #49: buffer #49:
time = 1000000981000 time = 1000000981000
data = 1306897911 data = 44086455
buffer #50: buffer #50:
time = 1000001001000 time = 1000001001000
data = -629261608 data = -1138227688
buffer #51: buffer #51:
time = 1000001021000 time = 1000001021000
data = -197988143 data = 2025948945
buffer #52: buffer #52:
time = 1000001041000 time = 1000001041000
data = 1951060329 data = 1440259177
buffer #53: buffer #53:
time = 1000001061000 time = 1000001061000
data = 1516494919 data = -436097337
buffer #54: buffer #54:
time = 1000001081000 time = 1000001081000
data = 1742589018 data = 385994650
buffer #55: buffer #55:
time = 1000001101000 time = 1000001101000
data = 1121562002 data = -266443246
buffer #56: buffer #56:
time = 1000001121000 time = 1000001121000
data = -1596344281 data = -1024305689
buffer #57: buffer #57:
time = 1000001141000 time = 1000001141000
data = -969305045 data = -135858773
buffer #58: buffer #58:
time = 1000001161000 time = 1000001161000
data = 364275722 data = 146727818
buffer #59: buffer #59:
time = 1000001181000 time = 1000001181000
data = -233188688 data = 376340976
buffer #60: buffer #60:
time = 1000001201000 time = 1000001201000
data = -1021462703 data = 969373265
buffer #61: buffer #61:
time = 1000001221000 time = 1000001221000
data = 1064140860 data = -515465348
buffer #62: buffer #62:
time = 1000001241000 time = 1000001241000
data = -236898679 data = -1253635383
buffer #63: buffer #63:
time = 1000001261000 time = 1000001261000
data = -359764648 data = 713564184
buffer #64: buffer #64:
time = 1000001281000 time = 1000001281000
data = -1723302464 data = 1056000576
buffer #65: buffer #65:
time = 1000001301000 time = 1000001301000
data = 2076862288 data = 657074448
buffer #66: buffer #66:
time = 1000001321000 time = 1000001321000
data = 2015097443 data = -1985799133
buffer #67: buffer #67:
time = 1000001341000 time = 1000001341000
data = -955703828 data = -1241236052
buffer #68: buffer #68:
time = 1000001361000 time = 1000001361000
data = 1573244659 data = -1605806349
buffer #69: buffer #69:
time = 1000001381000 time = 1000001381000
data = -1421036943 data = 210306417
buffer #70: buffer #70:
time = 1000001401000 time = 1000001401000
data = 1938324900 data = -778696412
buffer #71: buffer #71:
time = 1000001421000 time = 1000001421000
data = 1088878684 data = 1820998620
buffer #72: buffer #72:
time = 1000001441000 time = 1000001441000
data = 1597579555 data = 989311075
buffer #73: buffer #73:
time = 1000001461000 time = 1000001461000
data = 1497574278 data = 860171718
buffer #74: buffer #74:
time = 1000001481000 time = 1000001481000
data = -1756604247 data = -880014935
buffer #75: buffer #75:
time = 1000001501000 time = 1000001501000
data = 368515147 data = 847793035
buffer #76: buffer #76:
time = 1000001521000 time = 1000001521000
data = 512395852 data = 556584524
buffer #77: buffer #77:
time = 1000001541000 time = 1000001541000
data = 564365812 data = -1287767308
buffer #78: buffer #78:
time = 1000001561000 time = 1000001561000
data = 1873249477 data = 69040581
buffer #79: buffer #79:
time = 1000001581000 time = 1000001581000
data = -1781707030 data = -575644502
buffer #80: buffer #80:
time = 1000001601000 time = 1000001601000
data = 1012903106 data = 914598210
buffer #81: buffer #81:
time = 1000001621000 time = 1000001621000
data = -1092012755 data = -397437651
buffer #82: buffer #82:
time = 1000001641000 time = 1000001641000
data = 952876824 data = -254851496
buffer #83: buffer #83:
time = 1000001661000 time = 1000001661000
data = -1424480890 data = 268612998
buffer #84: buffer #84:
time = 1000001681000 time = 1000001681000
data = 1120937431 data = -1839968489
buffer #85: buffer #85:
time = 1000001701000 time = 1000001701000
data = -1626344703 data = -1180239423
buffer #86: buffer #86:
time = 1000001721000 time = 1000001721000
data = 1882664532 data = 59669332
buffer #87: buffer #87:
time = 1000001741000 time = 1000001741000
data = -1175892393 data = -752827753
buffer #88: buffer #88:
time = 1000001761000 time = 1000001761000
data = 2077583079 data = 403856167
buffer #89: buffer #89:
time = 1000001781000 time = 1000001781000
data = -581217660 data = -1344219772
buffer #90: buffer #90:
time = 1000001801000 time = 1000001801000
data = 377904743 data = -668842457
buffer #91: buffer #91:
time = 1000001821000 time = 1000001821000
data = -1084595157 data = 2137762795
buffer #92: buffer #92:
time = 1000001841000 time = 1000001841000
data = 1289312847 data = 343637519
buffer #93: buffer #93:
time = 1000001861000 time = 1000001861000
data = 318127398 data = -1010041242
buffer #94: buffer #94:
time = 1000001881000 time = 1000001881000
data = -1054665983 data = -1157580159
buffer #95: buffer #95:
time = 1000001901000 time = 1000001901000
data = 1311800220 data = -781028132
buffer #96: buffer #96:
time = 1000001921000 time = 1000001921000
data = 1083373864 data = 2132511272
buffer #97: buffer #97:
time = 1000001941000 time = 1000001941000
data = -1575279712 data = -1907272992
buffer #98: buffer #98:
time = 1000001961000 time = 1000001961000
data = 1903786940 data = 2122082300
buffer #99: buffer #99:
time = 1000001981000 time = 1000001981000
data = 968132978 data = -1245356046
buffer #100: buffer #100:
time = 1000002001000 time = 1000002001000
data = 1732190865 data = 1089802641
buffer #101: buffer #101:
time = 1000002021000 time = 1000002021000
data = 1820905719 data = -381766345
buffer #102: buffer #102:
time = 1000002041000 time = 1000002041000
data = 377136640 data = 1096835328
buffer #103: buffer #103:
time = 1000002061000 time = 1000002061000
data = -461752511 data = 461086145
buffer #104: buffer #104:
time = 1000002081000 time = 1000002081000
data = -1669510266 data = 1210244742
buffer #105: buffer #105:
time = 1000002101000 time = 1000002101000
data = 399842824 data = -1808225016
buffer #106: buffer #106:
time = 1000002121000 time = 1000002121000
data = 939150450 data = 26455730
buffer #107: buffer #107:
time = 1000002141000 time = 1000002141000
data = -739412407 data = -188835895
buffer #108: buffer #108:
time = 1000002161000 time = 1000002161000
data = -1094682025 data = 914880535
buffer #109: buffer #109:
time = 1000002181000 time = 1000002181000
data = 1243234514 data = -1300606574
buffer #110: buffer #110:
time = 1000002201000 time = 1000002201000
data = -299900960 data = 159581216
buffer #111: buffer #111:
time = 1000002221000 time = 1000002221000
data = 1491665369 data = 1023615129
buffer #112: buffer #112:
time = 1000002241000 time = 1000002241000
data = 195073085 data = -306886339
buffer #113: buffer #113:
time = 1000002261000 time = 1000002261000
data = -1719454940 data = 1911300580
buffer #114: buffer #114:
time = 1000002281000 time = 1000002281000
data = -744492884 data = -1978405524
buffer #115: buffer #115:
time = 1000002301000 time = 1000002301000
data = 821067246 data = -1342524498
buffer #116: buffer #116:
time = 1000002321000 time = 1000002321000
data = -1434851338 data = 827121014
buffer #117: buffer #117:
time = 1000002341000 time = 1000002341000
data = 779094816 data = 1603726752
buffer #118: buffer #118:
time = 1000002361000 time = 1000002361000
data = -330715311 data = 1732693777
buffer #119: buffer #119:
time = 1000002381000 time = 1000002381000
data = 1225236580 data = -2093029724
buffer #120: buffer #120:
time = 1000002401000 time = 1000002401000
data = 1592040991 data = 618588511
buffer #121: buffer #121:
time = 1000002421000 time = 1000002421000
data = -996563326 data = -894493310
buffer #122: buffer #122:
time = 1000002441000 time = 1000002441000
data = -494589605 data = -687085349
buffer #123: buffer #123:
time = 1000002461000 time = 1000002461000
data = -1330262588 data = 1776293124
buffer #124: buffer #124:
time = 1000002481000 time = 1000002481000
data = -1486074683 data = -948910267
buffer #125: buffer #125:
time = 1000002501000 time = 1000002501000
data = 484577868 data = 173765132
buffer #126: buffer #126:
time = 1000002521000 time = 1000002521000
data = 273883133 data = 716041917
buffer #127: buffer #127:
time = 1000002541000 time = 1000002541000
data = -11420506 data = -743302106
buffer #128: buffer #128:
time = 1000002561000 time = 1000002561000
data = 1904154495 data = -373809025
buffer #129: buffer #129:
time = 1000002581000 time = 1000002581000
data = 516576999 data = -1807281497
buffer #130: buffer #130:
time = 1000002601000 time = 1000002601000
data = 845202278 data = 302220326
buffer #131: buffer #131:
time = 1000002621000 time = 1000002621000
data = 178229514 data = -1322806518
buffer #132: buffer #132:
time = 1000002641000 time = 1000002641000
data = 153624742 data = 1613246758
buffer #133: buffer #133:
time = 1000002661000 time = 1000002661000
data = -26049833 data = -974733545
buffer #134: buffer #134:
time = 1000002681000 time = 1000002681000
data = -1951469655 data = -2087482007
buffer #135: buffer #135:
time = 1000002701000 time = 1000002701000
data = 1564577937 data = -724712367
buffer #136: buffer #136:
time = 1000002721000 time = 1000002721000
data = -660822929 data = 1475344687
buffer #137: buffer #137:
time = 1000002741000 time = 1000002741000
data = -1352825612 data = 47156

View File

@ -15,29 +15,51 @@
*/ */
package androidx.media3.test.utils; package androidx.media3.test.utils;
import static androidx.media3.common.util.Assertions.checkNotNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.media3.common.C; import androidx.media3.common.C;
import androidx.media3.common.Format; import androidx.media3.common.Format;
import androidx.media3.common.util.UnstableApi; import androidx.media3.common.util.UnstableApi;
import androidx.media3.exoplayer.audio.AudioSink; import androidx.media3.exoplayer.audio.AudioSink;
import androidx.media3.exoplayer.audio.DefaultAudioSink;
import androidx.media3.exoplayer.audio.ForwardingAudioSink; import androidx.media3.exoplayer.audio.ForwardingAudioSink;
import androidx.media3.exoplayer.audio.TeeAudioProcessor;
import androidx.test.core.app.ApplicationProvider;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
/** A {@link ForwardingAudioSink} that captures configuration, discontinuity and buffer events. */ /**
* An {@link AudioSink} forwarding to {@link DefaultAudioSink} that captures configuration,
* discontinuity and buffer events.
*/
@UnstableApi @UnstableApi
public final class CapturingAudioSink extends ForwardingAudioSink implements Dumper.Dumpable { public final class CapturingAudioSink extends ForwardingAudioSink implements Dumper.Dumpable {
private final List<Dumper.Dumpable> interceptedData; private final List<Dumper.Dumpable> interceptedData;
@Nullable private ByteBuffer currentBuffer;
private int bufferCount; private int bufferCount;
private long lastPresentationTimeUs;
public CapturingAudioSink(AudioSink sink) { /** Creates the capturing audio sink. */
public static CapturingAudioSink create() {
InterceptingBufferSink interceptingBufferSink = new InterceptingBufferSink();
return new CapturingAudioSink(
new DefaultAudioSink.Builder(ApplicationProvider.getApplicationContext())
.setAudioProcessorChain(
new DefaultAudioSink.DefaultAudioProcessorChain(
new TeeAudioProcessor(interceptingBufferSink)))
.build(),
interceptingBufferSink);
}
private CapturingAudioSink(AudioSink sink, InterceptingBufferSink interceptingBufferSink) {
super(sink); super(sink);
interceptedData = new ArrayList<>(); interceptedData = new ArrayList<>();
interceptingBufferSink.setCapturingAudioSink(this);
} }
@Override @Override
@ -63,30 +85,13 @@ public final class CapturingAudioSink extends ForwardingAudioSink implements Dum
public boolean handleBuffer( public boolean handleBuffer(
ByteBuffer buffer, long presentationTimeUs, int encodedAccessUnitCount) ByteBuffer buffer, long presentationTimeUs, int encodedAccessUnitCount)
throws InitializationException, WriteException { throws InitializationException, WriteException {
// handleBuffer is called repeatedly with the same buffer until it's been fully consumed by the lastPresentationTimeUs = presentationTimeUs;
// sink. We only want to dump each buffer once, and we need to do so before the sink being if (!buffer.hasRemaining()) {
// forwarded to has a chance to modify its position. // Empty buffers are not processed any further and need to be intercepted here.
if (buffer != currentBuffer) { // TODO: b/174737370 - Output audio bytes in Robolectric to avoid this situation.
interceptedData.add(new DumpableBuffer(bufferCount++, buffer, presentationTimeUs)); interceptedData.add(new DumpableBuffer(bufferCount++, buffer, lastPresentationTimeUs));
currentBuffer = buffer;
} }
boolean fullyConsumed = super.handleBuffer(buffer, presentationTimeUs, encodedAccessUnitCount); return super.handleBuffer(buffer, presentationTimeUs, encodedAccessUnitCount);
if (fullyConsumed) {
currentBuffer = null;
}
return fullyConsumed;
}
@Override
public void flush() {
currentBuffer = null;
super.flush();
}
@Override
public void reset() {
currentBuffer = null;
super.reset();
} }
@Override @Override
@ -101,6 +106,29 @@ public final class CapturingAudioSink extends ForwardingAudioSink implements Dum
dumper.endBlock(); dumper.endBlock();
} }
private static final class InterceptingBufferSink implements TeeAudioProcessor.AudioBufferSink {
private @MonotonicNonNull CapturingAudioSink capturingAudioSink;
public void setCapturingAudioSink(CapturingAudioSink capturingAudioSink) {
this.capturingAudioSink = capturingAudioSink;
}
@Override
public void flush(int sampleRateHz, int channelCount, @C.PcmEncoding int encoding) {}
@Override
public void handleBuffer(ByteBuffer buffer) {
checkNotNull(capturingAudioSink)
.interceptedData
.add(
new DumpableBuffer(
capturingAudioSink.bufferCount++,
buffer,
capturingAudioSink.lastPresentationTimeUs));
}
}
private static final class DumpableConfiguration implements Dumper.Dumpable { private static final class DumpableConfiguration implements Dumper.Dumpable {
private final @C.PcmEncoding int inputPcmEncoding; private final @C.PcmEncoding int inputPcmEncoding;

View File

@ -37,7 +37,6 @@ import androidx.media3.exoplayer.DefaultRenderersFactory;
import androidx.media3.exoplayer.Renderer; import androidx.media3.exoplayer.Renderer;
import androidx.media3.exoplayer.RenderersFactory; import androidx.media3.exoplayer.RenderersFactory;
import androidx.media3.exoplayer.audio.AudioRendererEventListener; import androidx.media3.exoplayer.audio.AudioRendererEventListener;
import androidx.media3.exoplayer.audio.DefaultAudioSink;
import androidx.media3.exoplayer.audio.MediaCodecAudioRenderer; import androidx.media3.exoplayer.audio.MediaCodecAudioRenderer;
import androidx.media3.exoplayer.image.ImageDecoder; import androidx.media3.exoplayer.image.ImageDecoder;
import androidx.media3.exoplayer.image.ImageOutput; import androidx.media3.exoplayer.image.ImageOutput;
@ -89,7 +88,7 @@ public class CapturingRenderersFactory implements RenderersFactory, Dumper.Dumpa
public CapturingRenderersFactory(Context context) { public CapturingRenderersFactory(Context context) {
this.context = context; this.context = context;
this.mediaCodecAdapterFactory = new CapturingMediaCodecAdapter.Factory(context); this.mediaCodecAdapterFactory = new CapturingMediaCodecAdapter.Factory(context);
this.audioSink = new CapturingAudioSink(new DefaultAudioSink.Builder(context).build()); this.audioSink = CapturingAudioSink.create();
this.imageOutput = new CapturingImageOutput(); this.imageOutput = new CapturingImageOutput();
this.imageDecoderFactory = ImageDecoder.Factory.DEFAULT; this.imageDecoderFactory = ImageDecoder.Factory.DEFAULT;
this.textRendererFactory = TextRenderer::new; this.textRendererFactory = TextRenderer::new;

View File

@ -27,7 +27,6 @@ import android.content.Context;
import androidx.media3.common.MediaItem; import androidx.media3.common.MediaItem;
import androidx.media3.common.Player; import androidx.media3.common.Player;
import androidx.media3.exoplayer.audio.AudioSink; import androidx.media3.exoplayer.audio.AudioSink;
import androidx.media3.exoplayer.audio.DefaultAudioSink;
import androidx.media3.test.utils.CapturingAudioSink; import androidx.media3.test.utils.CapturingAudioSink;
import androidx.media3.test.utils.DumpFileAsserts; import androidx.media3.test.utils.DumpFileAsserts;
import androidx.media3.test.utils.FakeClock; import androidx.media3.test.utils.FakeClock;
@ -53,7 +52,7 @@ public final class CompositionPlayerAudioPlaybackTest {
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
capturingAudioSink = new CapturingAudioSink(new DefaultAudioSink.Builder(context).build()); capturingAudioSink = CapturingAudioSink.create();
} }
@Test @Test