mirror of
https://github.com/PCSX2/pcsx2.git
synced 2026-07-11 17:54:20 +02:00
Compare commits
5919 Commits
1.2.x
...
v1.7.0-dev
| Author | SHA1 | Date | |
|---|---|---|---|
| 15a9a95284 | |||
| 56ea8c4fe6 | |||
| c4c1b58108 | |||
| 6fd328611f | |||
| 18f772e71c | |||
| 97df1dd3b5 | |||
| 4ce3fdfcb2 | |||
| 939e576df9 | |||
| 1939671e7f | |||
| ea52da9428 | |||
| f0d08aa7d0 | |||
| a7717b9ff1 | |||
| ba449a524a | |||
| f68bbfba60 | |||
| bce30e7388 | |||
| 58f5a5b915 | |||
| e53b2585d1 | |||
| 49e316e488 | |||
| 56b76b17a0 | |||
| 8d3ff9444f | |||
| 7b9547de3e | |||
| d652d4e364 | |||
| 69b97dc3a6 | |||
| 2c294fad8e | |||
| 4aa594197a | |||
| 62dd5d980d | |||
| 5afa0e6d20 | |||
| 79db01d7ed | |||
| 2c4af87e13 | |||
| 6e22efe790 | |||
| 3b380148ee | |||
| 420f642f65 | |||
| d7ae93d856 | |||
| a3114a2f8d | |||
| 47cfbcb3fb | |||
| d13f5b192b | |||
| 160f4fd255 | |||
| 9770755881 | |||
| 82ebf36970 | |||
| 9fd8d5c58c | |||
| e55ad0a12e | |||
| b944e54868 | |||
| e45fa9b6d8 | |||
| 6a5795abaf | |||
| 4858dea259 | |||
| 75346f42c3 | |||
| a7285ff375 | |||
| 63eaea26d2 | |||
| c0eb053866 | |||
| 2b6905307d | |||
| 5308be3c4d | |||
| 654af774c8 | |||
| 4b72c32a09 | |||
| 8550cb9b1b | |||
| 69ae598b7e | |||
| f54b79c274 | |||
| 9af1d3b137 | |||
| 46f1821046 | |||
| 6bcd118b62 | |||
| eb2ca00e8d | |||
| 6ef0e94520 | |||
| 0c5353a709 | |||
| f9e3605254 | |||
| f5eeaf1baa | |||
| 5aef5030d7 | |||
| cacaf3822b | |||
| e43ba53ea9 | |||
| 3d06cca15c | |||
| d77168f19e | |||
| 8e420fe39b | |||
| b9c0faf51c | |||
| bb5e91a377 | |||
| 6452ae077c | |||
| 96ef800777 | |||
| 7a83f7c8f6 | |||
| df639970c6 | |||
| 9c12937351 | |||
| 80e3e00f96 | |||
| d78f9fdf2b | |||
| 03027453c8 | |||
| 10dd9412a1 | |||
| 90b0e7af83 | |||
| 471a58a7a9 | |||
| 63a6e94444 | |||
| 9ff5f5de7e | |||
| 908049a0fb | |||
| 363b87b334 | |||
| 1dc5d07696 | |||
| 18fe9431e0 | |||
| bbc3e36055 | |||
| 23cbfdcf47 | |||
| 2ec35f4493 | |||
| 92473c2ef6 | |||
| 02a9d73c89 | |||
| 9c65b73ae6 | |||
| 23174f3a00 | |||
| aa03c83126 | |||
| 230c1ece35 | |||
| 21227cd12f | |||
| 2827394f3c | |||
| f2da7ece5c | |||
| cc62165e36 | |||
| 50dda75c0d | |||
| f6600ec835 | |||
| dbfbc333f4 | |||
| 89848346ae | |||
| 132caf7f4a | |||
| 3c38087e78 | |||
| 24be7785db | |||
| 5b6b386708 | |||
| e7d1a58a5a | |||
| b34338a500 | |||
| 70c2778686 | |||
| 293983ea71 | |||
| 7bf920b07c | |||
| c6b8763ba6 | |||
| afde59bb19 | |||
| fa096cfce0 | |||
| c87b8c7f49 | |||
| aee571e9b2 | |||
| cc52be15f3 | |||
| 3a15751fe9 | |||
| f2a9b59aae | |||
| 1c66851344 | |||
| fd5d80b53f | |||
| d943870413 | |||
| 45687cd51a | |||
| e506dc1457 | |||
| d92e4343e3 | |||
| 0967f9bcfc | |||
| 33f4f04594 | |||
| 6392f79fb6 | |||
| 2a94dbcfe3 | |||
| 4db6b287cd | |||
| ee05d55a51 | |||
| e2d8992310 | |||
| a69cb88b16 | |||
| 877c4358d8 | |||
| 159ce78680 | |||
| f2b402b0cb | |||
| 0e84e2c438 | |||
| aef0f94dcf | |||
| 476ccf8ac9 | |||
| b44c0a3fbd | |||
| d3ecec5d6c | |||
| 62d07c8335 | |||
| 99f814d376 | |||
| de7a3b70c9 | |||
| 92aa43fe91 | |||
| 014753894a | |||
| d048baf503 | |||
| 74e6c437f2 | |||
| 7679dcf469 | |||
| 03133bc539 | |||
| d77d440a04 | |||
| 6feb59fef5 | |||
| 63982bf6b7 | |||
| 9788f6db2c | |||
| 33571dda42 | |||
| 0db14df070 | |||
| c381cb90be | |||
| eda1ab44ac | |||
| e8fe2eeb59 | |||
| fc8423e49d | |||
| 88a02941f6 | |||
| 9b651e44d0 | |||
| 9830b2dd98 | |||
| beac776025 | |||
| 9e687895e1 | |||
| 7c42928b57 | |||
| 68cfc5d953 | |||
| 2007894ba6 | |||
| dfa4680547 | |||
| 1f6b44d556 | |||
| 924156f3cb | |||
| af6f040202 | |||
| ed6ac00186 | |||
| 4e58558eb7 | |||
| 4c1b7086be | |||
| 4bb968158d | |||
| c0a38b45f1 | |||
| 77f52cf04d | |||
| c8a285dee6 | |||
| 7b6c2be067 | |||
| c6b944753b | |||
| 6bc322cab1 | |||
| 62c1fc621a | |||
| c14c23a063 | |||
| b6415bf6fc | |||
| 73369db6c2 | |||
| 9dd92c1cb5 | |||
| bd6261e3de | |||
| b749c8ef7d | |||
| 317683461f | |||
| 0d6b9e9570 | |||
| b245b06959 | |||
| 003046c91c | |||
| 66487b18e3 | |||
| 51ba799779 | |||
| 11187cff9e | |||
| 0814690534 | |||
| c8c1429493 | |||
| e79ea75ae2 | |||
| 55d469e7f2 | |||
| ddb6aac826 | |||
| fd69720d11 | |||
| b48bc8e71c | |||
| 902b88ac1a | |||
| 7d1d88e408 | |||
| 5de92562a7 | |||
| 2e4e22f0a5 | |||
| a4d899132c | |||
| 41baf1de14 | |||
| 91570a9e0f | |||
| 888897ed48 | |||
| 56b8612502 | |||
| 557f50fb4e | |||
| 6ccc4911c5 | |||
| ee9c31317e | |||
| 2f8932e370 | |||
| dbfe21c444 | |||
| f409079864 | |||
| c678627b19 | |||
| a3f3e7705d | |||
| b739e9187d | |||
| 8e3b34bce6 | |||
| 6f09cd9b81 | |||
| 96b02be1d1 | |||
| 9961478212 | |||
| 3886d72e0f | |||
| d0cb0f59d9 | |||
| 2cd9aff867 | |||
| cc1a320c61 | |||
| 441e786d3d | |||
| 7c17b9ef5b | |||
| 132332f9b8 | |||
| fc35de02f2 | |||
| 7054450348 | |||
| a6f7a9576e | |||
| a36d5a0221 | |||
| 7290576a2a | |||
| ba2efec983 | |||
| b19804190e | |||
| 40929a4728 | |||
| e9825dccc0 | |||
| 066a9aaf71 | |||
| 3ee72e7cec | |||
| 62417dae99 | |||
| 14178cb184 | |||
| de1717c1a1 | |||
| 43981f5981 | |||
| 300f16df61 | |||
| 9401e52b08 | |||
| 61b984a6c1 | |||
| 11cd6b56cd | |||
| 1fc3516637 | |||
| 4195b77fa3 | |||
| 9acb871c7b | |||
| cc6a58da18 | |||
| 563772fdf1 | |||
| e6d42338ad | |||
| e89f46139b | |||
| a936cd9eb1 | |||
| 34bedddd5c | |||
| 55f4dea468 | |||
| 39f509feaa | |||
| 6a122268cb | |||
| cec185fd66 | |||
| 0781cb65bf | |||
| 3228789808 | |||
| 6024359011 | |||
| 60cf62fea1 | |||
| 6bdd4ff186 | |||
| 718042e6a6 | |||
| a3bf46ecd9 | |||
| cd11ae1ac6 | |||
| 668670941c | |||
| 976b77f144 | |||
| a1a6374709 | |||
| 1f1b68a9b4 | |||
| fbafd44209 | |||
| 877a112193 | |||
| 8ff74fc6c2 | |||
| afd5ceef7a | |||
| 5e043b3b6f | |||
| 3fb2afb51a | |||
| 482f1e953a | |||
| ed8592b30b | |||
| 3289dc1cc7 | |||
| fe8793081a | |||
| c6fcf0aaab | |||
| 87808fee03 | |||
| 2941fd9b87 | |||
| 5d4ae31ba1 | |||
| 284880f768 | |||
| 2d46bc661d | |||
| 9a5225dfdf | |||
| 079baaed99 | |||
| be46832c7b | |||
| 637f777ea9 | |||
| eb0d22626f | |||
| de0c4a7fc7 | |||
| 5a69a2f689 | |||
| 87f36852b6 | |||
| bbce809ac9 | |||
| 56a976e277 | |||
| b270c1bb67 | |||
| 6a202c9b5f | |||
| d00b8081ac | |||
| ff9749f6dc | |||
| ead3d21bdb | |||
| 568b96b885 | |||
| 70c3c1a48f | |||
| e77aac0bf1 | |||
| bdcf83ca45 | |||
| bb306dfe90 | |||
| 116a5d822c | |||
| 9618283217 | |||
| 55e95cc552 | |||
| e9989a5966 | |||
| a1cdeb2fd1 | |||
| 4e675ef6e1 | |||
| ba782e90c8 | |||
| 16d5f477ff | |||
| e8b2d036ee | |||
| 9e7069f374 | |||
| 643ed528c2 | |||
| 3408d1a873 | |||
| a0c6c1cb9f | |||
| 8eab618502 | |||
| 34ac15f7eb | |||
| 7eb0b0ac65 | |||
| 97612edd58 | |||
| 6af2f7ef46 | |||
| acf771edd8 | |||
| 7f5dc2135e | |||
| c3f36ad430 | |||
| d4b62444d1 | |||
| 6a4fa90b8f | |||
| 641df126c4 | |||
| e72aa23436 | |||
| de5e9a85bb | |||
| 9d60d6acfd | |||
| 060689d3e9 | |||
| 6bae2f7629 | |||
| 4202cbe7e8 | |||
| 0980c7185f | |||
| ec9c97e0bf | |||
| 506ea4c4d2 | |||
| 08d923ca6f | |||
| 64104ca9fd | |||
| c12c6ed149 | |||
| eb7030cf12 | |||
| 270f7fd905 | |||
| d7074503d8 | |||
| 6b3fb14339 | |||
| db4ff1e8fc | |||
| 3d6bfacd55 | |||
| 8b6ccde441 | |||
| cb7425c59f | |||
| 6e111205a2 | |||
| 5fefe28e39 | |||
| 94c160401c | |||
| 0021ad66e0 | |||
| ddd2e3f8f0 | |||
| 7a03bafa27 | |||
| 7b79235f19 | |||
| e2e882e08b | |||
| bad3fa73f4 | |||
| 407224d29c | |||
| e3333a9b8c | |||
| 413ba4b430 | |||
| 6252c7bd6a | |||
| f147923555 | |||
| c2a19b7be5 | |||
| 4d88a57f27 | |||
| ac89730a4d | |||
| ac1bc9d6fc | |||
| f406051ed9 | |||
| 1414d64b18 | |||
| 773be7bb95 | |||
| 48b2383096 | |||
| 075a9f38ed | |||
| d3ddd9b1f7 | |||
| 163fd2bad9 | |||
| 52da124a2b | |||
| a58f56fa4a | |||
| 17ac536116 | |||
| 73e3072715 | |||
| 9332f9b1ac | |||
| 508a8b477e | |||
| b68761fa0d | |||
| bb0c0d3d27 | |||
| fc5dde464f | |||
| 9c222f8efe | |||
| 5f099b1bea | |||
| 55112938a2 | |||
| e73607395b | |||
| a16fe6f016 | |||
| 374374fdf1 | |||
| 535b0d4aac | |||
| 0e3e9c2c59 | |||
| 987f783632 | |||
| 936f66d701 | |||
| 3133221fd7 | |||
| d7fd3d7648 | |||
| 10ee832dc1 | |||
| 5c7084f8bf | |||
| f5bf1f655d | |||
| a30f642860 | |||
| 0d5ae808ef | |||
| f8a6a3c6ef | |||
| c8d4d5528e | |||
| e9e7580582 | |||
| 3296ade983 | |||
| 7982e3abfe | |||
| 7354c1fa0d | |||
| 889001c026 | |||
| 910ef1db41 | |||
| 47c255be2c | |||
| 3155278ac7 | |||
| 8219bcd1b4 | |||
| e36976bf86 | |||
| e48ce1bc69 | |||
| 46e63c1f17 | |||
| 5c23a9fac0 | |||
| 5af929a387 | |||
| 811d8781ab | |||
| 8a16d96112 | |||
| 7106909d3f | |||
| 90531f8b7b | |||
| 425059d882 | |||
| 8a9abd8a1b | |||
| ffe6587e62 | |||
| 79a38858d1 | |||
| 64ab2d53e1 | |||
| 8e8598412d | |||
| 930f07df4a | |||
| e56f75fe9a | |||
| aa2b474d1a | |||
| a9c1a1c768 | |||
| 80f8de5e0b | |||
| 61c4df0375 | |||
| e55fcae981 | |||
| 29aef04fbf | |||
| 12dcb701c7 | |||
| 6df9eb8dab | |||
| 9c60541f3c | |||
| c6f57c0bdb | |||
| 8cb6d255ca | |||
| 6905d4d883 | |||
| cc2fda6d6d | |||
| c0a47c2c79 | |||
| bcba2597f3 | |||
| 31d95448ed | |||
| 45dfb0dcdb | |||
| 90e38f68d8 | |||
| ea6f9acf86 | |||
| a130fcaa4e | |||
| 119ab90657 | |||
| 5a4541f2f4 | |||
| 12b622c9c1 | |||
| 19586fdd7f | |||
| ca002c56e5 | |||
| c898c13eb9 | |||
| 7406e13028 | |||
| cc6ac657f8 | |||
| 6e49139d0e | |||
| 46b70a72cb | |||
| 8c6e4cd28b | |||
| dabc99f466 | |||
| b5f0959e6d | |||
| a9e622357a | |||
| 371b52f4f3 | |||
| ad0279a0ab | |||
| 96623acdcd | |||
| 6282c3d263 | |||
| 86a10969f3 | |||
| 2ea47a1d96 | |||
| fa7ffcd1bf | |||
| 0e4c63db5d | |||
| aed7ccaadf | |||
| e6b0a7828e | |||
| 2c99a0775c | |||
| 8cd6f4375e | |||
| cd333c2c94 | |||
| 8a723b3be8 | |||
| 4f09124f19 | |||
| dbffad2aef | |||
| f25fe48c9b | |||
| 1ae48db873 | |||
| 1094446862 | |||
| 6a52b8cdcb | |||
| d71dac0918 | |||
| 61c68f20f0 | |||
| f02c683178 | |||
| ee7749452d | |||
| 4c477d3cd6 | |||
| af64865c5d | |||
| ece7d6e718 | |||
| 4ab29eb280 | |||
| d4833a4618 | |||
| 744fa18d95 | |||
| 19b97f8684 | |||
| 2e2c9b14a4 | |||
| 224d51b0aa | |||
| ac1424ad6d | |||
| 0e239cac66 | |||
| 8791d8e5b0 | |||
| 7b4133ac08 | |||
| 78f0b65e19 | |||
| b9df1e643b | |||
| 628f5abaac | |||
| 2aadf0be89 | |||
| 55bc8e13fc | |||
| 8c8b1f497c | |||
| 468b9ded46 | |||
| 57824261c6 | |||
| 946e6046b3 | |||
| 548d6b31bf | |||
| 4ecbb750a8 | |||
| 7247ee1ad0 | |||
| b4cb805a91 | |||
| bbd8cbbcf4 | |||
| 85e2a0a6bb | |||
| f28f03803f | |||
| 0c3a0da58f | |||
| 51fe6c20ca | |||
| 5fe1cab889 | |||
| e429677a07 | |||
| bf8dc7707a | |||
| fa4ae7800b | |||
| ee4d295667 | |||
| e05b5d2420 | |||
| 25ed5857d8 | |||
| 3a7f2a5c0b | |||
| 106c678cc1 | |||
| 52bad3505c | |||
| f5b9965910 | |||
| 6f01936943 | |||
| 9119e3110d | |||
| f73de4c59c | |||
| 7e6c325210 | |||
| 86327b52a9 | |||
| d17e0eba9b | |||
| 8a57d7f470 | |||
| 1b41d19016 | |||
| e0877608ae | |||
| fb5471f34f | |||
| ea38e2eba5 | |||
| f2f66c02d3 | |||
| c58acd1105 | |||
| 54f8aca7d5 | |||
| 062d141cf1 | |||
| 67a6f31b88 | |||
| 4cf3328682 | |||
| 549b438a84 | |||
| 43fa7cd6c6 | |||
| d55e9cbd96 | |||
| ec6ac75b10 | |||
| 5d62e47229 | |||
| eddaf71d47 | |||
| e847d94062 | |||
| 781323ff10 | |||
| 01c64f1b35 | |||
| 7577165a97 | |||
| 0b72708981 | |||
| d13d5aef00 | |||
| a97bc2309a | |||
| 0ff7ea3ccc | |||
| 9c0bbfec1f | |||
| 752dbdefd2 | |||
| eb7824e6ff | |||
| d1c8808797 | |||
| 6575fe7cce | |||
| d5bd5db072 | |||
| b3006e2a6a | |||
| a020c98421 | |||
| a5564896ea | |||
| e0c598f38e | |||
| 4076e3387e | |||
| 29941f3e0d | |||
| e299ac1ffa | |||
| 59ecfb23d7 | |||
| 154dea1557 | |||
| da76440c14 | |||
| dc2eed6ca1 | |||
| f6df6b350b | |||
| 83da33e2ab | |||
| cb59794b8d | |||
| 1ae4b5d0ba | |||
| 5e9ffc4a94 | |||
| bf4997b6a5 | |||
| 48007350b6 | |||
| 4644a16c5b | |||
| 7e8360efbc | |||
| 6a5bb5df83 | |||
| e12447101f | |||
| 48b8d78139 | |||
| a2f3b78bac | |||
| 1957cf13c2 | |||
| eb000f0f41 | |||
| f41b536682 | |||
| 11f09d4944 | |||
| 691eae755f | |||
| 02bde2f386 | |||
| c23d256f02 | |||
| 526faf9193 | |||
| 606944a127 | |||
| 4a0697fda2 | |||
| 0901f0a848 | |||
| e51eadaf16 | |||
| a4f794f3a6 | |||
| 58be50d978 | |||
| f8ae0f7e19 | |||
| 3819e22432 | |||
| 1b0112de22 | |||
| 038ae8c7fc | |||
| d624927022 | |||
| 5e75a66f82 | |||
| 83d293d41c | |||
| 5713993777 | |||
| e683ce2994 | |||
| 63bbf52219 | |||
| cdeacafd27 | |||
| 8ec184d265 | |||
| 824473a34b | |||
| d4d95e2f10 | |||
| 697aa5e4b7 | |||
| f0fec02eec | |||
| 6f6e5eb325 | |||
| 6899fc74f9 | |||
| 415e27136e | |||
| d9da9f4bc2 | |||
| fce3918562 | |||
| e091f4233a | |||
| 0353273733 | |||
| 3b11164637 | |||
| 1ad71a9b85 | |||
| 1a61148b00 | |||
| 0c0e0e9266 | |||
| 59752120d6 | |||
| 5527bcb13e | |||
| bf0106d2bc | |||
| ef0ebd6517 | |||
| 554b797b92 | |||
| 84dbdd6b18 | |||
| 1427d55b08 | |||
| a743707728 | |||
| 07989a0a17 | |||
| c2fd67b1cb | |||
| 93f1dc2804 | |||
| 7d938834d2 | |||
| bb0f08b2c1 | |||
| a8c2076d04 | |||
| e87a6b9ccd | |||
| a1f4d2ca3f | |||
| 013c47950d | |||
| 50b71f69da | |||
| 7215618621 | |||
| 3a9ff840cf | |||
| abb1cc5fe7 | |||
| c511ce80d2 | |||
| c7aca64642 | |||
| c8f53f32fc | |||
| cd5132d201 | |||
| d38bd9c950 | |||
| 4669e1423d | |||
| 0e43803562 | |||
| 73209c520c | |||
| 46989a0c6c | |||
| aa5c0ebb95 | |||
| b2155f82f4 | |||
| fe845aee58 | |||
| 0a5b1eb75d | |||
| f605012659 | |||
| c183368d72 | |||
| 894ce5b7d6 | |||
| c368afd6d2 | |||
| e1dff69a43 | |||
| 774373cc65 | |||
| acbe6c24a0 | |||
| 202945aa49 | |||
| bc524d5e56 | |||
| bea4e56d5d | |||
| 80af99bb44 | |||
| 0704b73c2f | |||
| d05163a26f | |||
| ecbd8d9f2f | |||
| ade00f8a70 | |||
| eb3a423f80 | |||
| 4328d099c4 | |||
| 9a5bf12c0b | |||
| 7928cff354 | |||
| c3a1cc3801 | |||
| af742a753e | |||
| 3a094604f6 | |||
| 71ac570f32 | |||
| b6d06f53d6 | |||
| 4da3f567f4 | |||
| 959d652dbb | |||
| 38da174670 | |||
| 1fa68071d8 | |||
| f8ec61a3fc | |||
| 417ba188bd | |||
| e4e93bd7f5 | |||
| cf97c304ac | |||
| 8307cfc54d | |||
| 8747781bdc | |||
| 9abe96cba4 | |||
| 5035869d96 | |||
| f687f993cc | |||
| 6c34f6c334 | |||
| b33418f270 | |||
| 31c2d2a654 | |||
| f183ca12d9 | |||
| 584397a3fd | |||
| 8a04f5f52c | |||
| ef9570003e | |||
| 9899d0d6b7 | |||
| 8ff0249213 | |||
| 9a10612f0b | |||
| c8f52b0ba3 | |||
| 193bda164b | |||
| 3b96e98eac | |||
| f0c064261b | |||
| ee89fa5eec | |||
| 57a90e5fa5 | |||
| 3d6921d9ca | |||
| 651d287f1d | |||
| ec6b5a12e3 | |||
| 252458d5bd | |||
| c6abc08b5f | |||
| fd7a862226 | |||
| 292e7a6573 | |||
| a092806d38 | |||
| 40e9ce9036 | |||
| 9994111173 | |||
| 11ddfefb60 | |||
| 0161c2838e | |||
| ae2642e55a | |||
| d8702a9523 | |||
| 210829f633 | |||
| cfb61c71dd | |||
| 2e1db411fa | |||
| 15733ed8cf | |||
| 51ceec74a3 | |||
| ca68ddd0d0 | |||
| 42aee34482 | |||
| ef3802b67a | |||
| 41459e6a2c | |||
| 63f9d419f8 | |||
| a26dc73836 | |||
| 48d90a988a | |||
| b26ed0db60 | |||
| 3280860ca9 | |||
| 292dbbb6ac | |||
| 1b0b89776f | |||
| 56fb12878e | |||
| 9e7b2ed153 | |||
| b8b6a55952 | |||
| c280d69d6f | |||
| a3c6ad636b | |||
| d1dc12f6b0 | |||
| 9fa1b290ba | |||
| 77a924ee7d | |||
| 3ccc53ee74 | |||
| 5faed17d21 | |||
| 9fdb7f6cd5 | |||
| 96ccdb40f1 | |||
| 6052614233 | |||
| fd75085111 | |||
| c5edd38681 | |||
| 8f52d82e58 | |||
| fc1d9aef09 | |||
| dce6d3f451 | |||
| 122871654e | |||
| 6710b0c906 | |||
| 0cbbf2daf9 | |||
| a25f3ccdda | |||
| bb5d120a3b | |||
| 6dca3656ed | |||
| df307bed02 | |||
| 5ef53b4587 | |||
| 6ab47c934d | |||
| a8e8cb9b6e | |||
| 411e434baf | |||
| c92e76b17e | |||
| 322290b19c | |||
| 8f986828e7 | |||
| 77ac35058c | |||
| 933e43cb58 | |||
| 5f9ddd2f83 | |||
| eb955592ee | |||
| 6b22450a1b | |||
| 06f4b77f63 | |||
| 21f0752ce7 | |||
| 49b91ea78f | |||
| cb05daf437 | |||
| 6ad4345a39 | |||
| 149f30c7fa | |||
| 802ae36a66 | |||
| 70033020a3 | |||
| af646895f4 | |||
| a892a95af7 | |||
| 48d9763d26 | |||
| fa53968b3c | |||
| f3610b7c5c | |||
| b5e8a2166b | |||
| 7837d69021 | |||
| a84a315473 | |||
| eac7527b93 | |||
| 54ddf5becb | |||
| b360c07253 | |||
| b1ca6ba528 | |||
| 0dcd60b524 | |||
| c337ab6a66 | |||
| 897b17d259 | |||
| 1bd26f6fc9 | |||
| 904ffb5d20 | |||
| 201e7d1430 | |||
| e5565d32b1 | |||
| f965502187 | |||
| 896c9cccec | |||
| f800ed9c2e | |||
| e44fc33d48 | |||
| 4a2549ef24 | |||
| 8defe54e3b | |||
| db18a01a7b | |||
| 379d9e4b88 | |||
| d5700a8508 | |||
| 5719c6c3c0 | |||
| 281b6861e1 | |||
| 614209be2d | |||
| 940263d490 | |||
| 2d094cbc3b | |||
| 9d562a454b | |||
| da1eb056a3 | |||
| 694546e870 | |||
| ef29daa9d0 | |||
| 7641d6726f | |||
| 08a270a429 | |||
| 2aedb97796 | |||
| f6ba6cc3a9 | |||
| 629d2bd425 | |||
| 92484a8416 | |||
| 042311a827 | |||
| e90c87a8ef | |||
| d632454a23 | |||
| 560966c539 | |||
| e063be3043 | |||
| a275cf8e57 | |||
| 3fe9ff7ac8 | |||
| 2f5ba10e6b | |||
| 728fa2c1a4 | |||
| 7433ee7fc1 | |||
| f47321c287 | |||
| 8acc319a4a | |||
| f3d738d771 | |||
| 914573a5c3 | |||
| 14a62c3a3f | |||
| e9ae9cacd8 | |||
| 577bfaa8cd | |||
| f40c1de919 | |||
| 6b52cc9829 | |||
| ad143d92da | |||
| 9cb35a8972 | |||
| 6e3f41f164 | |||
| d8e6ba4274 | |||
| a977f1e6c1 | |||
| d520f3852b | |||
| 50e3474b60 | |||
| 3c5fad7ef6 | |||
| f7fb0f686b | |||
| 55155ca7f1 | |||
| f3e78b8267 | |||
| 6b2fcbd070 | |||
| c39dc3dd78 | |||
| e1fcd569e7 | |||
| 96a62351ac | |||
| 38366c084e | |||
| 93d5b52df3 | |||
| 5b9e93c652 | |||
| 37d84a7148 | |||
| ada5daf7c7 | |||
| b374b1bca6 | |||
| 81faa33a38 | |||
| a922a0b1f5 | |||
| 4dcb47d829 | |||
| fcda371f9a | |||
| 6e3d6a1b17 | |||
| bde62436fa | |||
| 76a75efef1 | |||
| 846f31851e | |||
| 22f1048e8f | |||
| e4dd0069ca | |||
| 05004450a0 | |||
| 3e8f9ac518 | |||
| 4d8dea0892 | |||
| eb104f60e2 | |||
| b6db0a3c30 | |||
| 5694ef56ca | |||
| 8a93a71504 | |||
| d09ac6d589 | |||
| 5a77123a15 | |||
| 98ac329cf5 | |||
| 122f730608 | |||
| 7963f418c1 | |||
| 4eaee45d1a | |||
| 7c33694c1a | |||
| 4dc4892588 | |||
| 0a62461515 | |||
| 78282c7ed7 | |||
| 33db759a77 | |||
| 10ac426fd5 | |||
| 4c9525c9d9 | |||
| bcb7805c11 | |||
| 1aeec47b30 | |||
| d7cdbf6f27 | |||
| 4060bcf9c9 | |||
| f09837f939 | |||
| 7bcfc9827e | |||
| cf222d1ccf | |||
| 937fee84f4 | |||
| 11bad7b07a | |||
| 6eb385fd9b | |||
| 188a1f1416 | |||
| 1498f538dd | |||
| fc1d88cb51 | |||
| 51cf02d27b | |||
| 04ff2aff65 | |||
| c695d6a3a3 | |||
| 890d7ab953 | |||
| b84a2cfaf6 | |||
| d258ef6275 | |||
| 546eac4646 | |||
| 8391b08e8f | |||
| c28353e01f | |||
| e8ed18feba | |||
| 39b405648a | |||
| d00e0ed605 | |||
| 8a4cfe9b23 | |||
| 29eb9f05de | |||
| 811605fcb5 | |||
| ca35e707c4 | |||
| 352fbf0c1f | |||
| 8b6ffc3f45 | |||
| cdee1875a5 | |||
| 354b11c619 | |||
| c10d6c3ed1 | |||
| a0f96189d3 | |||
| 27d39d98d3 | |||
| 9255f785da | |||
| 6cfe287c70 | |||
| f80af64a2b | |||
| d9fa7f7d34 | |||
| 4a7304de50 | |||
| 8b0114596b | |||
| 1e0b0605a6 | |||
| 59ec48a120 | |||
| b5d6ccace1 | |||
| 4e429b27be | |||
| 0efbd283c4 | |||
| 1b5f2639a0 | |||
| 219519b578 | |||
| 286e7293fa | |||
| c9dbd4118b | |||
| 27d0995a8b | |||
| 126bfa3ee7 | |||
| b2ae86d142 | |||
| d09737dbb5 | |||
| 6d1d32cd83 | |||
| dca7bf5edc | |||
| 4ebfceffd2 | |||
| 69888e5ab0 | |||
| 46662b0436 | |||
| d300d85787 | |||
| 75264ee423 | |||
| fb7c2c1837 | |||
| 9d4f8a322c | |||
| ac7cbdf6c3 | |||
| 7cdec614c7 | |||
| 43f461cc36 | |||
| ceb383628b | |||
| 278f6e5941 | |||
| 46866268ed | |||
| d73741c9b8 | |||
| cbf8f22b62 | |||
| 1fefb4897e | |||
| 7b8d2d1945 | |||
| be4b06ef3e | |||
| f41e5da94b | |||
| 7761ec5584 | |||
| bb1c225e66 | |||
| 387db6d4ba | |||
| 5c483df3e8 | |||
| 2af05a92f8 | |||
| f22843816b | |||
| 54b0edbb13 | |||
| fa7822fbbf | |||
| ba1689f6d6 | |||
| 150b1e8423 | |||
| 74aefcb918 | |||
| abdd847fbe | |||
| 62b7097731 | |||
| 6bd5afea8f | |||
| 6778fa2b71 | |||
| 4ab97be693 | |||
| 83ffbc2d3d | |||
| 2b9c368fa8 | |||
| 6f4212320b | |||
| bb5f989c05 | |||
| af3e55af63 | |||
| 1c58d5acff | |||
| 6f2ded8222 | |||
| 30b722b807 | |||
| a9af0ee5a0 | |||
| 4765770dc8 | |||
| 9c1224b045 | |||
| 140a61692d | |||
| f244706cc2 | |||
| ba463ed076 | |||
| 61406a4349 | |||
| 6ef793545d | |||
| c78b5b706d | |||
| 810bec2d65 | |||
| e0029270e3 | |||
| 823431599f | |||
| 342c10bd85 | |||
| a6db486afe | |||
| 48ebfea17b | |||
| dc2779b385 | |||
| 8c2a79ab54 | |||
| 6bf87d7eff | |||
| d900917bfa | |||
| c5f94fbced | |||
| c4068e5188 | |||
| ff3052935e | |||
| 9b82449542 | |||
| 290397d1af | |||
| ade38d4f85 | |||
| 8b6751943e | |||
| 171e7f016d | |||
| 5ec5265ec4 | |||
| 78af562897 | |||
| a17b0e5364 | |||
| 3a8857a782 | |||
| fbc0b1849d | |||
| 35a2c59181 | |||
| 8f6a3d9fe8 | |||
| 15efe69e46 | |||
| 191219f7d8 | |||
| 1f21945d52 | |||
| e606958a43 | |||
| 34a94990c4 | |||
| 3f916f440a | |||
| 4de2df2865 | |||
| a3f07e6baf | |||
| 17027c16cd | |||
| ab9bdb009b | |||
| b84b2808f4 | |||
| 7ea0273119 | |||
| dc53278163 | |||
| 6496e6db11 | |||
| 1d7cef08a7 | |||
| 908a37598c | |||
| c8c9731262 | |||
| 0f5d3d2f1b | |||
| 011cd90fbe | |||
| f99711cdc2 | |||
| 630177ef4c | |||
| 28fd47dd22 | |||
| 2c11acf40c | |||
| 230a497a12 | |||
| 6073a26f5d | |||
| b622474adb | |||
| 834cd08f8c | |||
| 0e329347cf | |||
| e27ef3c081 | |||
| 1292cd505e | |||
| 0e39caaad3 | |||
| b6a73f6db3 | |||
| 4cb164b795 | |||
| ee3038c5b7 | |||
| efc1274b2c | |||
| 014e27bc20 | |||
| 312db7755b | |||
| 9769f19ebe | |||
| 0e83b89dbd | |||
| 2ad5db2279 | |||
| 99350d6caa | |||
| 1f0de9a1ce | |||
| 40f7d6c95b | |||
| f6637ff958 | |||
| 6aaae6970e | |||
| f4fa115c82 | |||
| bd0947e7a3 | |||
| 432999fae8 | |||
| 6d7e2c56d9 | |||
| f6e4a3081d | |||
| de1584b9f2 | |||
| a132d923ce | |||
| 73f1d7d099 | |||
| a9168fed56 | |||
| 084530eeca | |||
| fb4f274882 | |||
| 38aa4e1745 | |||
| 2be9cf060d | |||
| faa4be49c7 | |||
| 8dfeeb354f | |||
| c3dbc4e945 | |||
| 629bb23832 | |||
| ff68ad61e7 | |||
| 0c20385ccf | |||
| ed0fba174e | |||
| b3a1345bb8 | |||
| 41f6337bfa | |||
| 333e0cc82f | |||
| afd6541ca4 | |||
| de0f36fe78 | |||
| ee57605f77 | |||
| 10ebe16653 | |||
| c1fd01545a | |||
| 768a4412d5 | |||
| 64442379aa | |||
| 4e3730f8f4 | |||
| 7667635752 | |||
| 78d4e5a3bf | |||
| 5aba06f354 | |||
| b8257d2c58 | |||
| 15c9006f0d | |||
| 41c49faa81 | |||
| c23241c5f4 | |||
| 785fe6b2e3 | |||
| 5fdc9da885 | |||
| ca22aadca9 | |||
| b10c357065 | |||
| 743caf46f2 | |||
| f64488f818 | |||
| 75c803df11 | |||
| 5c158b4df9 | |||
| 85c59fdb5e | |||
| 86a8cbf402 | |||
| 94b822df3b | |||
| a5db116d00 | |||
| 168402217f | |||
| af74a75c54 | |||
| 27c45fc995 | |||
| 8600ada735 | |||
| 081676bcd8 | |||
| ab44ebd7e0 | |||
| eeca9f61bf | |||
| 79d57e2949 | |||
| f7c0a910f8 | |||
| 63bbe55ecd | |||
| 24b83fd96c | |||
| c749f961ef | |||
| 1ad6fd8297 | |||
| f8e2c65cef | |||
| acc9530d66 | |||
| 039d035952 | |||
| 8fff11fdee | |||
| fad0a2a55f | |||
| 43d0bd99cb | |||
| 4aa25c4971 | |||
| 5d61f656eb | |||
| 57cbc901b7 | |||
| fe27d3b25a | |||
| 9dc7930ff2 | |||
| 49cd6bc782 | |||
| fbdd0f4394 | |||
| 29ef586f91 | |||
| 36a1c7a265 | |||
| e0ec8b3be1 | |||
| 854246846d | |||
| 74282b46ff | |||
| e10ac8cbec | |||
| 18ea36adc4 | |||
| 13526fc679 | |||
| bea611e805 | |||
| 687c0b45e2 | |||
| 41051f3cfe | |||
| 5fec900861 | |||
| 4558dd9e28 | |||
| 7a71b6f3d0 | |||
| bc8d9d40bd | |||
| a74a5d95ab | |||
| 3c74f0f907 | |||
| 025eef63b5 | |||
| c9abec7cbe | |||
| 0a4ff90bfb | |||
| eb796a13ce | |||
| be32e8940a | |||
| d179efc3ea | |||
| 49cea778a0 | |||
| 6d49bf6fc6 | |||
| 431b4f6f17 | |||
| ff30e15a4c | |||
| 2aea8ee696 | |||
| 5956493684 | |||
| 3b122a1ba5 | |||
| b31c23b37b | |||
| 6299d9efa9 | |||
| 849c2f36d9 | |||
| 1cbd4c5387 | |||
| 574e0a7531 | |||
| 96b412ebb8 | |||
| 58f2b6c257 | |||
| c783b6d7b5 | |||
| 9be61f83df | |||
| 1bcb7eccbc | |||
| 7a7844162d | |||
| 3356c63cdc | |||
| af2278c3c2 | |||
| e4777f6563 | |||
| fe2dfdb3b9 | |||
| 82d1aba67f | |||
| 7ed360e06b | |||
| 0cde534e30 | |||
| 54c320c724 | |||
| 2ff67f3741 | |||
| 5415b7ad5b | |||
| 2aeb406e38 | |||
| d57b812f36 | |||
| ada0d57452 | |||
| d158ac5ffe | |||
| 481a884d25 | |||
| f14c78cf12 | |||
| 91d8e7c7c6 | |||
| 854f3d5b85 | |||
| 056cbbcdcd | |||
| c02a545c7d | |||
| fecf8e3ed2 | |||
| 12e7eac1b4 | |||
| f8e89b694a | |||
| a0aa585afd | |||
| 3300470a29 | |||
| b2508dcb59 | |||
| 798d6a9134 | |||
| 965334350f | |||
| 676c7b89c7 | |||
| b431d172b7 | |||
| 8fe8cad8f9 | |||
| 420f111611 | |||
| 9c8a48f38c | |||
| 50bb101abf | |||
| 21dcfc8dae | |||
| 24e5819f99 | |||
| 64c197de47 | |||
| c4bf09ad32 | |||
| 8c37418e44 | |||
| d6c27c190d | |||
| 0d0a54f095 | |||
| 590b75453c | |||
| f80d17c2be | |||
| 58b94d5a63 | |||
| 1d95dbe4a1 | |||
| ebe9b3368e | |||
| 504337d25e | |||
| c53d11b2cd | |||
| 6de73c7ab3 | |||
| 83fecb46f6 | |||
| 20cc02c90d | |||
| 41bfb6e80a | |||
| f5838c5178 | |||
| e8636136c8 | |||
| 17d2d9217b | |||
| 2e4643a398 | |||
| 2204885fbb | |||
| 66a87ce4d0 | |||
| 31400b29c3 | |||
| f5b4ccf741 | |||
| 59fa831542 | |||
| 4e19f7adbf | |||
| bd5e54e825 | |||
| 1d983a6818 | |||
| 390568ade9 | |||
| c3ff1074bb | |||
| 9af03035aa | |||
| 9e13b7da01 | |||
| c5d35d434c | |||
| 38010432ee | |||
| bab9826fb1 | |||
| aaf03123f8 | |||
| 46ab3ee24f | |||
| 45ac69a1f6 | |||
| b8f7e12bc0 | |||
| 2ced227ad3 | |||
| 392816fae3 | |||
| 36fd2b6854 | |||
| 1279112ac0 | |||
| 358954d69e | |||
| f6c02262c4 | |||
| 6e029fc184 | |||
| 5c7e2d103c | |||
| f88972013f | |||
| f2de553d63 | |||
| 7d75a73105 | |||
| 07c69ebed4 | |||
| 58102a39a4 | |||
| b75868cc7c | |||
| 4a562401dc | |||
| 8b245c12ad | |||
| f8787ca6b9 | |||
| 23fa0657a7 | |||
| a04d9fa388 | |||
| 266c114c1e | |||
| 11ed4de0aa | |||
| 742b0edaa8 | |||
| a6ed698fca | |||
| 3912f3330f | |||
| 97d99632a6 | |||
| b170bddad9 | |||
| a26afbe9a1 | |||
| 49840bb621 | |||
| e8f35f0bab | |||
| 802f1029e9 | |||
| 53b2fdf31c | |||
| 5c7d9d08e2 | |||
| b51eca87b6 | |||
| e043822a93 | |||
| 732dc881e4 | |||
| b896eed5d4 | |||
| 5298c2016f | |||
| 833622c870 | |||
| b7659ea3a5 | |||
| 5986cbcfe6 | |||
| bc0b1a78e5 | |||
| 9cb8c70434 | |||
| 02861fabc8 | |||
| 33fb806f13 | |||
| 47264dc350 | |||
| 2ff43f2ed8 | |||
| 1a9a65d4d0 | |||
| b951e24024 | |||
| b15ab1b1cf | |||
| 94b50b85e7 | |||
| 585ccc1b24 | |||
| d332bb1645 | |||
| 9e101c9ef0 | |||
| 595ad99a5b | |||
| 05763b3669 | |||
| ec63b04719 | |||
| 0939424574 | |||
| 806ede241a | |||
| 984fcfda2e | |||
| 7a2cbfd6bf | |||
| 2dcc85d64c | |||
| 9b0b325339 | |||
| 7a3239cba0 | |||
| 5f449151a1 | |||
| ecd7107ccb | |||
| a71a549fa3 | |||
| 7597b31215 | |||
| db4f28f4ca | |||
| b09a82fb94 | |||
| 36528bb723 | |||
| 03899a6240 | |||
| d8f88ee1e3 | |||
| b9e62be3c1 | |||
| 756176118b | |||
| 6be52e435d | |||
| 2159245224 | |||
| 29eed182c2 | |||
| 1d364f1991 | |||
| 0d3f02ee34 | |||
| 3a04e3d003 | |||
| dc00af8829 | |||
| 9d99889703 | |||
| 627212290e | |||
| d9e43b5d8d | |||
| 98a5492e37 | |||
| a3b3b4f657 | |||
| 413d1828eb | |||
| 4b5aabe6b0 | |||
| 5b4c948e43 | |||
| f91faacc53 | |||
| e408b3ab02 | |||
| 7d771229e2 | |||
| 31d8142a0d | |||
| 3cff588eff | |||
| a50766384b | |||
| c183de5662 | |||
| 1b369520ed | |||
| 2e09c7faf3 | |||
| 4b24cfa5ea | |||
| 9da843c994 | |||
| 35b162adbf | |||
| 94e19ac903 | |||
| 61182249f0 | |||
| 5c537fdbe3 | |||
| 9c7e9cc6f2 | |||
| 873ae6717e | |||
| d3a3a8528f | |||
| 41990a6402 | |||
| ffcac1bc3b | |||
| adb92ce349 | |||
| 14bd5a4f59 | |||
| 6c512c1973 | |||
| 3cb0e3bb13 | |||
| 303564fd70 | |||
| 99180f5afb | |||
| 201c9cd2a4 | |||
| 07df39c208 | |||
| b2a2a3ace1 | |||
| bb35261aca | |||
| 2155f65478 | |||
| 16904d580d | |||
| cca6e1dcae | |||
| 47c2f0a289 | |||
| 7392f52184 | |||
| 620b9b3300 | |||
| 92b1f3cf6d | |||
| 088aa2ffdc | |||
| 688f05ff26 | |||
| c115a4cf76 | |||
| ef3435441f | |||
| 73a879caad | |||
| 92aa270062 | |||
| d23caa9b72 | |||
| 4b9d409628 | |||
| a378e307b3 | |||
| 11aebe465f | |||
| 3b97137ccf | |||
| 24eb1627e5 | |||
| 2b30e7880e | |||
| 2d0a61fc8d | |||
| 38c4f5b6e7 | |||
| ebae8b65f8 | |||
| 1cbade511d | |||
| cf131b51a2 | |||
| e91194994f | |||
| 9fa053cd88 | |||
| 8555b9b5ec | |||
| dad4ab1980 | |||
| 12d2c6be56 | |||
| 83d83b9add | |||
| 820919c0a9 | |||
| 2940320930 | |||
| ad63c13cd1 | |||
| 5b91dc45e0 | |||
| df32564bef | |||
| 82405982f7 | |||
| 557b672232 | |||
| 117c249595 | |||
| cb0a430aa4 | |||
| df5278df72 | |||
| 975441dfe9 | |||
| 2d591182c4 | |||
| 41fb11d846 | |||
| bcc0160103 | |||
| 4c84a99f68 | |||
| b4001e65e7 | |||
| 82ad1392ef | |||
| 815ac8be04 | |||
| ba94643f0f | |||
| ae73356ecf | |||
| 38c2de3ae3 | |||
| a18d624bcb | |||
| 439472d4f8 | |||
| 85ddf69042 | |||
| a5282daf91 | |||
| 94f2ad9263 | |||
| 6977658443 | |||
| 2aa33e2875 | |||
| b123b6df89 | |||
| eb8ede38cf | |||
| f1eff358da | |||
| cf4194fef7 | |||
| f174d71ac7 | |||
| ae2e8469b4 | |||
| 4fff0e952c | |||
| 67d9436f22 | |||
| 178f31f4c6 | |||
| e344578a01 | |||
| 1837d43d96 | |||
| fb174b482f | |||
| 448ca97d93 | |||
| 9865270e68 | |||
| f3a89f59e4 | |||
| 84a8fdadc5 | |||
| bd45bab34a | |||
| 2ea078beb5 | |||
| 3075ec2203 | |||
| a3efc77255 | |||
| 1a768ca438 | |||
| 559f64ee4f | |||
| c498833c27 | |||
| 0af80b7c86 | |||
| 4227a5bb59 | |||
| 84222a9746 | |||
| 0e2d61d422 | |||
| 58df02e97f | |||
| 5c1023a332 | |||
| 4889e9783f | |||
| f423cf73c4 | |||
| 7d3c850813 | |||
| 6d6ed1a205 | |||
| 611239db5c | |||
| f862f5be03 | |||
| b54a824abd | |||
| f443804b35 | |||
| b1de70c526 | |||
| 05a186af82 | |||
| b538c8fe75 | |||
| ec7781f1f9 | |||
| 91f805675b | |||
| 0a5f796c33 | |||
| 438fbf31cf | |||
| ae8aa358e4 | |||
| da2bf4e366 | |||
| 9ff385f6f3 | |||
| 714fcaaadd | |||
| b3836c58d2 | |||
| 646c02a5e2 | |||
| 4a6a3af418 | |||
| 8f02052232 | |||
| 489a89ae8b | |||
| 6862106dee | |||
| 607e01690c | |||
| 500d2e076d | |||
| 17b33afd64 | |||
| 319b3dabdf | |||
| ff89619b09 | |||
| 726f9d5312 | |||
| f3adf4bf57 | |||
| 193d9f838b | |||
| 1ff6eec1e3 | |||
| c218ef3970 | |||
| 674d22321a | |||
| cdb71101a1 | |||
| 26993380b1 | |||
| da1bb43618 | |||
| f86ea9f19b | |||
| 0610690fa7 | |||
| de962d3e7e | |||
| 213fa1c148 | |||
| 2a2a022792 | |||
| ba91c8f0c2 | |||
| c232f90d6e | |||
| d0b1162b15 | |||
| 63944e8c43 | |||
| 35ed991abe | |||
| 23d081ab21 | |||
| 6d7b1f9dbd | |||
| 965fccaff0 | |||
| dc42c65dfb | |||
| eda22c241d | |||
| c56ac2cf3e | |||
| af38b8bf97 | |||
| c65e467c83 | |||
| 5751e38180 | |||
| cf71049bd4 | |||
| da054a2aab | |||
| 09b8aaed71 | |||
| bf10873405 | |||
| a2cdcb4e4d | |||
| bccc3ef253 | |||
| e5e601eb75 | |||
| 15d66cf337 | |||
| 936d9edc4c | |||
| de6216b37b | |||
| 72d54d3df6 | |||
| 7ff28ab5ae | |||
| 9393b20e13 | |||
| 754045b6f7 | |||
| 972c907ac2 | |||
| f0393e50c2 | |||
| 625c4a9a05 | |||
| 56c2d20b90 | |||
| 8d00ae25c4 | |||
| 6074d60a90 | |||
| 6e54dfe5ba | |||
| 9163ed351c | |||
| f8a79e5d40 | |||
| 1cf30584f0 | |||
| 1ecb5aed0f | |||
| 0b93aa5d12 | |||
| 3d4e1c1246 | |||
| 096c9316b8 | |||
| d67b9cba14 | |||
| 5c7c9452d6 | |||
| 1e7fd83ac5 | |||
| 077ae2e6a0 | |||
| 28e1f87d9e | |||
| 1a5f01ca9f | |||
| 1d2ce62b2c | |||
| d9efbfb178 | |||
| 6f9feee759 | |||
| 701743a4ec | |||
| 9183d1d2c6 | |||
| 9120c3bfb1 | |||
| 5d119bec31 | |||
| ad7892bd15 | |||
| 33a7672196 | |||
| 44b5552231 | |||
| 81adc3ef4d | |||
| 3400d7eecc | |||
| 03acb22212 | |||
| 9b110d8c3c | |||
| 0ad5abbbfc | |||
| cb64cb6abe | |||
| 6aef44271e | |||
| 0d659a1b46 | |||
| 21612cafc1 | |||
| 24c780c884 | |||
| e3d1871f86 | |||
| fff5230631 | |||
| d589be9415 | |||
| 7b3984059a | |||
| e4f4350bb4 | |||
| 8779583bdb | |||
| 725aaccf5c | |||
| 671a575216 | |||
| 253057a765 | |||
| 70cec30dcf | |||
| 240191dff8 | |||
| 8fe94ec07e | |||
| fffd829f88 | |||
| f9c2025149 | |||
| 87cf7b6d30 | |||
| d1315b6187 | |||
| 87fc4c1e44 | |||
| 2f972b91a3 | |||
| 3acac3203b | |||
| 52ec143a92 | |||
| fe1947ea48 | |||
| 696510d220 | |||
| f5e6c82e86 | |||
| 8cf3a83dd7 | |||
| 1fbee92044 | |||
| ced2dd9200 | |||
| 6dabc68c16 | |||
| f5fbfe98bd | |||
| 62c21fd58f | |||
| 791dc84d49 | |||
| 6a7c38f30d | |||
| da57014eb8 | |||
| d42759c641 | |||
| 83b5bdbd29 | |||
| b02cc6ecbe | |||
| b0baa8d8f9 | |||
| fcdc3a4745 | |||
| 7c4a952ee0 | |||
| 3fab287e8d | |||
| 5c6d10da96 | |||
| 285bcbcec0 | |||
| c2e21fa30e | |||
| cb2c9ce4e6 | |||
| a583fafa37 | |||
| b244de73ca | |||
| 93471d46df | |||
| 648cc2bb39 | |||
| 80be9d92ca | |||
| 09c72375ab | |||
| 98e8d93fa3 | |||
| ecd00d377a | |||
| f55f3b94a1 | |||
| fce2814735 | |||
| 44e671bb0a | |||
| 248ad0ddde | |||
| b8a84d170a | |||
| 4c084391fc | |||
| b87881c91b | |||
| 048b657c8f | |||
| 6c521c36dd | |||
| b56ff3fce7 | |||
| 9d1b27cde8 | |||
| 1be3f48017 | |||
| 14a76a8499 | |||
| 761ce60a8e | |||
| 7a61dc2c88 | |||
| 8fecd3512c | |||
| c88cd1b065 | |||
| af3c1fc510 | |||
| c92830b103 | |||
| 7aa554b8eb | |||
| 8038ce1aa9 | |||
| 10eb88f6fe | |||
| 9b6c3bd106 | |||
| 5a63a62454 | |||
| f2edc50675 | |||
| c1160f40d0 | |||
| 3f89f4bd32 | |||
| 58e4076620 | |||
| d812222061 | |||
| ef75b36013 | |||
| e4c2c53b19 | |||
| 6ae082dab2 | |||
| 7a33cda122 | |||
| f441efd776 | |||
| 5c53708f43 | |||
| 0708d7c539 | |||
| c974a0d888 | |||
| 2320efeb55 | |||
| 1a32062439 | |||
| d34e99b38b | |||
| 555c96a941 | |||
| 10b3d429fe | |||
| c58b04979f | |||
| c368618d09 | |||
| 1acc81c25d | |||
| 3dc7dc0cdc | |||
| b0b5c27fec | |||
| c2587abcea | |||
| 632b4971de | |||
| b3474b5a71 | |||
| 29d229264d | |||
| ff98dac104 | |||
| 61669d1f3f | |||
| b178423166 | |||
| 2c3fd160c3 | |||
| d4a6e18c01 | |||
| 415090d249 | |||
| afe86a5f66 | |||
| a83042d5c0 | |||
| 83eb79c9d9 | |||
| b86518ef24 | |||
| f367fa5a98 | |||
| 259b81317d | |||
| 947b6b5503 | |||
| 872ab9d2b1 | |||
| 1f8608f6dd | |||
| deaceb6b08 | |||
| 61a6fe9cd9 | |||
| b9d57843eb | |||
| 40ac87c9bc | |||
| 7f64f39c05 | |||
| 031b6e6372 | |||
| b9369e7c00 | |||
| 903d3595e5 | |||
| 0453e5cad8 | |||
| 07d7905896 | |||
| 4d39bbe329 | |||
| ac78688a32 | |||
| cdeed349e3 | |||
| faa46bb62d | |||
| 592d4b024a | |||
| 1d634f9b44 | |||
| 5109687a31 | |||
| cfb801345b | |||
| 24038f8ce7 | |||
| 56d0c51033 | |||
| a9b63a2106 | |||
| f41bb8db5e | |||
| 310181b97f | |||
| 2b8a808fe3 | |||
| 704776027b | |||
| a95adcb999 | |||
| 61a7c747e1 | |||
| c2229e3c0b | |||
| f6cad2235b | |||
| 4c3e98754e | |||
| 9862e5d207 | |||
| c9db1c6c4b | |||
| 4fca5f4d88 | |||
| 7ec8c7f9fe | |||
| fadc727df4 | |||
| aeef39a417 | |||
| e4516ac9b8 | |||
| 8431299b92 | |||
| 3b5bc9c38d | |||
| 0f5529be18 | |||
| c3e38e46c7 | |||
| 608bb5ccb2 | |||
| 15220c386a | |||
| e3bfa2be88 | |||
| 211c7745de | |||
| 230b470a3c | |||
| df96361ded | |||
| 417d0a3606 | |||
| 46fb6e9b48 | |||
| 483b3d6368 | |||
| 29c2ccb310 | |||
| 3919a32dc3 | |||
| 31b0b53394 | |||
| a34942c882 | |||
| bb25ce1c6a | |||
| 23f48e07ed | |||
| 008fea5d89 | |||
| 0d275868a5 | |||
| 268b4d9f9f | |||
| dc85989553 | |||
| 37379d5d1d | |||
| b76305a0d2 | |||
| 994274623b | |||
| 7c06e87d59 | |||
| 923c297dfc | |||
| e674518c4e | |||
| 681c09f25c | |||
| 0fd5346860 | |||
| 2252ba1bb7 | |||
| 30a5922a0b | |||
| 58c3794ce7 | |||
| ef25502491 | |||
| cc6d193e1d | |||
| 8fd46e96aa | |||
| 574a2c774e | |||
| 6b78b8f9ce | |||
| 322473c295 | |||
| 2e20693583 | |||
| e728a14c19 | |||
| d58e43edbf | |||
| 8abf242e2c | |||
| 051c5c4bf7 | |||
| 141c9e9c86 | |||
| a281bda9a6 | |||
| 8e29e09943 | |||
| 4a47224ac1 | |||
| e31ce87bb3 | |||
| 633f7a1db9 | |||
| 43b4cfc215 | |||
| 82d12691e1 | |||
| 8b4da69861 | |||
| 0e2ec9c2cb | |||
| 4aa79df402 | |||
| b251d47712 | |||
| 9c598fcd01 | |||
| 4ee942aba2 | |||
| d64db65743 | |||
| 8db9a27970 | |||
| 259521ec3e | |||
| e0cd520837 | |||
| d1788ac1e9 | |||
| de8d3fb1eb | |||
| a3478e02f4 | |||
| f513ca2a28 | |||
| c5d727da39 | |||
| 356429d0e7 | |||
| 2da6cb263d | |||
| 5e5b927abd | |||
| a7e76438b2 | |||
| 056ecb1c39 | |||
| 63c825d0e0 | |||
| 1fba5cb580 | |||
| 1053234507 | |||
| 49d5c4260f | |||
| 1530effb29 | |||
| ae6f26f3ef | |||
| cf739d2493 | |||
| 18f677d530 | |||
| f6c27c2abf | |||
| 5596f69c0e | |||
| 784f549339 | |||
| 5b3dfc3f9e | |||
| 6c3a4c6927 | |||
| f3e1ba5251 | |||
| 31b32d3b11 | |||
| b3b1f3ac68 | |||
| d3a748ce3a | |||
| ed3052dea5 | |||
| 809684e9de | |||
| a283e95fed | |||
| 16b6cc41a4 | |||
| 747f4dc3fe | |||
| f13f50779c | |||
| 363b581926 | |||
| 1573f513ce | |||
| ae0577bc16 | |||
| cccf216dbb | |||
| d872c0560a | |||
| f8f79788e4 | |||
| f678ff8cfd | |||
| b1850f2465 | |||
| d7866831ae | |||
| 5917bf31c3 | |||
| 59247c7838 | |||
| dce3c57e6a | |||
| 9c440ab6b7 | |||
| fc085c1758 | |||
| fdd6ea3651 | |||
| 1834b7d0f9 | |||
| 95b98c5a38 | |||
| 327515366f | |||
| 1f60e3101e | |||
| f8e474a1c5 | |||
| 8f11049c9f | |||
| f314c2a4d9 | |||
| 5d90afe648 | |||
| 5ff9e94a2e | |||
| 107251e099 | |||
| f970090577 | |||
| 1547dd4215 | |||
| 253bd1aea3 | |||
| 49b80a4916 | |||
| 8259b29896 | |||
| f1c4b7d5df | |||
| 58ed49f3c9 | |||
| ae57b960c2 | |||
| 758cf25888 | |||
| 3d65312999 | |||
| 437afbbbf3 | |||
| b871c6b46f | |||
| 055f236aa5 | |||
| 85fe24cede | |||
| 8562409a92 | |||
| c9974b65c4 | |||
| 270d7191ce | |||
| aa4b2d9f3a | |||
| 233f66db5e | |||
| d1ae298211 | |||
| 5d1b160fe9 | |||
| ba557e20a4 | |||
| 7ab5cb20c8 | |||
| bc7aa1a500 | |||
| 86951aff9a | |||
| 653d825083 | |||
| 72fc467109 | |||
| 86a6f5d67c | |||
| 852ed21e88 | |||
| c023d7676a | |||
| 9f6c6d9917 | |||
| 9c643ae9ca | |||
| fb3580efa1 | |||
| 5dfb7d63dc | |||
| db4b4fb166 | |||
| cedc8aae44 | |||
| 42b51611af | |||
| 820462dbc0 | |||
| e80ca0fa92 | |||
| 885ef7a46f | |||
| 565cb70875 | |||
| 1668392988 | |||
| 9a51820dec | |||
| 01f0f436ac | |||
| 99c43881df | |||
| d4a163e9cc | |||
| 1f44c4be2f | |||
| 8fdf973e66 | |||
| b1f2d27ddf | |||
| 264b764d6e | |||
| 8958b2042f | |||
| a9bc568217 | |||
| c2cf8e528c | |||
| 604d3bac3c | |||
| 8945ace3f7 | |||
| 45be4626f6 | |||
| cc4cc342c2 | |||
| 31248da3d1 | |||
| defdd27987 | |||
| f5e096a66f | |||
| c284459382 | |||
| 7bb201a1d2 | |||
| 978b3eca05 | |||
| 24684033ca | |||
| 2c0a4ac906 | |||
| 3c30db965d | |||
| 37a1230c01 | |||
| a4658eac24 | |||
| 25e76d0564 | |||
| 51c64fcbe6 | |||
| deb2ed3d09 | |||
| 06055add5c | |||
| 317a464278 | |||
| 6ef5607d99 | |||
| d84d30fe87 | |||
| 7ca9ca9465 | |||
| 357dcdb55e | |||
| fbf7ccbdda | |||
| c440c7c93a | |||
| 5ced9c1f19 | |||
| c2777ff989 | |||
| 1b9b47dd6a | |||
| 510eccd471 | |||
| a8a2db8eb1 | |||
| 335d7f3ae5 | |||
| 7ea0e90678 | |||
| d185a85a07 | |||
| ae441e6a2c | |||
| 5d593dd948 | |||
| 15b1d8d3f0 | |||
| dbb4bdf59f | |||
| 76bd968c59 | |||
| b695e0065a | |||
| a415d59e2f | |||
| 733fd79f46 | |||
| 679f3347bb | |||
| 4d52c55784 | |||
| 039573b133 | |||
| 0f022da98c | |||
| 9a832c7bcd | |||
| 36631f2270 | |||
| 3bc847a9f0 | |||
| 95fe77a594 | |||
| 19a8ed8b25 | |||
| ee05137415 | |||
| 1ec70f1df3 | |||
| 08b6edae80 | |||
| 3aabc1adbf | |||
| 9af34cc611 | |||
| 3b733930fe | |||
| 344636d88e | |||
| 22ebdcf1cf | |||
| ab228c8484 | |||
| ca59ce45c0 | |||
| f45527468f | |||
| db853b4462 | |||
| 5ca63a4e89 | |||
| 574a807678 | |||
| 8873b27eb8 | |||
| 79666b26c0 | |||
| c66004bbb2 | |||
| 9cd4984f7c | |||
| b36dfb356e | |||
| d827497403 | |||
| 9b93c07339 | |||
| 6fd46eb36a | |||
| a0629587be | |||
| 1c900e780a | |||
| 1cc696ab31 | |||
| 3653a7746a | |||
| 677f890c5c | |||
| 61333ecb40 | |||
| 1b8d6a38e7 | |||
| 7d165da105 | |||
| 354aa6831b | |||
| 5b72fab2e4 | |||
| 3be055a366 | |||
| 7dcf1cbf90 | |||
| 49c44db635 | |||
| 7f4791fa85 | |||
| c3ac3ecbe7 | |||
| dc365e066d | |||
| cf13cccb1e | |||
| 471f33ceef | |||
| 744d07b8a1 | |||
| 59be0818e2 | |||
| 955a69b16e | |||
| c7c6566bca | |||
| b6638d4eec | |||
| fd1cc2fdcb | |||
| 3996fbe365 | |||
| c5f086b385 | |||
| 4612b79575 | |||
| d1e07295e7 | |||
| 5e1064da55 | |||
| f77c1900fa | |||
| 9c84712640 | |||
| 98c22b9acb | |||
| d8e0b9f541 | |||
| e8ab0f6e85 | |||
| 5d93a392e4 | |||
| 29c25bc375 | |||
| 34686394a6 | |||
| df2f8684d6 | |||
| 8d24aa2b39 | |||
| fc32b749dd | |||
| 7ad38057b5 | |||
| a6eb615431 | |||
| e511265cc9 | |||
| 8d4fadb3c8 | |||
| 90ad9cf668 | |||
| adb8be3287 | |||
| 749037346c | |||
| fea31f7422 | |||
| 97172f5e51 | |||
| fd58ee6289 | |||
| c272359f20 | |||
| b34243fa7b | |||
| e0961d81a0 | |||
| 04d82d8127 | |||
| be9995bd1e | |||
| 43f5b5e2a6 | |||
| ebb2a8ad5a | |||
| ca4f265ce6 | |||
| 013940250b | |||
| fdf5e7ab2a | |||
| ef9a144437 | |||
| 78b2848622 | |||
| ccd9ce1728 | |||
| e229dc1549 | |||
| 307c4a22ed | |||
| ad8a84a532 | |||
| 7f871b0cc6 | |||
| 1e343084e2 | |||
| 6c6ed5f443 | |||
| 5e460c57f8 | |||
| 277b8f3503 | |||
| 43e8796b2c | |||
| 4047e34050 | |||
| 35fa20d965 | |||
| 95be7cf505 | |||
| f22a8126ed | |||
| 236c0c78c3 | |||
| 58fe959f85 | |||
| 280b036b91 | |||
| 6e2bf98d5f | |||
| 719982e4a3 | |||
| 76494e5f9c | |||
| e38aba0dff | |||
| f26842faa7 | |||
| 816e38db8e | |||
| 2734f53a79 | |||
| 71601b88ff | |||
| 97a8cc7ce5 | |||
| 0b83b849e7 | |||
| d89b09427f | |||
| b00ae974d2 | |||
| c64e8f944e | |||
| 57d029f34a | |||
| 0ca36e8943 | |||
| a61aa8ff0b | |||
| 49cd751acf | |||
| 2967d5d3f1 | |||
| 60da39712c | |||
| 52fbfdc5ab | |||
| b91bd3ea01 | |||
| 6966e08306 | |||
| 38b77397e0 | |||
| 6558317a7e | |||
| 7a40b27931 | |||
| 0f387a8e3c | |||
| 15fbd6fbf4 | |||
| 310f13a2f7 | |||
| 2a60264e40 | |||
| 6e6eae7844 | |||
| b3d31869d6 | |||
| c448c2becb | |||
| d39f17bda3 | |||
| 9648e25018 | |||
| 64d499af6e | |||
| 02da178d5c | |||
| 35cf2638e8 | |||
| b1d446895b | |||
| f0a54bf6e3 | |||
| a5a2298c7d | |||
| 796b2d4970 | |||
| ac1b3845b2 | |||
| 5ef2d538a0 | |||
| a0c1719695 | |||
| ebdf54a60b | |||
| 3546d54e3b | |||
| 639aafda12 | |||
| 4d5e051387 | |||
| 91b2e5bdbb | |||
| 7b9654f164 | |||
| 07d54587bd | |||
| 55b0be36cd | |||
| 5420fcaf3a | |||
| 6589feaacd | |||
| 3994141d40 | |||
| 1a1d6ab478 | |||
| 4796803c33 | |||
| 95063a7b65 | |||
| f2a0f9f61a | |||
| 77e128aa11 | |||
| 72d3e4e03f | |||
| 751fdb96da | |||
| 4ebe739b44 | |||
| c8e9207879 | |||
| ccf198a80b | |||
| 8c1722faa2 | |||
| 64a97483fb | |||
| de480ec0f5 | |||
| d540dbec79 | |||
| 303996818c | |||
| d27d2dd520 | |||
| c2b67ccb78 | |||
| c03b388786 | |||
| ac14db7b19 | |||
| 36d2f96519 | |||
| e503534ff4 | |||
| d6ae5bfafa | |||
| f06f44c30a | |||
| 0abf686406 | |||
| 1f8a0db290 | |||
| a678ae2529 | |||
| f9d8cb97c0 | |||
| 6ee841319f | |||
| b282909c9e | |||
| aba0c733cd | |||
| 029d74f855 | |||
| bcb951077d | |||
| a6c25b7bff | |||
| cac822f785 | |||
| 145d6e29c2 | |||
| c638e5ec87 | |||
| 6abd806539 | |||
| 244bb555f9 | |||
| cedc4f241d | |||
| bb50b3419e | |||
| 022e650dc6 | |||
| dc874a99cd | |||
| 7e5bca3dfd | |||
| 52a2bb5524 | |||
| 79209c31bf | |||
| 4d10eda308 | |||
| a123e65185 | |||
| d01194da0b | |||
| 6323268f40 | |||
| 774d98991c | |||
| 3d8be787a2 | |||
| b47c50ae5d | |||
| 1ee0526e41 | |||
| bdc29dbbbf | |||
| c9a1558c60 | |||
| b546d096bd | |||
| 448fee76c1 | |||
| 165bcf5662 | |||
| 19a9d639b1 | |||
| da688114f4 | |||
| e4337b6631 | |||
| a1cdf7189a | |||
| c71ef6fa4c | |||
| e5c6b2e952 | |||
| 7103707aeb | |||
| d78d515acb | |||
| 2b925e0103 | |||
| b6693c4345 | |||
| 7b222768d4 | |||
| c6d42c09d8 | |||
| 411a25b610 | |||
| 601c828562 | |||
| 5a1cb00a07 | |||
| eb18a2ac0f | |||
| 6613862aed | |||
| 25b0b63216 | |||
| e61d14168a | |||
| e3a2ad03bc | |||
| 67e7d63f0f | |||
| b246d13bae | |||
| 18941f1b80 | |||
| 16f12bcfa5 | |||
| 2ec0f26122 | |||
| c1f45dafa5 | |||
| de32691b4e | |||
| 1fb2c66a21 | |||
| 018895067b | |||
| f3d14dadc7 | |||
| 1a8825b374 | |||
| 8ee2d3d367 | |||
| b2984cd3d0 | |||
| 27ea9c22bb | |||
| b45adb6e6a | |||
| 6bc6d20a87 | |||
| 95d70db153 | |||
| a0b014ecfc | |||
| fc996951cb | |||
| 2ae133e993 | |||
| a02937a67b | |||
| 0f4cc3231a | |||
| 2b2042e1c2 | |||
| 57090e8ec5 | |||
| d6b834e8af | |||
| fa826b3167 | |||
| a49b3c9bf6 | |||
| cdfbff9af0 | |||
| 87eed3965e | |||
| c5cd716c20 | |||
| 02cfe9aeeb | |||
| d87452ed21 | |||
| 029468e7b4 | |||
| c9a1097579 | |||
| f338ffea74 | |||
| 765b68458a | |||
| 15a4d1f0a9 | |||
| bf0e5dc5bd | |||
| 19ceea4f1e | |||
| cc68776069 | |||
| d36002a02a | |||
| fa5effafcd | |||
| fa249a3f78 | |||
| c8f6d68d68 | |||
| 44bbdbe49d | |||
| 252c043409 | |||
| 07e21427b9 | |||
| 0f1c10230a | |||
| deb7121fde | |||
| 534e01e2d6 | |||
| 5c7e2432bd | |||
| 5fbf702500 | |||
| b62859ffa2 | |||
| 2700f06fe7 | |||
| 63ec74ebea | |||
| 9d8135cf1c | |||
| 2cc98191f0 | |||
| 0417a10483 | |||
| 2e7fab7813 | |||
| ef7530af29 | |||
| e8e66ec4b5 | |||
| 90707f8d4e | |||
| cc15a9480b | |||
| 447e0d0336 | |||
| 15db7eeb81 | |||
| 0a1454ff6c | |||
| dc2864ad7a | |||
| 2d2fdd6e44 | |||
| f38cd9d80d | |||
| 1a09712f89 | |||
| c41cf6c444 | |||
| 39bf84a13c | |||
| 2d8a0dc59c | |||
| 61eddca39d | |||
| 8fe65ec371 | |||
| 24ff2482a4 | |||
| 6f64fc9f84 | |||
| 41afd85a5d | |||
| 5ad4cbace7 | |||
| 88b7470c07 | |||
| f28ab4c280 | |||
| 214253c579 | |||
| 823670e4c5 | |||
| 276bd01fcc | |||
| 19e992869a | |||
| 078577c7c5 | |||
| 332ef5892b | |||
| 8b94320524 | |||
| 866173a481 | |||
| 1fa9e3fc93 | |||
| 74822d6ba3 | |||
| 9a188a87c2 | |||
| fb2182dd9b | |||
| 59a4442880 | |||
| 0b86aad059 | |||
| efb5c85c76 | |||
| 5d6f9a316a | |||
| 5a75906ce7 | |||
| f35c5f1c91 | |||
| 0dcce91a6e | |||
| 0ff7076d84 | |||
| bc54e3d01b | |||
| e738acbe3c | |||
| 8e8b8f8ed5 | |||
| 84f1b08033 | |||
| bc24e90070 | |||
| 005f63d455 | |||
| e7f66900fa | |||
| 0477e03965 | |||
| a8286e7458 | |||
| af60501fb6 | |||
| 869f4d1898 | |||
| e9e1b33884 | |||
| ac9f2ed284 | |||
| 41bede60eb | |||
| 27f313ee16 | |||
| f978f9a07d | |||
| 4eda5fb924 | |||
| 16affc9ef4 | |||
| 2844facae5 | |||
| 87d73684fa | |||
| 4096e72835 | |||
| f19da94bfd | |||
| 44f90efb93 | |||
| e329b6ffd0 | |||
| 6db1844656 | |||
| 2aac8d875a | |||
| 92ae8a5be7 | |||
| 1ea83ba3a7 | |||
| 6376e8d6e7 | |||
| 5e3c2f0c6a | |||
| 460b7be47a | |||
| 67dc3eef4b | |||
| 140fe74ca2 | |||
| e8e6d3bc77 | |||
| c782b6222c | |||
| 242ac26299 | |||
| 55599e1802 | |||
| 11cdb070c0 | |||
| eacd789a88 | |||
| 02b0451d3c | |||
| 91e07727e3 | |||
| 1068208887 | |||
| 27e7ecce65 | |||
| defbdcc2b8 | |||
| dbad57b8e8 | |||
| 47f69f694a | |||
| 620876e0e7 | |||
| 76f38d3da0 | |||
| d714a2a393 | |||
| 55bc7a678a | |||
| 64e8e02f54 | |||
| 48c4d54a6c | |||
| a9f9c1406c | |||
| 7e30d16797 | |||
| 46ba9aa117 | |||
| 9f53987e3b | |||
| e5ea4cc5d4 | |||
| d726d4d4aa | |||
| 7fa55c39f1 | |||
| cff8cb137c | |||
| eb1e890278 | |||
| 67aee8a19c | |||
| 56adb85a87 | |||
| 62aff1f2a1 | |||
| d6383e6c21 | |||
| d3ebd4b318 | |||
| c592ccb3e5 | |||
| 20aee23edc | |||
| 0937526aac | |||
| 77b9f2c15e | |||
| dbf6b38a2e | |||
| 38c802a4ef | |||
| ed47dca8a1 | |||
| b8c1fa9b43 | |||
| 043d2926fa | |||
| f04dfe43a8 | |||
| 8387de09e2 | |||
| ac7e7a79c3 | |||
| 768ed80ece | |||
| f40b2e641b | |||
| 5719bddbb5 | |||
| aea75f51bd | |||
| d58c07d697 | |||
| fa12743c8e | |||
| 5cf2688c0c | |||
| 7d35e15fea | |||
| 0f62bccb0b | |||
| 9182a287e2 | |||
| 8e2b19ada7 | |||
| 55a408edad | |||
| fee374b0e9 | |||
| 259a39ef0c | |||
| 53a70d9018 | |||
| 1e3c46a6bb | |||
| b6a55f50ab | |||
| b322ef286e | |||
| 3c0a97354c | |||
| 8b91aefd49 | |||
| 11e5fe8879 | |||
| dbda9292d8 | |||
| e271932f41 | |||
| e25e8bc580 | |||
| f8605dda61 | |||
| 97e268e5a5 | |||
| 7c3cee0624 | |||
| 296ef4184f | |||
| 7277074d9e | |||
| 5a17b95901 | |||
| 1e92c24847 | |||
| ddc68626d8 | |||
| e680a90e90 | |||
| 6e306ee44f | |||
| e872552fdc | |||
| c56ca4a0fa | |||
| f9ebc0ba70 | |||
| 25bc2dff07 | |||
| f76bf9dddc | |||
| 10ea05bc6f | |||
| 812e41d578 | |||
| 086dfc8a14 | |||
| 567976e822 | |||
| 3f0655c821 | |||
| ca46921796 | |||
| 3b4c357aaa | |||
| 4cdf05efac | |||
| 5913ff1bd8 | |||
| 6fb7beb58a | |||
| d855bc5ca8 | |||
| abc9f7d096 | |||
| 2c74ff1e54 | |||
| 093704f073 | |||
| b491f5cdc5 | |||
| e642bbc426 | |||
| 91eccb7bab | |||
| 85fb55a0e1 | |||
| 2ed67f6d65 | |||
| 78bf5ad88e | |||
| e7d4bc4506 | |||
| a1fdf1e625 | |||
| a37cd40ce3 | |||
| a2086ed458 | |||
| 82d83ca579 | |||
| 3f03f7333c | |||
| 8b3e04d1b6 | |||
| eefe3e8d4f | |||
| df4645a84a | |||
| d6e447a89c | |||
| d8050634f6 | |||
| 7e2b3da928 | |||
| f450056626 | |||
| a735e2b58f | |||
| 29c97a9bf2 | |||
| 16c2baa0df | |||
| 6b6821d0c6 | |||
| 309a8283b2 | |||
| 31a74abebe | |||
| 5c614bceba | |||
| 6085da91e2 | |||
| 7e91eb6616 | |||
| 8aa70f05ad | |||
| a1a5f470f7 | |||
| cc62e8c785 | |||
| d69f2b6cc5 | |||
| 1bcb5e0cc1 | |||
| 264eb52d61 | |||
| 11eeeb6ab1 | |||
| 4cfb2b248e | |||
| 72661e7c16 | |||
| a065a1d918 | |||
| 1e3e343e43 | |||
| a5671f016a | |||
| 79d019b5bb | |||
| 1f4f55bcc9 | |||
| 4ec941440d | |||
| d7c1faf563 | |||
| ce20544a4f | |||
| 79587215bb | |||
| 36dd50005a | |||
| 1a085788de | |||
| 896730ceda | |||
| dce67351f9 | |||
| 185012b2b7 | |||
| b8ac54052c | |||
| 1c398c2b77 | |||
| 36e82abd12 | |||
| 41c522104e | |||
| e05e7bee82 | |||
| ce8b9c153c | |||
| 4318b83414 | |||
| 113c78b67e | |||
| eddabf9dbc | |||
| 0ecee3deda | |||
| ab1ab7b6f1 | |||
| 2436480d9b | |||
| 3904c67e6e | |||
| c10728319b | |||
| 7ac47676e2 | |||
| aee0d4c0c8 | |||
| 2112e38886 | |||
| 4a0656e903 | |||
| cf48e9d640 | |||
| 5aa3d71eaf | |||
| 52a88a7bdf | |||
| 08579021c5 | |||
| 3234c8241b | |||
| 1c8de02c8d | |||
| 5ffc911a69 | |||
| bbf046033c | |||
| c13fd1923b | |||
| d736dc1a0a | |||
| 60ece1ee72 | |||
| 8c4d8cfdca | |||
| df45c99f96 | |||
| fca2661e05 | |||
| ff3d9bd373 | |||
| 415ce93425 | |||
| 61075febae | |||
| 1132230674 | |||
| 7ece9b823d | |||
| 399ad3f450 | |||
| fdc10e13ec | |||
| f5675fc0fe | |||
| ec07571069 | |||
| d482c5de91 | |||
| f1ba9c9d6a | |||
| e6e8e2e4d5 | |||
| 9e9505a732 | |||
| c530858df3 | |||
| 7c205d7a1e | |||
| 292c6810ad | |||
| 2b00447a43 | |||
| e6bf77d148 | |||
| c7940856ce | |||
| 8dd16b1fdb | |||
| 471722482e | |||
| f9b56bc354 | |||
| 1a41053c76 | |||
| 3b2b6a20aa | |||
| 4768f912b8 | |||
| 8418d54ac7 | |||
| 2b2412ca20 | |||
| 7202cac7d0 | |||
| 08a8bfa76c | |||
| 17988fc7de | |||
| 405f312fe8 | |||
| 5672d2b39e | |||
| 538bb418ce | |||
| 5d49a6b685 | |||
| 959abe64f8 | |||
| 3d192b7f8d | |||
| c6e1753803 | |||
| 6d2196125d | |||
| 564bf8a089 | |||
| 43a1c48f75 | |||
| c2b31c0987 | |||
| 6bc02cbb45 | |||
| 9c8b5e37a4 | |||
| 12512f767b | |||
| 38a511e3e1 | |||
| e7745d13f4 | |||
| 5344c3f121 | |||
| de56e30bba | |||
| c8162df936 | |||
| 5ea80b86db | |||
| 8b74c108a4 | |||
| 67288b4735 | |||
| bbecc3d0c2 | |||
| b20433c0be | |||
| fb26254fbb | |||
| f7ddd488e1 | |||
| 6f19d928f6 | |||
| fa15d7fd26 | |||
| be7af60ab5 | |||
| c6ed5ee9c6 | |||
| 36cd1ae3cc | |||
| 58f04975e1 | |||
| 179681ef18 | |||
| 7682bf9b49 | |||
| a648e2db70 | |||
| c61e09e36a | |||
| 453ac88dce | |||
| a9c18c57e4 | |||
| 03a6f2093e | |||
| 05818d70f4 | |||
| f888aa61fb | |||
| 2aeceafb36 | |||
| 4f24d22a68 | |||
| d33bdc7da1 | |||
| 9150747df1 | |||
| 2409817556 | |||
| 06dba2d258 | |||
| 9ae6c2673a | |||
| 352b61c741 | |||
| db81925c4b | |||
| 60e0f3b9b5 | |||
| 68eb3774b9 | |||
| b6da1bcb15 | |||
| 0c3324b6ef | |||
| 1f4439a89e | |||
| d2e5c32c83 | |||
| bde5960581 | |||
| eaa4abea45 | |||
| 5c02636dd9 | |||
| 571432a7aa | |||
| 57cdf0bf16 | |||
| da2046e90e | |||
| 6362b9c9b2 | |||
| e10ed744bc | |||
| 5f6658ae9a | |||
| 7aa6564dcc | |||
| 280ca1dd85 | |||
| e23b6e3484 | |||
| f95c38f632 | |||
| f963fcfa66 | |||
| a7ba779ba8 | |||
| 1c21ea955c | |||
| 247d33a627 | |||
| 2166980f91 | |||
| 58b43dbb6c | |||
| 9537accb51 | |||
| e258f3e2fa | |||
| 7b27be1306 | |||
| 203fb71851 | |||
| 899784cbdc | |||
| 3a274e85f0 | |||
| ad61503d83 | |||
| 14fa797235 | |||
| 156f1b70c3 | |||
| a4c7541092 | |||
| df5035d975 | |||
| 37c049425d | |||
| f5b174f985 | |||
| fa921215d9 | |||
| e02753df46 | |||
| 37e4d2bd48 | |||
| 96b5170d8c | |||
| ed0adf61d3 | |||
| 30ce6b0a6a | |||
| 99476f4b13 | |||
| 08f7bd2dc3 | |||
| 1522cba5b0 | |||
| e776118de9 | |||
| 3ab12cef2f | |||
| 025be70c42 | |||
| 5b061e062c | |||
| 82060320ef | |||
| c054b097e9 | |||
| caacb1dc9f | |||
| d47d9e5017 | |||
| 913e3d65d2 | |||
| cd9ee3c468 | |||
| 4065730e36 | |||
| 2fc244a3eb | |||
| 24a673c482 | |||
| b57b97eb3c | |||
| 92d4d93fce | |||
| 5871874f70 | |||
| 32aab3366d | |||
| 156b6425d2 | |||
| c019f86529 | |||
| 25b29a2864 | |||
| 4effc70792 | |||
| 23782b5c24 | |||
| 5ecbc2889b | |||
| 5b04672ba2 | |||
| 48d962e15a | |||
| fb6a6f73c4 | |||
| ecbcc566fe | |||
| fc86620327 | |||
| 30b452543a | |||
| d41613c46a | |||
| d5681ba01c | |||
| 70ee8c5bc4 | |||
| 91c164ecca | |||
| 265ea82780 | |||
| c540840cd4 | |||
| f34e77f08c | |||
| c94fecdadb | |||
| f97b556e23 | |||
| e890ce989c | |||
| d58b71688b | |||
| 37c7fa7663 | |||
| c8dddfed06 | |||
| 21d1bd48ec | |||
| 7b0427e86e | |||
| 8424eeb4ee | |||
| 055b9c57e7 | |||
| 5948c2d8cd | |||
| f712c5c6d0 | |||
| 642cc50ac4 | |||
| 7c430c9d3c | |||
| b8b0a0d662 | |||
| f4566acfa5 | |||
| 6defe6e07d | |||
| ad652706d6 | |||
| 90af611fdb | |||
| e190841d67 | |||
| 3077cc82cc | |||
| 7435e6e7b3 | |||
| 6430e41fb5 | |||
| 9b58b3fb6e | |||
| 21e6a344a2 | |||
| 826b38c47a | |||
| 9cacfee8c7 | |||
| 7add3d1018 | |||
| 4bf484c881 | |||
| 6b5761dfa4 | |||
| 424e7d65e5 | |||
| 5676acaef9 | |||
| e0581ee771 | |||
| 14e1ed06df | |||
| 7d191ebf8e | |||
| 12b8704502 | |||
| b4c7d32741 | |||
| 1011a757a8 | |||
| b78c772a14 | |||
| 2160d7da81 | |||
| 02dff2653a | |||
| 60267790a1 | |||
| 7a5e1d4154 | |||
| a9d25efcde | |||
| e45f90fac3 | |||
| e195e67a48 | |||
| 35e17127af | |||
| 4227477fc4 | |||
| f78d1a4018 | |||
| d89043d8ac | |||
| 5e5069423b | |||
| cb19451418 | |||
| c445a14c46 | |||
| eaa4fd41e2 | |||
| 0aa8fe0f20 | |||
| f946f38f26 | |||
| 04a578495f | |||
| f63e38a59e | |||
| 45bfe2ad58 | |||
| 5b04f4dab9 | |||
| 4808d89449 | |||
| f7495c6867 | |||
| de6b7752d4 | |||
| a6ba7a19b9 | |||
| 5d81fa70ff | |||
| 91161b37dd | |||
| 0de8f4a3a6 | |||
| 0d43de516c | |||
| ab31915ce9 | |||
| aeb92592e7 | |||
| df70b8bb0e | |||
| 726b901dc5 | |||
| c7f0a85d41 | |||
| 49d175b677 | |||
| ad08701cb1 | |||
| 1960d51e60 | |||
| de38963904 | |||
| fda511a949 | |||
| 583de1bf0b | |||
| 9ee090a36e | |||
| 8ec1461842 | |||
| b4b878ac24 | |||
| 9d2cd8490c | |||
| a0eca54f96 | |||
| da1b032793 | |||
| 4281b8630b | |||
| d610a6aac4 | |||
| d027ed2092 | |||
| 1558220f74 | |||
| 8ee0783bd3 | |||
| fa1377a8ee | |||
| 67e955919f | |||
| a149d6b26f | |||
| dd98a0b913 | |||
| 5035c8bd48 | |||
| dda44519c1 | |||
| 87867beb0e | |||
| 3709b5aecc | |||
| b5ec683318 | |||
| 821e3ff294 | |||
| 8217c717f6 | |||
| 9598417f42 | |||
| 99bccc6dff | |||
| cb8088216b | |||
| 59ef668fd2 | |||
| 8b247bde35 | |||
| 994c9147f5 | |||
| 943e000c41 | |||
| c44f605b5e | |||
| 5b68415173 | |||
| 0f226939aa | |||
| 25fb54e959 | |||
| dcb676765e | |||
| 2e567d6d55 | |||
| d129aedfe8 | |||
| 5035e7417d | |||
| 2c02094281 | |||
| 8a7184be3f | |||
| 04a72381e6 | |||
| 6a09fa56fb | |||
| 4611264ce3 | |||
| 00aa07ad97 | |||
| 22a40b65ae | |||
| fdae698f07 | |||
| d158d4de51 | |||
| 847b57907e | |||
| 2941adf364 | |||
| 95e3dcb448 | |||
| 395e2f31d0 | |||
| 3f404c8edb | |||
| 53690cf9d0 | |||
| 9e6cb79f4e | |||
| 12443da00c | |||
| c2a9118186 | |||
| 7aaf36d24d | |||
| 7cc13ce99c | |||
| d533c393b2 | |||
| fb97de7f79 | |||
| 23289c09bb | |||
| 7c34982528 | |||
| 5de16001e2 | |||
| b9e8384c11 | |||
| 121e92a829 | |||
| 4475c4fe7c | |||
| cef76de547 | |||
| a62019a3fd | |||
| 52e3c3516d | |||
| f751f70b1e | |||
| dfb4b5a339 | |||
| 1208dbe8c7 | |||
| 8751203986 | |||
| 8ccdc05c08 | |||
| 17886a9808 | |||
| 69a84a2782 | |||
| 9ad33012ad | |||
| a1b0ae467e | |||
| 69c9a3d793 | |||
| 5736b5e9eb | |||
| 0ab7b6340d | |||
| e16b367e6e | |||
| da9577076c | |||
| 3dd8574e33 | |||
| af1b6f4b42 | |||
| b8a023d158 | |||
| decac5fd12 | |||
| cb279ef321 | |||
| e3787b6b3c | |||
| 771583c559 | |||
| 8943a9db4a | |||
| 063d2e568a | |||
| eec74fd963 | |||
| 72d43b2e56 | |||
| 2ca624c8c6 | |||
| d922225e69 | |||
| 9aea76b0e8 | |||
| 8ee9295f39 | |||
| c4ebdd1f37 | |||
| 00643dbdfb | |||
| ee08a6fc53 | |||
| 5bdadbc089 | |||
| 97a68becb9 | |||
| 7736c90457 | |||
| 3b7ba39590 | |||
| eec3d02737 | |||
| cc1756b8e5 | |||
| 16ef7ca5fd | |||
| b42ddba13c | |||
| 8dee7daeb9 | |||
| 856a12f94f | |||
| a4d0c23071 | |||
| e96b29f84f | |||
| eb2c61ccc0 | |||
| 27400b0be1 | |||
| cf722fdf50 | |||
| 459aebe8bf | |||
| beadc0e69b | |||
| 0fb249284f | |||
| 791a0ce702 | |||
| 37de84d55f | |||
| 1bd8113f66 | |||
| f010f9458b | |||
| 3a8164ac4e | |||
| e347c8b0b1 | |||
| b243e2532b | |||
| 2ec8d88d80 | |||
| 8f4823d604 | |||
| 80b6140a3e | |||
| 7f3f6e96d8 | |||
| f1b3d7d036 | |||
| de24ce0a8f | |||
| cb29585e84 | |||
| f6ee94589f | |||
| 587c0ea339 | |||
| a99750ae87 | |||
| 181d8f52d5 | |||
| 261ef9ab6a | |||
| 8ca212d142 | |||
| 791a14bec0 | |||
| a80a7175f3 | |||
| 13bb7cf30a | |||
| b866055264 | |||
| c163b845eb | |||
| 3f9ea4fc79 | |||
| 93067ee30f | |||
| 205b496d5c | |||
| 8e5e770fd1 | |||
| c87e4a4582 | |||
| 72699bc988 | |||
| c59406e9e4 | |||
| 9f8e4bcef4 | |||
| 722448c97b | |||
| 007c46eedd | |||
| 5d303c793b | |||
| 6649f43069 | |||
| c43b1ac201 | |||
| be34b963e9 | |||
| 3f67fac085 | |||
| ade2c23fb5 | |||
| e344ec46a5 | |||
| 0fdaf659d6 | |||
| d998ca2f0f | |||
| d4b79754ad | |||
| 46ff5dccff | |||
| a83b8d62ec | |||
| 7eb242d3ad | |||
| 68aa182b16 | |||
| 46a4d2dc47 | |||
| eb69522641 | |||
| da741e294e | |||
| adb17bb071 | |||
| 02ea7d390c | |||
| 834652922a | |||
| 490cb757bf | |||
| e760a9566a | |||
| a487aaf952 | |||
| c829826870 | |||
| bfbc6de7b5 | |||
| 2213564977 | |||
| 9e2f309e30 | |||
| ba458c1391 | |||
| 643db78cc4 | |||
| 41986f4307 | |||
| 0b3542a573 | |||
| 0ef8ddb2a2 | |||
| 7292955600 | |||
| 5db0d682b8 | |||
| d07076b9d4 | |||
| 9b0ecdf43f | |||
| b516c1001a | |||
| 9ed9b2d8cd | |||
| 4ff1f31ecd | |||
| 653998e005 | |||
| de7d127c52 | |||
| 95ef4e20f8 | |||
| 56c2e94daf | |||
| 01b7f1ae18 | |||
| a3788c4e98 | |||
| e7581f4e15 | |||
| b508a07d74 | |||
| afa375f220 | |||
| 997f0535f5 | |||
| d378021dee | |||
| ec57f1305a | |||
| bc73195193 | |||
| 696d95b112 | |||
| 0b10ea6e36 | |||
| 3e278a2e75 | |||
| 236e5fcf9d | |||
| 8e83564ce9 | |||
| dadbebd3ea | |||
| 88900ed0d5 | |||
| 7b8616ac7b | |||
| 5abacd3667 | |||
| 34ea33f237 | |||
| ba706b6dab | |||
| 6b950d0408 | |||
| a97cbf038c | |||
| d865efceb9 | |||
| cf939620ea | |||
| aa3f4c74dc | |||
| 97215008c9 | |||
| ee5861efc8 | |||
| 38edd77034 | |||
| 87dcfbc645 | |||
| edef3ad8c3 | |||
| af01e95164 | |||
| 883963232f | |||
| 3d5c1b4ef8 | |||
| 4b00ec9d4f | |||
| 2e3a7386e9 | |||
| e57a75ac55 | |||
| 610bf8a277 | |||
| 5ca92ecd67 | |||
| ca8955daf3 | |||
| 3a4787dd98 | |||
| 40b1a3996a | |||
| 8555a87380 | |||
| 5a84a0d8d2 | |||
| 410922a943 | |||
| 3a9bd90a3b | |||
| 92078b1c58 | |||
| 34826c9506 | |||
| 97cc468509 | |||
| e5d4f2c24f | |||
| 60fe26ff2f | |||
| 89fad4d3ad | |||
| db379ad7b5 | |||
| 2d4e2fb8cb | |||
| 66050db322 | |||
| bfeb3e801a | |||
| 6c7cfe9e4d | |||
| de5f7f70e2 | |||
| 0b0e2a3f34 | |||
| 02b5d80bb9 | |||
| 0e602ab50b | |||
| e98eedb16a | |||
| 72a5425c3c | |||
| 234bf8af34 | |||
| 85489d05e0 | |||
| 6fa7a8989c | |||
| fd8c762772 | |||
| 3d38cdb609 | |||
| 1103f9046a | |||
| b07b06a9fb | |||
| cb776d2f50 | |||
| e1febf7ec1 | |||
| 35f599833c | |||
| c0e58e48ae | |||
| f9b4ff17a5 | |||
| a601991f91 | |||
| f904cd6c4a | |||
| 729218ec4b | |||
| 9bbb0fe1f6 | |||
| 1db5e0c0bf | |||
| a66c911fed | |||
| 8987ca61a1 | |||
| ef9b8b792f | |||
| 1e018d8a8a | |||
| 9ba470fc63 | |||
| d53ed5bbee | |||
| a788173534 | |||
| eee10a10d8 | |||
| bef8447447 | |||
| 6002719c8c | |||
| f569606475 | |||
| e3867ffa41 | |||
| 5b5655c989 | |||
| fe45975f43 | |||
| 1853d0d16d | |||
| 8637516565 | |||
| f8c442cf76 | |||
| 0dadc124d3 | |||
| 1e549b0ab4 | |||
| 30d1c0e0b5 | |||
| 44e6445180 | |||
| b910e20413 | |||
| 909584d473 | |||
| aff75131e4 | |||
| 999166fa58 | |||
| 2b558a9606 | |||
| 823a37aed7 | |||
| 5b287deca2 | |||
| 2b61edb80d | |||
| 4061539e1b | |||
| 1718d07f94 | |||
| d7b40433db | |||
| fd4997ab94 | |||
| 8ae7f60b04 | |||
| 85cf009f80 | |||
| dc347e4854 | |||
| 81a4ca5667 | |||
| 7236ed93e9 | |||
| fc0cebe7c5 | |||
| c47501d228 | |||
| f423549257 | |||
| 77f9113301 | |||
| c843130854 | |||
| 38b9198dba | |||
| 32182fe126 | |||
| 255a62dd21 | |||
| c05195a47b | |||
| eec86488e8 | |||
| 5ace5a5d8e | |||
| b2b0cf11eb | |||
| 8ab46827de | |||
| 0a60e504b6 | |||
| e2c5236706 | |||
| a20edc1783 | |||
| e810428c86 | |||
| 465cfb4fad | |||
| 67a7a63a36 | |||
| 1445bf7fb1 | |||
| f67cb001df | |||
| b1404cff37 | |||
| 50caca4002 | |||
| 122baa17a2 | |||
| 83a877c3dc | |||
| 253e801f51 | |||
| e92636ab1a | |||
| a74677acf7 | |||
| 499fed40f2 | |||
| 8889f4fdcc | |||
| 92bb849e7c | |||
| 115b14bc94 | |||
| 5b74374bb2 | |||
| 0b362fd866 | |||
| fe0229aed0 | |||
| 5611333c29 | |||
| 5140a2e107 | |||
| 0f81482ed1 | |||
| 278411898a | |||
| 9af112b38f | |||
| 095437d0c7 | |||
| 45443b48ef | |||
| 6f561d6bd7 | |||
| c3afcffc50 | |||
| e1651c752a | |||
| 054d8c4c9f | |||
| a0e619bcd7 | |||
| 15390cd966 | |||
| ea1a9943fc | |||
| 51b40c6b18 | |||
| c2aa56ac38 | |||
| fd4bc63854 | |||
| a9a955f8b9 | |||
| 119f6deb24 | |||
| 6ac76c86d7 | |||
| 224370e866 | |||
| 98de0d4351 | |||
| d6e702a9eb | |||
| 93dc772565 | |||
| d59e4ca4d1 | |||
| 8c5c4608d2 | |||
| 85f64b8c08 | |||
| c20dc61f16 | |||
| 3ec458ef4f | |||
| 6391b00c00 | |||
| 35a1c9a133 | |||
| 64001c9643 | |||
| da347aa077 | |||
| 326d50b686 | |||
| ec3170752a | |||
| 8e17f915c6 | |||
| 62e4423f30 | |||
| 3329bc1748 | |||
| 91e46a94f5 | |||
| c889659ad7 | |||
| 7407162dfe | |||
| 2ffdbe781f | |||
| e5e0f85b50 | |||
| 766b5514f0 | |||
| eaa211212d | |||
| cf993c2a36 | |||
| edfda74e9c | |||
| 2662809900 | |||
| 65daf74d0e | |||
| fdbe018cdf | |||
| 841df74010 | |||
| 5efbf2a802 | |||
| b2fbbddfa0 | |||
| e983be4060 | |||
| 3544b84632 | |||
| d5e56c7e76 | |||
| 04a8efd8c3 | |||
| 0f11838d93 | |||
| 50c7775e47 | |||
| 2939abd8de | |||
| 1d4e2cedf8 | |||
| 5d1e5df205 | |||
| c959424957 | |||
| c037686a26 | |||
| b21ce8c9fb | |||
| 11f59ada16 | |||
| 135cdfca46 | |||
| 41157ee3e9 | |||
| ba62ce9e93 | |||
| bfd1bcec69 | |||
| 53e24a8e30 | |||
| ebea587465 | |||
| 7185927e7e | |||
| 522149f503 | |||
| f5d71352ca | |||
| 75ec16fd72 | |||
| d0a23a7d73 | |||
| 0147e6cb8d | |||
| fea95c2951 | |||
| af855bc295 | |||
| 393e56a604 | |||
| 8485a8c654 | |||
| 95be13bc4a | |||
| 411010e6e6 | |||
| 64718e576f | |||
| 3f5ac02697 | |||
| 8b1c465bf6 | |||
| 00dea566f2 | |||
| e8f8d55010 | |||
| e985488471 | |||
| 5a20d629ab | |||
| 90c5f0e1ae | |||
| 91362f938d | |||
| 82fe0148f2 | |||
| b174f4736f | |||
| e0ac3cfb12 | |||
| 8ff78378cd | |||
| e36f1d3128 | |||
| c00b427efa | |||
| 117c3414f2 | |||
| 724542d870 | |||
| 2ff611137e | |||
| 2c3f9e35ac | |||
| 8c127a8193 | |||
| da4d3562f5 | |||
| 3f3141c186 | |||
| 3ea98b0c00 | |||
| 69d585e867 | |||
| 6dd83d3cba | |||
| 9e773ff980 | |||
| a2a23579bd | |||
| fb184da86e | |||
| 72327802d6 | |||
| 09817b24f0 | |||
| 6b513239f8 | |||
| 7b2dc697fb | |||
| 1a700145ec | |||
| 162bf3d22d | |||
| d78f887d1c | |||
| 8a9a56707c | |||
| 22fccd5143 | |||
| ebb6e34196 | |||
| 30c4456b85 | |||
| 9ac6cd503d | |||
| 71c440862c | |||
| 961abd823f | |||
| fd412c2938 | |||
| fd237244a2 | |||
| 39f661c5f5 | |||
| e86e472d4f | |||
| dafec4642c | |||
| 27f6fb1ff1 | |||
| 807ec04229 | |||
| 44f1281915 | |||
| c6794733ca | |||
| 157b68a29f | |||
| 00dde7d2cf | |||
| 68daf5f0ad | |||
| 72e8d083b7 | |||
| b9c5ab08a8 | |||
| a569a2e166 | |||
| 3c7e45ccc8 | |||
| e7ca031d1e | |||
| e472713c62 | |||
| f3f0d743ff | |||
| e8596f0430 | |||
| 8a61c7d336 | |||
| 87138c9854 | |||
| 05b8ec97e9 | |||
| fa9981b1ca | |||
| bdfe8a224a | |||
| 41a80fce20 | |||
| 40438cf2bd | |||
| 9ac22ee9aa | |||
| 5bf12519da | |||
| 42783279ff | |||
| 522ca27243 | |||
| 254081e3ad | |||
| fc5e293ef6 | |||
| 25cd35147e | |||
| a9864a5619 | |||
| d2436fa86d | |||
| 16057d8b04 | |||
| f2ecfc99ad | |||
| e50e9a5e65 | |||
| 395d43fd9c | |||
| 968af6148e | |||
| 4bc9cbc24f | |||
| eb4db2152c | |||
| ef21a8dbd0 | |||
| 39a6bda52d | |||
| e285036455 | |||
| fdaf0e9979 | |||
| e2602b3967 | |||
| 41f509873d | |||
| 39dc8368fa | |||
| be0b8cf2f5 | |||
| 53b5ecf34a | |||
| 366f793cf0 | |||
| 1328865279 | |||
| a865ba8cf5 | |||
| 2fea78a6c4 | |||
| 37deeb0d52 | |||
| 14dffa762b | |||
| 2fc3ef8124 | |||
| 38c548854e | |||
| 20c8b89bb7 | |||
| 35568f6425 | |||
| 76230c1305 | |||
| e23ba2340c | |||
| 022cd9cd64 | |||
| 6ec7d2c340 | |||
| 8c3798e96b | |||
| d623453451 | |||
| aafa333355 | |||
| 9bcd9f0a73 | |||
| a7a8c542f5 | |||
| 74ace74d50 | |||
| f3b6829c74 | |||
| c73d626757 | |||
| 4ac17428ac | |||
| c8da280a19 | |||
| d4b30620a7 | |||
| 46a2f6ed24 | |||
| 28cfd50f08 | |||
| f06d055372 | |||
| 7fae220f18 | |||
| 7b48923a2c | |||
| 22de865582 | |||
| 5f680141b4 | |||
| 3c528f0fdd | |||
| 812a2e4850 | |||
| e3d5eb5a4e | |||
| 859d62d2a7 | |||
| 6e66bea152 | |||
| a6eb871b42 | |||
| a09b42e046 | |||
| c85713850d | |||
| 3823b1a6fc | |||
| 52b4604d3b | |||
| aade5278d8 | |||
| afdf5cdfe2 | |||
| 41d13dc2c6 | |||
| 9bcd34349f | |||
| 1c4b430984 | |||
| 92d7639267 | |||
| 8977673fdf | |||
| 25a4636d0a | |||
| 80589dfeb2 | |||
| 76ca2aab29 | |||
| 429005559d | |||
| e193a48b75 | |||
| 09b975ab46 | |||
| 582a834b89 | |||
| 1ae9c0858a | |||
| 5211c95b81 | |||
| e75d3f759f | |||
| 5b08bda5b8 | |||
| 0e1188565e | |||
| 50c7cb1717 | |||
| 9e13a7bdaa | |||
| 29b0b17f50 | |||
| d57466608e | |||
| c80037bb2f | |||
| dd097fe361 | |||
| fd56195b2d | |||
| 5c0c9a60e9 | |||
| 834cc3f2c5 | |||
| b09295fc7c | |||
| 4ddc4778e4 | |||
| 3570467838 | |||
| 9b7b9bc407 | |||
| 9eb73e1ef0 | |||
| 743e615224 | |||
| 6291910b02 | |||
| 8737db97e7 | |||
| 60a9463e7a | |||
| fcdbae6806 | |||
| bd1d3724c1 | |||
| a9a26b93f9 | |||
| c121bccb03 | |||
| 39b77c6fd3 | |||
| 3f17898bf5 | |||
| fbffa507b8 | |||
| e392212e67 | |||
| de2b97c640 | |||
| 74db92bee4 | |||
| 4f28403c03 | |||
| 963be27b75 | |||
| 19b0f604b4 | |||
| 7c7de87fcf | |||
| 58ba6789cc | |||
| 3451f7e760 | |||
| b50a777437 | |||
| 4852d255c7 | |||
| ae18127409 | |||
| 165d2860e4 | |||
| 4ff5b9e7ce | |||
| 12650610aa | |||
| d770a048aa | |||
| 4626e48980 | |||
| e8b653ddf3 | |||
| 6300a47c15 | |||
| 8c5c73ea4b | |||
| 24be4b4969 | |||
| bb15e54438 | |||
| 0d25a0592a | |||
| 73b22cac56 | |||
| 6140fde60c | |||
| ddc657a073 | |||
| f14797e64f | |||
| bb37d1c339 | |||
| 12e80c271b | |||
| c6b60d5376 | |||
| a3dea9b243 | |||
| fc98fc9781 | |||
| 8b5e22dd7d | |||
| 7aae0ce394 | |||
| 6e34f183ea | |||
| 93e26f8117 | |||
| ec453c32a1 | |||
| cbd7aed0f3 | |||
| 80db2abe3d | |||
| de1f3d0df7 | |||
| be0ad9be2f | |||
| 1fe15c16cc | |||
| 11bcb328f8 | |||
| 902e295089 | |||
| bfa53af50f | |||
| d84d765aeb | |||
| 8e3aec8aaf | |||
| df0dd10c9f | |||
| 191453d89a | |||
| a595a09fbd | |||
| c36fccdd8e | |||
| 90ad6e89ad | |||
| ef62d753d1 | |||
| 3042648ed4 | |||
| 4c36c12fb1 | |||
| 0c4b25bcec | |||
| ac0d7f74cf | |||
| 20e36f8adf | |||
| b66cd84b9a | |||
| df356694c5 | |||
| 22c9d882a8 | |||
| 6dda879e63 | |||
| 3fc9643460 | |||
| 361e261997 | |||
| 062212952d | |||
| 6edd8834dd | |||
| 1ee8130ffa | |||
| 21c6fa5f1b | |||
| f4dcb35bc8 | |||
| acb82389c8 | |||
| e5535ccc8f | |||
| e34b509b20 | |||
| 816dc65262 | |||
| 05f1dca151 | |||
| 81891ac109 | |||
| 49123cca59 | |||
| 05e45b196b | |||
| 5e67276b6c | |||
| 3fd0b10762 | |||
| 3210740872 | |||
| d008de7b37 | |||
| 7493570a0d | |||
| ba8f34a594 | |||
| 3bf86618fc | |||
| 000f4984cf | |||
| 077f06562f | |||
| 9092be3a52 | |||
| 16231f599b | |||
| 43b9caf735 | |||
| cae0ac2d3f | |||
| 9170d2902c | |||
| c73f87ac71 | |||
| 279fc2ac79 | |||
| 58aaea6277 | |||
| 6698c5760b | |||
| 9f87fb16a2 | |||
| 1111e03901 | |||
| 0f1fec40cf | |||
| 3820bf16fd | |||
| b1d7f0e3fd | |||
| c8a7a709dc | |||
| d3ec74be2b | |||
| b5b5a51897 | |||
| 60426a5dec | |||
| 0bd7cb1ebe | |||
| f67f3a3010 | |||
| 6a94a7d49a | |||
| 601d18272b | |||
| ff2845b2d2 | |||
| ab962bf5c6 | |||
| 74c309b4ff | |||
| 31e80c1321 | |||
| 184deec510 | |||
| e97b65c320 | |||
| 4b25865108 | |||
| 2e1ea22532 | |||
| 6e5b8c25dd | |||
| 0f2cb4e2f5 | |||
| e01c1784f3 | |||
| fb1a19f157 | |||
| 3684c26cbc | |||
| 9b19dfd562 | |||
| 255b592489 | |||
| 5dfe7ffc47 | |||
| 21445fe0d0 | |||
| c72400e927 | |||
| b56197d30b | |||
| ade57809c1 | |||
| 4fa8834de4 | |||
| 592aacb25a | |||
| 7edf747e84 | |||
| 4c765a04f7 | |||
| 332995096b | |||
| 3cefa54789 | |||
| 1f374e4b92 | |||
| e06d45c07d | |||
| 1c6a717e93 | |||
| 5761eba529 | |||
| ba4d5b0b95 | |||
| fc3ff48777 | |||
| 5252edcd0e | |||
| d9591b819d | |||
| 52be531b8e | |||
| 57ad97d212 | |||
| 4d97089990 | |||
| 7055e29670 | |||
| 61067e9c3f | |||
| 9aec4229d5 | |||
| 02186d5a54 | |||
| d5efd6eacb | |||
| a026a1979f | |||
| 609442318a | |||
| cfc8fc4e9b | |||
| be7806b051 | |||
| 6a0f185335 | |||
| 8a26a6e34c | |||
| a59a90c734 | |||
| 4a73a157e1 | |||
| 31d6e05811 | |||
| 59dc0e8612 | |||
| f7a8ec7ee9 | |||
| 8b6ad4ff85 | |||
| 9f2fa79fe3 | |||
| 80bdbb5f24 | |||
| a2887d1536 | |||
| df87b64ca5 | |||
| a41308e8c3 | |||
| 19c9a0b441 | |||
| a46204ef9e | |||
| 004ef3d451 | |||
| f90eeb7861 | |||
| 791cd3055b | |||
| 1437640bc5 | |||
| 5865c030cb | |||
| 25064e86b8 | |||
| 4cbe9ad5ef | |||
| 63acc148dc | |||
| 4a24b434ce | |||
| f813b9e25b | |||
| c15958f3c2 | |||
| be720b96c1 | |||
| 186d58af01 | |||
| 7a69812b17 | |||
| 96c921c776 | |||
| e347ad7723 | |||
| 21857ec12d | |||
| 11e67c9db0 | |||
| 91b2fd3c4a | |||
| d5830ef708 | |||
| 837b62d5e8 | |||
| 07ec92175f | |||
| 2a0cd77eef | |||
| 67551f31fd | |||
| 7eb0f3564b | |||
| 967cc0b37b | |||
| 3fea5779df | |||
| c68714fd64 | |||
| 736656f7d6 | |||
| f4a76c48c2 | |||
| 9b2b024721 | |||
| ef3aa17025 | |||
| d67ba015c5 | |||
| dfba17c7dc | |||
| a658609ae3 | |||
| d68d378a48 | |||
| f2f28d1794 | |||
| b53be72c6e | |||
| c12958bf10 | |||
| abb4cb4810 | |||
| 6180515212 | |||
| 4bfb60865c | |||
| 50ee00cfe5 | |||
| 2a850cd5ad | |||
| e4f407ae7c | |||
| ef063b07b4 | |||
| 26774a2fe0 | |||
| a4a0b42f8f | |||
| 7565bcc789 | |||
| 330704a5e9 | |||
| 71c8adcfb2 | |||
| 4eb57cde0e | |||
| d952811ec8 | |||
| 739faac264 | |||
| 90b11b2fb9 | |||
| 916c80d53f | |||
| 52802371e4 | |||
| ac0e40a2b7 | |||
| d62d2abf59 | |||
| 9245d3ed7e | |||
| fa1199ac24 | |||
| 321193cf44 | |||
| 44d89308c9 | |||
| d5ba546d2e | |||
| b6f78d8d95 | |||
| 9bb990e9ed | |||
| 2ef9b732e2 | |||
| dfd52282a7 | |||
| 545e47aacc | |||
| 85a1817ecc | |||
| 49ff324882 | |||
| a45f3ac5d6 | |||
| 8ed56bd971 | |||
| d9610d25e5 | |||
| 870e799baa | |||
| ff77708e0e | |||
| 30866833ef | |||
| 0029956221 | |||
| 8fb6f0f328 | |||
| e5f9923f76 | |||
| 2b02a7433f | |||
| 83d578f39a | |||
| 43390ec240 | |||
| 4ef0572ceb | |||
| 345a538c84 | |||
| 3e4c3353ce | |||
| 9f1649ae57 | |||
| e4e68a6179 | |||
| 7c6d2361af | |||
| f3394b16b8 | |||
| 1aa6749956 | |||
| d4e088b726 | |||
| 0eb771c2a6 | |||
| 4ab092d011 | |||
| 754a7eb7de | |||
| d866b5592e | |||
| 372db4b539 | |||
| 5f5556ee69 | |||
| fa487474d2 | |||
| 41081e1b40 | |||
| 45fb0ebcdf | |||
| d0ea904cdf | |||
| 6e7962e06a | |||
| 8ab9cea3f7 | |||
| 82520555b3 | |||
| 5ba41306ea | |||
| 6a38e1d06e | |||
| a9af374be6 | |||
| 83549e6f61 | |||
| 6bf901faee | |||
| c3d8cc0978 | |||
| 08dfa20da1 | |||
| 49688e2b0d | |||
| 36361f04c6 | |||
| e31cb8cbcd | |||
| 491efd91a5 | |||
| 2f0077a081 | |||
| 9c75c84e83 | |||
| b215885188 | |||
| 66259dee17 | |||
| 2a68c3585c | |||
| 84c6455c95 | |||
| fee3d7c151 | |||
| 618ef8b549 | |||
| 96fc260488 | |||
| 6f4ba08d4a | |||
| 17e3c570ba | |||
| 2194685d76 | |||
| 344d6c201e | |||
| dc5885790a | |||
| 156f573842 | |||
| d81481a974 | |||
| b7c51922e8 | |||
| 9dff864de8 | |||
| 59be6c8710 | |||
| f1fc9dce36 | |||
| b87cda94c5 | |||
| 6547881920 | |||
| bba67fbd83 | |||
| 1659d5974e | |||
| 50e6306331 | |||
| 03bf1ec7b3 | |||
| fba5a8017c | |||
| e4490694f1 | |||
| f6f8dc1a22 | |||
| cfd02bff53 | |||
| b2ee732321 | |||
| 1512b3ba6c | |||
| f95664e846 | |||
| 55a88688a3 | |||
| 589e838fa0 | |||
| c912064c8d | |||
| 578b75aa76 | |||
| 61e1686da3 | |||
| 79075282e5 | |||
| 295f867118 | |||
| 5d13dfee25 | |||
| 0cc4287b59 | |||
| 286769dc03 | |||
| 5cbd0cf42a | |||
| 9ba949c2d9 | |||
| c26f2cc80a | |||
| e8fdd99962 | |||
| 6ab6473cd7 | |||
| 8d22006165 | |||
| e64bdbdb2c | |||
| 1f2d95db7e | |||
| b07621f1a1 | |||
| ccea764556 | |||
| 40b5195f0e | |||
| 464aeecef8 | |||
| 3d5393a0e7 | |||
| c1f1646dab | |||
| 87001326f6 | |||
| a8968257db | |||
| c0d0e2e89d | |||
| 56f2e74ff4 | |||
| 92553add8e | |||
| 059d4a1306 | |||
| 6561fbc831 | |||
| b13a1ff3dd | |||
| ffdc914c71 | |||
| b6d9ea86ee | |||
| 53c38ef2cc | |||
| 281c5e4c66 | |||
| 96bf714d85 | |||
| 2b06d34279 | |||
| 826319ce34 | |||
| d7afd7aae0 | |||
| aff1467ea3 | |||
| ccb261a8a3 | |||
| 9d23fc222a | |||
| e5015faafa | |||
| a4c37d7f51 | |||
| 8cf51c5cf4 | |||
| 2a21224ab8 | |||
| 78890f925c | |||
| 796f831296 | |||
| 5f78644bb6 | |||
| c42f46eba4 | |||
| 369a6a30da | |||
| 395b4c25f3 | |||
| 26de185f54 | |||
| 7fac189ab3 | |||
| d5e0899955 | |||
| f99882c61c | |||
| 42a4c7d368 | |||
| 179a4cead5 | |||
| b132557f04 | |||
| 294b8d3c6e | |||
| 0958b9db8e | |||
| 1c8f8a00b8 | |||
| eb387e16f4 | |||
| 706bbcf8a9 | |||
| 4f86cca306 | |||
| 9b796d0f27 | |||
| fedd07e4a8 | |||
| b8caab5f3d | |||
| 04b765a674 | |||
| d7155f839f | |||
| fb0d7139f2 | |||
| 9ab554af5b | |||
| 096e5e1fef | |||
| 03bc304ecf | |||
| 9a2212c86e | |||
| d01f8f9252 | |||
| f7e10ed53e | |||
| bbd74e5a7e | |||
| 71dbe3e4c4 | |||
| 4d680b73dc | |||
| 7c69958c92 | |||
| 3027b4b694 | |||
| 4560620210 | |||
| b3d9feb1f2 | |||
| 90df78c9e0 | |||
| 63889d3bea | |||
| 5379b89dbd | |||
| 69a978fe05 | |||
| efeb66c852 | |||
| a76914a4b1 | |||
| 302bf29b6a | |||
| 68b4d54f18 | |||
| 31ee576d6a | |||
| 9b988ee12d | |||
| 4e22dc4987 | |||
| d3ddf55df1 | |||
| 80727aa4cc | |||
| 919bdf05fe | |||
| abdb8266b6 | |||
| 31813c29af | |||
| 75b2406997 | |||
| addf3d5331 | |||
| 76e61d4ef1 | |||
| 7d6a73ab27 | |||
| fa04f0970e | |||
| 9c1688a39a | |||
| 4522418890 | |||
| 2cd0829a8d | |||
| e4d8af0c97 | |||
| 5f2e60d751 | |||
| 31b1e34ae8 | |||
| f11596fabc | |||
| 84b17765c2 | |||
| 5856d77371 | |||
| 1093c816d0 | |||
| 9eadf353d9 | |||
| 2eefc135e5 | |||
| 15907fcda0 | |||
| 560b57f812 | |||
| d7391badf4 | |||
| 1cbae66bb3 | |||
| c17eacec04 | |||
| ad784a56ec | |||
| 3618983aaa | |||
| 4a056fe55a | |||
| 99095c0529 | |||
| 5b4eb65e68 | |||
| 39dc23e83b | |||
| 64cccda076 | |||
| 379adf3a8e | |||
| a57b2a059a | |||
| 133fd3113b | |||
| c0137227e6 | |||
| df98c766e5 | |||
| fabd6075ef | |||
| c7000355fe | |||
| 8e34af5b5e | |||
| cbd2417833 | |||
| 953804c429 | |||
| 84bdd0ef45 | |||
| 3dd3ed2602 | |||
| b63590152a | |||
| 4b63847e04 | |||
| a89307c5ba | |||
| 00e37224ed | |||
| 457362ba84 | |||
| 166818670e | |||
| f201aac946 | |||
| 406c56e3d8 | |||
| 931fdf0bcd | |||
| 070afe57af | |||
| 037bd3109e | |||
| 78b73ba585 | |||
| 421043ed12 | |||
| 927dd827ce | |||
| bb6b792d06 | |||
| ffebefb65e | |||
| 2eb73644e9 | |||
| 0bb62bb0fd | |||
| 4d8a23c1fc | |||
| e41f786c72 | |||
| 5b4ba02012 | |||
| 1c14389c7f | |||
| 78ed0495ce | |||
| 8083b2c754 | |||
| 2c914b9b8f | |||
| a6c29a5061 | |||
| 3064d0c300 | |||
| 23591deb81 | |||
| 5fb8c7e65c | |||
| c4a3d57499 | |||
| 7bec15b99f | |||
| 4184d6eef5 | |||
| b9e00ab611 | |||
| d256ecb6db | |||
| cee0b795ee | |||
| 4474d4391b | |||
| 3f81fc98dd | |||
| 4208267966 | |||
| c088039394 | |||
| 2c2c61920e | |||
| b0803a4bc6 | |||
| 39c5cd4f84 | |||
| 69d27dfb4b | |||
| 130a84d2af | |||
| d42cef891c | |||
| 9b69afe541 | |||
| b60dd9d1fe | |||
| 94c5eab776 | |||
| d4f6894e1b | |||
| 28191baa80 | |||
| a9b0cfc519 | |||
| 051a7f3451 | |||
| 56452481e2 | |||
| 54afd377ee | |||
| ddb87027f9 | |||
| ef9016e363 | |||
| e576f259e4 | |||
| f5a38ab954 | |||
| dfe08e3c96 | |||
| 9eb5f36ecc | |||
| ece9c7f2d2 | |||
| a6737b87fd | |||
| ca5e9d872f | |||
| 304fc990a1 | |||
| d10bbb73f7 | |||
| 2d97f6dd53 | |||
| f8104137ce | |||
| d78dd0c8d0 | |||
| e11cc951de | |||
| b97018932d | |||
| 67dc65ea91 | |||
| 4760d71a86 | |||
| 3df5c2835e | |||
| f062b0f671 | |||
| f1cb2cfa35 | |||
| 53680d538d | |||
| 5c6915f633 | |||
| 8312e21f00 | |||
| 239306e9a2 | |||
| 49072d6e02 | |||
| fc67e372d2 | |||
| 0422854384 | |||
| bfe1236d98 | |||
| 0a7eed686c | |||
| cee0fde940 | |||
| 78569ee833 | |||
| 6c7ce3465e | |||
| 8928c3e7f1 | |||
| 113c0aa411 | |||
| 2430abed33 | |||
| e6d1a4cccf | |||
| 2934a15902 | |||
| f092f9045c | |||
| ac8f4e69d6 | |||
| 0260c9119e | |||
| 1baa6be6de | |||
| b082147c4d | |||
| f4f08b9c99 | |||
| c687c73edd | |||
| 0bcaff4214 | |||
| 5e8f899620 | |||
| 5c933a7faf | |||
| 8b2de15096 | |||
| 2a8bae187f | |||
| 26e2b4a5be | |||
| d8a7bfd438 | |||
| bcc125ceb6 | |||
| 59ffed85ba | |||
| 5cf94e5a15 | |||
| 2263961d4d | |||
| ddc03cbccf | |||
| 1ae0fed83b | |||
| 81e056e79a | |||
| 3706cfe908 | |||
| ca9b5ce11d | |||
| 4eed4ca3a1 | |||
| 9d4a8688c1 | |||
| 1d2d8cd38b | |||
| 5e9ba64db8 | |||
| ca0aeb8e62 | |||
| d87b34ab36 | |||
| e2f1bafeef | |||
| 31a505768d | |||
| 9052930ebc | |||
| 2b6d44a043 | |||
| 288931ddc3 | |||
| b5aceceef2 | |||
| 8ebe03a89d | |||
| e5f045c375 | |||
| 55adc7e728 | |||
| b687b106f1 | |||
| c72b4d6e8a | |||
| fcc8a941b0 | |||
| e6b9805167 | |||
| 48bba4d581 | |||
| 9929962d54 | |||
| 149b7fc347 | |||
| cc1d50a06c | |||
| 4a743ac2fb | |||
| 287672d3c1 | |||
| f29dd8b927 | |||
| 45fc9603e3 | |||
| 9e7a2bf1b9 | |||
| bdc8038e7e | |||
| a1957a685d | |||
| c97c4f878a | |||
| 05500bf759 | |||
| 70aba9d3ff | |||
| 6b11497cdc | |||
| 995a09a2a6 | |||
| 94d8d3217c | |||
| 37cfdf6fe2 | |||
| 48745a3bc5 | |||
| 3f39741d0a | |||
| 1800770c94 | |||
| 6f6a7b92e4 | |||
| e65a223c91 | |||
| 9565aaf469 | |||
| 5ffc6e0558 | |||
| 09c8a41294 | |||
| bfadd884c9 | |||
| a46c11b088 | |||
| 7002ff3ec3 | |||
| 9f2642a714 | |||
| 3ef69c7fe9 | |||
| 499206f0ea | |||
| d9cf326879 | |||
| 5761e475ee | |||
| 8223b09f60 | |||
| a002e5ff0a | |||
| 6e826d5193 | |||
| 111653833f | |||
| 3c9ca799a6 | |||
| 55eebb5fd2 | |||
| 60a90aa51c | |||
| d2e4dac9ab | |||
| 579507a6d1 | |||
| 37f9bcf9cb | |||
| c5a786ed2c | |||
| 53d1fdd8f1 | |||
| 78dd957717 | |||
| 42c08e6123 | |||
| a0527fc53b | |||
| 1039df5077 | |||
| 9f291a6666 | |||
| a5a510656f | |||
| 561fa8a95e | |||
| 70990002d8 | |||
| b55d6539b5 | |||
| 96df56ca8e | |||
| 157565eaa0 | |||
| fd78b7bbf8 | |||
| 6cddd04518 | |||
| 03ee62971e | |||
| 3193eb5106 | |||
| 69b056e121 | |||
| fd813a002c | |||
| b07608d438 | |||
| 683c003622 | |||
| dab37e0fe2 | |||
| 223eb44f19 | |||
| 4dd53a732f | |||
| fd7d05d003 | |||
| 6b84a89b6a | |||
| ed21d88735 | |||
| 8539805691 | |||
| a4f8c6d5b3 | |||
| 37661f3a86 | |||
| 961e0b5d28 | |||
| 5997e680d0 | |||
| a1de0614d7 | |||
| f22bc63fee | |||
| 51bd9fe40e | |||
| a1e56518a5 | |||
| 277217353e | |||
| 1fe5aceded | |||
| f52988b93c | |||
| 42d64b027e | |||
| 21c4e6caa6 | |||
| 9e97742a95 | |||
| b2831ac2fd | |||
| f9e6a02346 | |||
| 260c12756a | |||
| 6580f4922f | |||
| 92dae56ff8 | |||
| c32f1dfc23 | |||
| 0e3491bd58 | |||
| c7b2f9d1d2 | |||
| 87f497af0a | |||
| 2e9ff045e1 | |||
| 3145031c05 | |||
| 9c7d4171e8 | |||
| f9fe2ee2d4 | |||
| 63c26c45ec | |||
| 1915bf1a61 | |||
| 87dcb9336f | |||
| 84744d429e | |||
| 2f9d5334ee | |||
| 84e6fb45e8 | |||
| 52e12baca2 | |||
| 3415da216f | |||
| 6664936529 | |||
| 6046d6c417 | |||
| 68de5228a8 | |||
| 7a388c73c5 | |||
| cb01523677 | |||
| 879d0c601f | |||
| 30eb292b48 | |||
| 98c74879bf | |||
| 1e4bc7dc18 | |||
| 2798cadb78 | |||
| 67c3587c0b | |||
| 0663501d6f | |||
| 0a0008cf97 | |||
| 76d84bf6a5 | |||
| 1cb47f3c80 | |||
| 9f92f63194 | |||
| 61694013a5 | |||
| df3ade896b | |||
| 68379802cd | |||
| ddc9c394a2 | |||
| 0e783f0003 | |||
| e1272dc2f9 | |||
| ca22c1bdae | |||
| bf7ae3a53e | |||
| 5b57405517 | |||
| 4d12410707 | |||
| bd0de8fbaf | |||
| 8a4c0e9782 | |||
| 1557f82b11 | |||
| d822b6bd1a | |||
| b17803bb34 | |||
| 99d81868fc | |||
| b3919fde95 | |||
| 0e533e1630 | |||
| 2c4cda1e0a | |||
| 26226e2094 | |||
| 44bb093438 | |||
| 5a860d87c7 | |||
| c17667971c | |||
| 0d344605e1 | |||
| 1db74162e6 | |||
| 8a87981d94 | |||
| d826d925db | |||
| 241367ec5c | |||
| 7bb506c5bb | |||
| c09501ad9a | |||
| 68a89bbac8 | |||
| cecdc64f51 | |||
| c62cbbfa97 | |||
| 2ea51dd594 | |||
| fb14f81f64 | |||
| 02077821d4 | |||
| d38d046f7a | |||
| adf01ec668 | |||
| 39ce8835f7 | |||
| 921b22ac31 | |||
| b7e16b5989 | |||
| 717f0fcb4d | |||
| 49b3acea72 | |||
| 73e2ff6ff6 | |||
| a1a5b25b91 | |||
| 3a14a63b0f | |||
| 6462393aaf | |||
| a42a236961 | |||
| 30c6389ed9 | |||
| d45676b478 | |||
| 41094ac22e | |||
| e20768d257 | |||
| 9d1674db99 | |||
| 36554c3375 | |||
| 45bb27d6db | |||
| c6ff7531fb | |||
| d80aa0b0bd | |||
| 744f9ebc09 | |||
| 6cb0443227 | |||
| 3784ea768f | |||
| 42f51591df | |||
| d631030608 | |||
| 762930516a | |||
| c0f85de17f | |||
| e010004f1f | |||
| 85117ecbdd | |||
| 6e1cd077a9 | |||
| e972f4f4dd | |||
| cabd7409e5 | |||
| 59cdf77784 | |||
| 1da611fb75 | |||
| 542dd33169 | |||
| a1a842b07f | |||
| 8424c18e9f | |||
| 1f402b1b56 | |||
| ec007ac8d0 | |||
| 4a3c145c72 | |||
| eb0fa8c7dc | |||
| 8452d2ccfe | |||
| fff59f547d | |||
| 0c86dd5763 | |||
| a0edcb58af | |||
| 97b38d9e1b | |||
| 8554f32086 | |||
| cfd0fd6cc8 | |||
| 93c47feb7c | |||
| 83f874db93 | |||
| 25298c70f7 | |||
| 25bd5f5e85 | |||
| 2901e94ebc | |||
| 1fe3e04ce3 | |||
| 8f27a5a92b | |||
| a346ce7640 | |||
| 1f6a1241f4 | |||
| 9efb8a341d | |||
| 71180504e9 | |||
| def2d3f19b | |||
| 83dfc6b633 | |||
| e026f1bac6 | |||
| aa8f5848d1 | |||
| 28fbae4791 | |||
| 88bd0996f5 | |||
| 350e373e3f | |||
| 68833e10d1 | |||
| d191ae4aba | |||
| 7b9fa8fbe5 | |||
| 46a1525668 | |||
| ee9edb0b19 | |||
| ae8df002af | |||
| 12fdc37599 | |||
| caadc73e1b | |||
| 95c374bbcc | |||
| 01a1b1a5e6 | |||
| a85894e159 | |||
| b632b2a478 | |||
| 5c1b8986c6 | |||
| 8c8fe633a5 | |||
| 8da63cf95a | |||
| f4e881ad30 | |||
| 7aa36133de | |||
| 5c58bd2092 | |||
| 2af021129f | |||
| 2c05426db1 | |||
| 41cc153bff | |||
| c6c7d99fd2 | |||
| e4ab71abf3 | |||
| 6f681743ca | |||
| 83a4b37bcf | |||
| 000e11e270 | |||
| 14534fbcf8 | |||
| 07648d9ea6 | |||
| 83076af25a | |||
| f2c77ffa08 | |||
| f5f3bc4e60 | |||
| 107a96c1bc | |||
| 8879866b32 | |||
| 94443afbfc | |||
| 9ffb76798d | |||
| 786944098a | |||
| 2ea1f03b79 | |||
| 25b9b24f77 | |||
| 150c53af0f | |||
| cb4af8fe83 | |||
| 7ca463bf75 | |||
| 539a1767a3 | |||
| d331d59a9f | |||
| 223b7daa1d | |||
| a54e636364 | |||
| 5c740ff41e | |||
| 759e75091a | |||
| 6719fc89a6 | |||
| 7f76883b98 | |||
| 063f42be81 | |||
| 66c84f769b | |||
| 38c086008d | |||
| 88cd333839 | |||
| c4e165067d | |||
| c701ab4368 | |||
| 57394a03e0 | |||
| 5f5266ba45 | |||
| 036cb229a3 | |||
| 6c1c857024 | |||
| 37897eb922 | |||
| 69ce2a1de6 | |||
| 2deb0f3e46 | |||
| 7c4f3d28ce | |||
| 1da4232138 | |||
| 698dda2310 | |||
| 36e83b42ce | |||
| 5f247a6e16 | |||
| ea9e608288 | |||
| b4c04ed00a | |||
| e3751f6cd9 | |||
| 784822a5c2 | |||
| e245b27c97 | |||
| 344030cbe4 | |||
| 6c300288f9 | |||
| 39e1de4d13 | |||
| 837046218e | |||
| db6a32ac33 | |||
| 6ed137dc9c | |||
| 45e0cfae01 | |||
| 363a3100c0 | |||
| 854403af81 | |||
| ebafb24099 | |||
| 820323bc1e | |||
| c9d6ce3b63 | |||
| 8be32e4661 | |||
| f6f28042bd | |||
| 6bd578ccbe | |||
| 03a6be28c0 | |||
| 3a55360572 | |||
| 8e92d25b75 | |||
| 798ec3eb9c | |||
| c0cc91fd0a | |||
| c4570750ea | |||
| fbc8d30b67 | |||
| 65058df3da | |||
| 40e6a5c515 | |||
| a886f6e7e1 | |||
| eab49dbfa3 | |||
| c651d28cc0 | |||
| e774011d71 | |||
| af3dfd39b0 | |||
| 0976e124e8 | |||
| 50ad3a8bf5 | |||
| 92c794f03b | |||
| 385bdfb869 | |||
| 80feb1087c | |||
| bee4f0578d | |||
| c3694c4ad1 | |||
| 541a254c60 | |||
| f731e3dc1b | |||
| 41c3eacb6f | |||
| f73db1a572 | |||
| 5f8391f9f1 | |||
| 7e194f1a26 | |||
| d19facfb43 | |||
| 8029412fb7 | |||
| f40b679653 | |||
| 72dcb9b94c | |||
| f32f42678c | |||
| b4b55289d6 | |||
| 02ae12c555 | |||
| bcb71ae368 | |||
| 98012f82aa | |||
| 2ee1cb81dd | |||
| 880be6f602 | |||
| 139e28988d | |||
| f15c07653c | |||
| 1d46800888 | |||
| 875be67a7e | |||
| c660ea858b | |||
| 5f8d3b9e4b | |||
| a4bad8fdbc | |||
| 15b934eb2a | |||
| 91fbe6f108 | |||
| 5e7ce63ed1 | |||
| 2ccf108534 | |||
| b46f159ff2 | |||
| 67807908ca | |||
| 7f7f6c3b51 | |||
| 5ed45b6806 | |||
| ec61ad3667 | |||
| 5888913052 | |||
| 6f9a89dcf2 | |||
| babb5480ce | |||
| a749367300 | |||
| 350db223d3 | |||
| 22f11958e9 | |||
| ad86bb5faa | |||
| 08d0946b78 | |||
| bff1b2a3bf | |||
| badfcb6e3f | |||
| 4fcf460447 | |||
| 3debd3ae12 | |||
| a02a9aac8f | |||
| 345efed473 | |||
| 1d10383924 | |||
| f39aa181cc | |||
| 986754bde7 | |||
| edc9d23566 | |||
| e1144d7a18 | |||
| 95e1cd9ea8 | |||
| 8640b44e02 | |||
| 0a07762f6b | |||
| b9bc5b5c60 | |||
| 621d1d93db | |||
| 82ed6eac13 | |||
| abec4bd760 | |||
| d71b2c1ded | |||
| 4dbe71cba8 | |||
| 705c88f193 | |||
| c6f026ee68 | |||
| bb4a155c73 | |||
| c3755b82a4 | |||
| 1bada25a79 | |||
| 253f635f56 | |||
| 2ab97aaa49 | |||
| f1547c14e0 | |||
| 9a9e93da83 | |||
| 24d5e59c32 | |||
| 2e791c762b | |||
| 29ccbfe140 | |||
| 0c12f232ca | |||
| 193f47ebb1 | |||
| 28815db7cc | |||
| 6f515b220e | |||
| de644c5437 | |||
| cd8e31d85f | |||
| 831c24de51 | |||
| 074881228d | |||
| 76f96ddbb6 | |||
| 50c9988018 | |||
| a9f49ab9ab | |||
| d46e41533d | |||
| be1403cdc2 | |||
| beafbd9768 | |||
| 6121677aa1 | |||
| 2ecca529d1 | |||
| e2727f10ba | |||
| 2af7dcbda2 | |||
| 6ca7a802bf | |||
| d29e375f72 | |||
| a8bcc760b4 | |||
| 3f6edc39cf | |||
| db5468afcf | |||
| 61a717db14 | |||
| 99b03b4632 | |||
| e66aac8ab7 | |||
| a751db5f2b | |||
| 85543db094 | |||
| 4a65e5e723 | |||
| a588f61a8a | |||
| 9802ba6621 | |||
| 77e718c61f | |||
| ae3b768de9 | |||
| 839003467e | |||
| 87f54ae0ff | |||
| 82818dab3c | |||
| 3b127f663b | |||
| 33c9e9da0a | |||
| 42e911c78f | |||
| 05c72980fc | |||
| b62a2d6a3c | |||
| 6b5a3dedd9 | |||
| 955fc3aa35 | |||
| af09d7e063 | |||
| 7ee3dbd615 | |||
| de189b67a2 | |||
| 2dc4e2a04c | |||
| c925b1d135 | |||
| 4bc8bfc23e | |||
| 58ce7d4bb8 | |||
| 2d812deb84 | |||
| 76160505f7 | |||
| 74d84aafb5 | |||
| b59a347ad7 | |||
| 49516cbbca | |||
| 35081f922a | |||
| e3adf823b3 | |||
| b96609cb51 | |||
| c659b1aa18 | |||
| c753f0d206 | |||
| 15944feea1 | |||
| f9ea013b60 | |||
| 0b42db11bd | |||
| 2e4c3c9a17 | |||
| 59a66f87c3 | |||
| f4c22ce932 | |||
| 0c2dcf26f2 | |||
| acc6ad59ba | |||
| bfa46b7f54 | |||
| 9a171a5928 | |||
| 2a4bd85f53 | |||
| 4b472bb461 | |||
| d9447de492 | |||
| d6d4a1a983 | |||
| 1d4dff9e42 | |||
| f3c0c1bb88 | |||
| 42b1f81b8e | |||
| cc6ebff48e | |||
| 8393ba56d6 | |||
| cd4c8b5ce4 | |||
| 819133ee45 | |||
| ee9b1caaa4 | |||
| 85c4184ea5 | |||
| ad71ca4cc8 | |||
| eb0f6eb953 | |||
| dcd477f2b6 | |||
| 98a7058794 | |||
| 7135867119 | |||
| e0da81a44e | |||
| 3e69113f48 | |||
| 8de94a3714 | |||
| cde4670cbd | |||
| fbf71218f1 | |||
| 283d4fa57c | |||
| 2a7d7b54d3 | |||
| 760de9915b | |||
| 0be0f13acf | |||
| 0d04ee440d | |||
| cfff229977 | |||
| b44bccec6a | |||
| ac99735b5b | |||
| 5bc8f046b2 | |||
| d8cf4f83d0 | |||
| 4d1ca4bb76 | |||
| ab6f26ff4d | |||
| f5e8503fa5 | |||
| c31c04d3db | |||
| 0b5e0df35d | |||
| fc24f039a8 | |||
| e182251fbc | |||
| 1d84af573d | |||
| b2f8fe3593 | |||
| 5f068ec46a | |||
| 263583ebcc | |||
| c1d39a5f57 | |||
| 29463b9e52 | |||
| 62beb3aaf4 | |||
| f765a195e2 | |||
| 1699289162 | |||
| 1be8d07f85 | |||
| c6220bf836 | |||
| 5cab4f8b35 | |||
| b6375686ff | |||
| 93168069db | |||
| d0af2033e9 | |||
| c11ac928ba | |||
| 237ffcf796 | |||
| 343ecca6ba | |||
| 72b828ef0d | |||
| cbcb7962ce | |||
| 809ccc2479 | |||
| bbf4b58306 | |||
| b1acc08c58 | |||
| 206d2008f3 | |||
| d71be88f6a | |||
| d608d97ab7 | |||
| ed9dbd9fae | |||
| 3636ebda3c | |||
| 430f2159ff | |||
| 51671e9391 | |||
| 5f201e21ee | |||
| 4e82073bfc | |||
| 4e7e7f2dd5 | |||
| 2503d9698c | |||
| ce5ccf8a4b | |||
| f180b2731a | |||
| 649b46bdfe | |||
| 548396b3e5 | |||
| 2f20e6da65 | |||
| 95c2622b7f | |||
| b5171dfe5d | |||
| 0946958acf | |||
| c3c29945b2 | |||
| 5daf7aa98f | |||
| 5bf5b5bca4 | |||
| 0518aaedc9 | |||
| 23f8203a22 | |||
| a5fe8478ae | |||
| 1bd15a0d2b | |||
| 0a467291f9 | |||
| 1e83145c0c | |||
| 7ff36afd35 | |||
| 51fbb2c313 | |||
| 0e3349f953 | |||
| 1de58349c5 | |||
| 8d61ab2af2 | |||
| 1fa13163e4 | |||
| 93a9ba8b6f | |||
| b7ad408773 | |||
| c3dc51826f | |||
| 97467f9e30 | |||
| 68e44fd354 | |||
| 8361369008 | |||
| 4577f2f0a5 | |||
| 151fe43551 | |||
| ce2b87343b | |||
| 7e662c50d4 | |||
| 091f0d5ee9 | |||
| 467e40fa81 | |||
| a2a9b6252a | |||
| 4feeaac7d1 | |||
| e774fecb77 | |||
| 868d82a22b | |||
| 6c8f7a0147 | |||
| 46b0a790d4 | |||
| b49d65295f | |||
| 7d124e6a83 | |||
| 65b83a36a7 | |||
| 91f775f3f0 | |||
| 6f4ec98bc3 | |||
| f8f6117ea9 | |||
| 880900d306 | |||
| 979ea92754 | |||
| bd2c04a0ec | |||
| cf6eae7bab | |||
| 2ea049b5a5 | |||
| c2e851b3a5 | |||
| dd5868f9ba | |||
| ba5b367ae8 | |||
| 85266abd71 | |||
| e34477a497 | |||
| 0d5d94f56e | |||
| 3dd3bf6e2b | |||
| cd6c93cd9e | |||
| c9e9df95ac | |||
| f2d193edcf | |||
| 995ae51bf4 | |||
| 9fe13f7a6b | |||
| b906217504 | |||
| 4914620178 | |||
| 2cbde89084 | |||
| f81cf360bc | |||
| d793ef85df | |||
| 9fa473a57d | |||
| 9d69ff1f91 | |||
| d301848848 | |||
| 2f2ae2bc89 | |||
| 009dd103ae | |||
| a639634769 | |||
| 92d68b70d3 | |||
| 426fcf3afc | |||
| 01e4a5148d | |||
| 0cb6c37f14 | |||
| 97b237712c | |||
| 02274601b3 | |||
| e5326d1bd2 | |||
| 7ac533a4d1 | |||
| da0b77e09b | |||
| ef420e41fe | |||
| 8f54da5fd3 | |||
| 910dcfafdd | |||
| 5d00c00826 | |||
| d8343cea2a | |||
| 66b08c0b2f | |||
| 31ffdd8c53 | |||
| cbca0692ed | |||
| 8e32d71c07 | |||
| 5f7e09268c | |||
| bf743fec17 | |||
| 83afc0622c | |||
| f1b5948fae | |||
| 87bcb465c6 | |||
| db37d37ed9 | |||
| c43ddaec4f | |||
| 419dfe0544 | |||
| ef3247c233 | |||
| 99f9407c24 | |||
| 9ee3a173d0 | |||
| d31bd97d59 | |||
| 93c0d5a268 | |||
| 6326f72ed4 | |||
| a3bbe68d56 | |||
| 3be5a6036b | |||
| b84a462798 | |||
| ff7aeb7808 | |||
| e31a2c0733 | |||
| 2704a65f57 | |||
| 580d177951 | |||
| 99d7434671 | |||
| 11708486d8 | |||
| b0af54d33e | |||
| 951a1fed94 | |||
| a70c3bf5de | |||
| c82fd94c6c | |||
| c01686d252 | |||
| 7f614401a6 | |||
| c507e816c2 | |||
| b884e0c0c0 | |||
| f665180d11 | |||
| 7609fdc576 | |||
| b52ee6f1f6 | |||
| 183af4ece6 | |||
| 3d35e4f8ec | |||
| 2d54d59add | |||
| d3d5a436ea | |||
| a4c74ef872 | |||
| 8d3e3e6c5b | |||
| c5341a2711 | |||
| 358e0d445b | |||
| 18a6403852 | |||
| ac38ebbf29 | |||
| ec45090358 | |||
| a12acc0d24 | |||
| 1837001e75 | |||
| 9554b5dd56 | |||
| fa761a129d | |||
| 4c7b151851 | |||
| 1518a57284 | |||
| 19febdad06 | |||
| 19391b71cc | |||
| 34202933da | |||
| 388f46b577 | |||
| a4d6722b26 | |||
| e7665ee7dd | |||
| cff168e002 | |||
| 012f1b4f05 | |||
| 19d9349b0b | |||
| c9508298b4 | |||
| 70b8772bb4 | |||
| 503459798a | |||
| 2783da4a22 | |||
| 79a9254894 | |||
| f2e8785cb0 | |||
| 8d6d8067fd | |||
| 5bd724e651 | |||
| 432a73e039 | |||
| bf0213ca47 | |||
| 4787565e14 | |||
| 540717b295 | |||
| eb59f8b72c | |||
| 5c046180a1 | |||
| 98dde32dc0 | |||
| e93f780268 | |||
| 86e3c18c33 | |||
| 5cfb496700 | |||
| 7979dec5b0 | |||
| 6ced837360 | |||
| 818412ba26 | |||
| b1ea081fc3 | |||
| b8aa5f8f80 | |||
| 3bd3ba4faf | |||
| bbf7153acd | |||
| 8a73849531 | |||
| c567198967 | |||
| 62e0e6a067 | |||
| 2165c68938 | |||
| 02b478dfbc | |||
| 8cd533304c | |||
| cab59587e8 | |||
| 3f278382a1 | |||
| 8341055f3e | |||
| a2d605be0b | |||
| cfddcb7a93 | |||
| 0f01ba4c46 | |||
| a1bfb237e6 | |||
| 534fa65ecf | |||
| 28bb64aae8 | |||
| 445c28fe97 | |||
| d566bb2a23 | |||
| 6a9e425308 | |||
| d870188d21 | |||
| 27d485a940 | |||
| 6166c95325 | |||
| a5e424512c | |||
| 84c3592fbe | |||
| 08291aed0c | |||
| 613e215c73 | |||
| 5628bfb20c | |||
| 7f2bbdceb9 | |||
| 88a714327a | |||
| ff4cf51494 | |||
| 6d8695127f | |||
| a0ec633c46 | |||
| bd96a73580 | |||
| 5e9a3a424e | |||
| b7a9465963 | |||
| 3e784d57e8 | |||
| 2e34d48e97 | |||
| e0012811ae | |||
| 4e222f18cd | |||
| f37f3cb3cf | |||
| 4e2e9aa56c | |||
| cb6e8a7d6a | |||
| 643b1647c4 | |||
| 921fa3bab8 | |||
| f0de7d6386 | |||
| b3d8981a22 | |||
| eff4ac3e4a | |||
| 59f7e4d2dc | |||
| d77e252873 | |||
| 2dcffe7fa4 | |||
| 286fe4db8c | |||
| 797e3d81da | |||
| 30e3956ea7 | |||
| 1523b9534f | |||
| 51ed3e63e9 | |||
| 5565544ba6 | |||
| b89f0cfa4c | |||
| 390811f414 | |||
| 3c7a3a3d83 | |||
| 7fac25edb0 | |||
| f029e4763f | |||
| 472608b879 | |||
| 1e8aea033c | |||
| 625d65d4b4 | |||
| bc5de8df6b | |||
| 380e420cdd | |||
| 9023f5f0db | |||
| 8e1db43431 | |||
| 3c66da4d82 | |||
| 1addae1993 | |||
| b490085214 | |||
| 4c91bab00e | |||
| 6d31124d3a | |||
| e87d129b09 | |||
| d6448183d7 | |||
| 544a923e32 | |||
| 51a67029cf | |||
| 7518b2ef21 | |||
| d20501739f | |||
| fda746ff93 | |||
| d69ffa9b8b | |||
| b39b9c9f55 | |||
| d428e0d19d | |||
| 917a6c28e5 | |||
| ba21879059 | |||
| e6560f348e | |||
| c02eadab3f | |||
| 8f1d00292b | |||
| 6095f40baf | |||
| c4b96c3c53 | |||
| 9a083d5506 | |||
| 97fad356b8 | |||
| cc4713d379 | |||
| 530e4ce776 | |||
| 6d65867b26 | |||
| 3fcac07120 | |||
| 6fca3b421d | |||
| 24e37d2dea | |||
| 5d4bc5c8fe | |||
| 5f5b901bca | |||
| 8032e2c369 | |||
| 302ce51efe | |||
| 7bfee7e377 | |||
| c1ddad2d25 | |||
| ae70344fbc | |||
| 14a1925de0 | |||
| f37ef105c5 | |||
| b1ec8a5a42 | |||
| 73d04e33e9 | |||
| 335695bd0e | |||
| e17ba1c143 | |||
| 2ff3d17f67 | |||
| a0c17ae0a4 | |||
| 004fa7aea4 | |||
| c8a3db114c | |||
| f96a653d05 | |||
| 71c26a829e | |||
| c76e66f8d2 | |||
| de52ce956a | |||
| 7367b22e03 | |||
| 71e517108d | |||
| 25997647f2 | |||
| 39a5d4c839 | |||
| b65a62096f | |||
| 8a52fdab57 | |||
| ee19a2789c | |||
| 2bd9043657 | |||
| 7887d7b5a5 | |||
| f0181d98fd | |||
| 0ab0c6cfba | |||
| eaa0dae305 | |||
| 46ff4dc3d3 | |||
| 301fe869c7 | |||
| 768ae342c3 | |||
| 346ef1eec2 | |||
| 6a3250cad2 | |||
| ee244071fa | |||
| 00e62919c5 | |||
| 47a0026b60 | |||
| f2f59544d2 | |||
| 15ae9996bb | |||
| 757726bb91 | |||
| 75817bb27b | |||
| eb257d9295 | |||
| baf84b98c4 | |||
| b12eb45bb7 | |||
| f0182f9a66 | |||
| 7b0775d887 | |||
| 36514bd95f | |||
| c207632e49 | |||
| 795ae50ecd | |||
| 672e3f9533 | |||
| 6d31d1e0d0 | |||
| f71eb171cf | |||
| 6e386df535 | |||
| 03e72781aa | |||
| 89d5e5637c | |||
| 56836561f4 | |||
| 4bb8d15228 | |||
| 258b73409c | |||
| f6652e9a50 | |||
| b32f808fd4 | |||
| bd6ea17bdc | |||
| 15dcf07b3b | |||
| 8386b427ea | |||
| 19eb1f00d1 | |||
| ce98276322 | |||
| 62489f42f1 | |||
| 6d253c0b8f | |||
| 31f8c065db | |||
| 6124eb844e | |||
| 16e6d0d305 | |||
| 55fdf26898 | |||
| 15264c6c63 | |||
| 6fc9afb175 | |||
| 1d70865f09 | |||
| e605ed1d09 | |||
| fa243afbab | |||
| d91e989abb | |||
| 84b33d2ddb | |||
| 90794c302a | |||
| c9194301a0 | |||
| 0aac47ca59 | |||
| 9682061472 | |||
| a75d78bd7e | |||
| 9ad5933120 | |||
| 8deee6afbc | |||
| 9ce7f515bc | |||
| 1cb047687f | |||
| 5c8ea74cb9 | |||
| 75a3abc225 | |||
| 8e3dab7e11 | |||
| e16cb9a00e | |||
| c456764342 | |||
| 545c1d387c | |||
| aff999cf69 | |||
| 85cbe285f0 | |||
| 670bcc1818 | |||
| 41e5be0673 | |||
| 2c3b3eafbe | |||
| ce8626150e | |||
| 7b1214849a | |||
| 427fa039ba | |||
| 49cfc3424b | |||
| 080459e7f4 | |||
| 17a58103e2 | |||
| 8e89418f45 | |||
| e8698a9c0c | |||
| 65a84b9f64 | |||
| 5bfd4c7bf8 | |||
| 334f648eaa | |||
| 4ffbd3765b | |||
| 8edffd32c8 | |||
| 2da4a5e6bc | |||
| cde72300a5 | |||
| 418f2e69a8 | |||
| 50bac01d89 | |||
| 815c99b6e4 | |||
| 399ddbd74a | |||
| 1d0deb5ffe | |||
| 46aecb3748 | |||
| 5c263ff84c | |||
| e397fe105e | |||
| 1aebca3740 | |||
| c4fef0256e | |||
| 06ee41957e | |||
| 781c1df5d0 | |||
| 7e89247bf4 | |||
| d2156c86eb | |||
| f5eeb2024e | |||
| 05eb1641f2 | |||
| 98d8ad7484 | |||
| 3077de3637 | |||
| defb57178f | |||
| a5ac81b593 | |||
| 506648bd6b | |||
| 91f0730373 | |||
| c6fb098703 | |||
| d989dea64a | |||
| 9a7d83989b | |||
| 8a5c8ab91c | |||
| 3c84e6848b | |||
| 183b5d4def | |||
| 53ab390e72 | |||
| fbaa84e691 | |||
| e40a26be19 | |||
| 5269e54f02 | |||
| bb728ea186 | |||
| d4b7410e3e | |||
| e1a5736583 | |||
| 22710d9b44 | |||
| 22baaf228a | |||
| 55ee181092 | |||
| 2ac30e7bde | |||
| 45e2fd9204 | |||
| fd71fc4fc9 | |||
| b2efa85a3f | |||
| 45930ecbf3 | |||
| b20deb0752 | |||
| 0fbe94eb41 | |||
| 9521b0021b | |||
| 5ed3f5f1a4 | |||
| 3b5367c5b7 | |||
| 1222bcbf6e | |||
| c1604c4b38 | |||
| 7f1e907616 | |||
| b68270ded1 | |||
| 05eff696d3 | |||
| 4587a1e64e | |||
| 13c0e6f5ef | |||
| 4211d51f07 | |||
| 283f5236a5 | |||
| 4bb41bc267 | |||
| b2738fdd5b | |||
| f254d44030 | |||
| fb100e05f2 | |||
| b5612ec622 | |||
| 6b48784709 | |||
| 5e88afe978 | |||
| 329953ebc3 | |||
| 9b572d2d47 | |||
| 56b2c009cd | |||
| 330d14941f | |||
| 8d76586dec | |||
| 642371996a | |||
| 3a2e8f38df | |||
| 8350dc2c68 | |||
| 13bb1ae028 | |||
| 349bb810f0 | |||
| 7985f5114c | |||
| 42b9932bd0 | |||
| 3096e94616 | |||
| aec43f0bee | |||
| 087f252909 | |||
| 4f013a2960 | |||
| 156f66ef62 | |||
| 3661f51bcb | |||
| 147353a177 | |||
| 76ff56a4e3 | |||
| 2471306fc4 | |||
| 1655055f61 | |||
| 2c481113ad | |||
| a9430bb25e | |||
| e0f56282de | |||
| 866f052e34 | |||
| 5c6b5374af | |||
| f2657ae450 | |||
| 9a60050e93 | |||
| aa7e745b43 | |||
| f3bb434b27 | |||
| 6440a011bc | |||
| f88bea5caf | |||
| c14a4f274f | |||
| 6a63a92a1f | |||
| b2576cd8bb | |||
| 8cb20c5d19 | |||
| 4a29c268fd | |||
| 1b4d10b58c | |||
| 41f07bfed0 | |||
| dacadcdf2f | |||
| 267ff7d196 | |||
| 80b24f8055 | |||
| 2da3e15aaa | |||
| 6305d8d61e | |||
| 9495b8e3e0 | |||
| 29ef99d2d1 | |||
| 6d4039cc85 | |||
| 8da5817f8f | |||
| 4cf1b6068f | |||
| c5e6013d75 | |||
| 0bdeb8d411 | |||
| 6bb945f6c8 | |||
| 1295b46a49 | |||
| 149940ffda | |||
| 70ad09f6ef | |||
| abb005e6e2 | |||
| 079ed2c7a9 | |||
| ad8e800aa5 | |||
| 6c750b19b3 | |||
| c0f1738bb9 | |||
| f160c39814 | |||
| a5ff4aca80 | |||
| 446977d126 | |||
| 90c4322fc5 | |||
| 3b83d6d302 | |||
| 7b7a977d11 | |||
| cc9b6fa5a4 | |||
| a3cd81c1bb | |||
| 3c11e759a2 | |||
| ed317360ef | |||
| f392493245 | |||
| b03162747c | |||
| e0add8003d | |||
| 678c8a5cd6 | |||
| 14d4b3fe7a | |||
| a0d54df522 | |||
| 3f521cc7a0 | |||
| 04ca7f4a2b | |||
| e447ffc8b2 | |||
| aba0a09816 | |||
| 305942c78b | |||
| 90d27bf5f6 | |||
| 0346da2fa0 | |||
| 7c766e66ad | |||
| 8440d263cd | |||
| e23e2ac327 | |||
| 6e28a8e694 | |||
| 5933db386a | |||
| aea421cc8e | |||
| cdd6598e65 | |||
| a11286bbc5 | |||
| 798fa11c57 | |||
| c2cba0d4ae | |||
| be1842f4e9 | |||
| c8c22cf6a0 | |||
| b42c9defb1 | |||
| bed7a4f92e | |||
| 553536f9cb | |||
| b03ca5fcf4 | |||
| d6d06d243c | |||
| 8ea0766773 | |||
| e548ada1e9 | |||
| b18b0fdf28 | |||
| 806cefb0c6 | |||
| f33027f24d | |||
| b07aeb892a | |||
| e525f95f22 | |||
| 1c869450c1 | |||
| 7082102631 | |||
| 10040f82e0 | |||
| 2b567e51ff | |||
| 576513a6d0 | |||
| 25382d471d | |||
| c4bd50c04c | |||
| 1779ee42c2 | |||
| 95e00e0edf | |||
| 6dd3094802 | |||
| 9060eadfe7 | |||
| d4793cc6b6 | |||
| c5b6216032 | |||
| ee34bd724f | |||
| 59847c964c | |||
| d22a2c7961 | |||
| f037a42309 | |||
| fbb64c4ce7 | |||
| 003ac1b762 | |||
| d00666a4d9 | |||
| 767b841fea | |||
| fd89d2145a | |||
| 6830962c3a | |||
| 0c17d67fa5 | |||
| bc4eff88a7 | |||
| 93cbce82f9 | |||
| 8123b5090a | |||
| da969ffaeb | |||
| b24c76f12a | |||
| 0b77f93154 | |||
| 2bc4686afa | |||
| dc1cd3eb25 | |||
| 7ab320b5d5 | |||
| 4074f1b1ed | |||
| f7ffe391f6 | |||
| 82c3a5ad5a | |||
| 1f54bb73aa | |||
| 66d7aa75e2 | |||
| a99f3ea321 | |||
| 4773bcf0ea | |||
| 532cc7755c | |||
| 4f957feacd | |||
| 43e854fece | |||
| 03a88aab0b | |||
| ff24a5f702 | |||
| b9297c6158 | |||
| 316efecaea | |||
| f0a9f0ff29 | |||
| 63ba78b664 | |||
| 09ec6ebd8e | |||
| 62bda675e0 | |||
| 7d21497c11 | |||
| 768362852e | |||
| c5efdb9df9 | |||
| c7c8b70b22 | |||
| 01b0556419 | |||
| 18405e2598 | |||
| cb73ed4737 | |||
| e6de35f5ac | |||
| a8ad598153 | |||
| 2cfbc6e5ef | |||
| 8d8aa87457 | |||
| bf9fc521cb | |||
| cebccea81c | |||
| 35f26f00bc | |||
| 534b7041f4 | |||
| 3d071e50ad | |||
| feca2e3faf | |||
| 5d8b2d8044 | |||
| e9233f4698 | |||
| 7fb548d7c5 | |||
| d1389db2f4 | |||
| ba9e998ff5 | |||
| cdd09a2616 | |||
| 800262fc14 | |||
| 4991f9412d | |||
| 87f1e8f77d | |||
| 5ce4b85edd | |||
| a52f598369 | |||
| 0a4f9e43d9 | |||
| 9e8b0b59ba | |||
| 29a14f5667 | |||
| 49d98a4429 | |||
| c945aead54 | |||
| 16284d0a59 | |||
| 4b6632edf4 | |||
| 070dce4c83 | |||
| 8afd2edd1d | |||
| 7328e55ee9 | |||
| 1f5fe7a1db | |||
| ec976743d6 | |||
| c9aa04c679 | |||
| 9c92a30dbb | |||
| 8a899c4c7b | |||
| a30bd86311 | |||
| 374048e1c6 | |||
| 4238261784 | |||
| 76f719e5d0 | |||
| b9b02cf749 | |||
| ba59036a97 | |||
| 7b466a98d0 | |||
| e3ba15de94 | |||
| 6f5cd1cd4d | |||
| 3d2b0e3766 | |||
| 72cfc6a6ef | |||
| 9e20387595 | |||
| 263c097d13 | |||
| c64f9ad9b1 | |||
| ba1e522bbb | |||
| 881735b562 | |||
| db7c26cde7 | |||
| 1b555ea3b5 | |||
| b259a46ab7 | |||
| 0f2f25845d | |||
| 732cbc3ad5 | |||
| 5d89454d25 | |||
| fda48f3d55 | |||
| 09c13777d8 | |||
| 60c0eb7179 | |||
| d21e6ff45f | |||
| 60f7ec03c2 | |||
| 7964933507 | |||
| 8f42b36a42 | |||
| c72af82f73 | |||
| 5b3867dd60 | |||
| 276e3d9d1b | |||
| 3311336d0e | |||
| 1b5ea0651c | |||
| 75c96c08f7 | |||
| b6a951a9fa | |||
| 0ca9bab8b6 | |||
| ab4eaea757 | |||
| 30240b4cbf | |||
| 06f53b2689 | |||
| 4991ef608d | |||
| 1b836ac4a7 | |||
| e73d8f383b | |||
| 0e636ce411 | |||
| e8a92ae731 | |||
| b60e5a62fc | |||
| 7adc7c4833 | |||
| cf5da56390 | |||
| d228ad3ddd | |||
| e6e534c13a | |||
| 48b3d91768 | |||
| cbf2e740e3 | |||
| 8c90e7cafc | |||
| ff39dffe23 | |||
| 920ac6695f | |||
| ec1da2805c | |||
| 84f844767c | |||
| 58bd645d49 | |||
| 16377f7249 | |||
| 47f40ed79a | |||
| e62af05496 | |||
| bd9df9a6ec | |||
| b7e5e41afe | |||
| a908d1ab93 | |||
| 8434d6c397 | |||
| 3d05d706f4 | |||
| df0a9c4683 | |||
| ed6bf53547 | |||
| a64d641a50 | |||
| 69e88ffed0 | |||
| 937e475169 | |||
| fc480e9bea | |||
| d6ba55eebf | |||
| d55aa66751 | |||
| f0d85d7dcc | |||
| a28d2878e0 | |||
| a0056f4e05 | |||
| 6af09d8a09 | |||
| 4d818f6cd9 | |||
| f25e056914 | |||
| 679fa65b84 | |||
| 33967649b1 | |||
| ea6e78ab0d | |||
| a1a1c7d0fb | |||
| 1f734a69a0 | |||
| 7e89477e6c | |||
| 8b45caf611 | |||
| fa3db52cf7 | |||
| 6fe9ee387d | |||
| a573ce185c | |||
| ccc1137e12 | |||
| 10c7be8c50 | |||
| d37cc8e1e7 | |||
| aaf3fe8b19 | |||
| b98e53e059 | |||
| 79e8a912cd | |||
| f46e8cc6ac | |||
| 594f6c33a2 | |||
| 1c501047f5 | |||
| 8833afc2fa | |||
| fa43018d10 | |||
| 1e86e3cb08 | |||
| b7601a9add | |||
| 9d8d702aa6 | |||
| 4659184cc1 | |||
| 104688e3ee | |||
| cc24da128c | |||
| d720cc16a6 | |||
| 0118d578a2 | |||
| 1ea86eedc0 | |||
| 5297bd7b2c | |||
| 7f57692ee3 | |||
| 20b9dbadda | |||
| c85221c64f | |||
| 962d136cbc | |||
| 728840b7c5 | |||
| c66ea9f740 | |||
| 5b3f031654 | |||
| cee80eb5f4 | |||
| 60297403a2 | |||
| 58a8683d7d | |||
| d51f008c72 | |||
| 9656fad0f5 | |||
| fd7b692d00 | |||
| 39491f789b | |||
| c4eca8b3cc | |||
| 47cafaaa7c | |||
| 1b6188ee1d | |||
| 9ee88ad070 | |||
| a95e55dc54 | |||
| 9fd2f3dd8a | |||
| 7b1d3ba7ea | |||
| e59c9b0e65 | |||
| 12e8f7d0b4 | |||
| bf7c29e4cd | |||
| 4f2c9a05fb | |||
| f287754477 | |||
| 2bc2047770 | |||
| 73433c25f2 | |||
| 9c81272278 | |||
| efa4a50cf5 | |||
| 27992b16c2 | |||
| e101a1d77a | |||
| 20243ff6fb | |||
| 98d22f8b2e | |||
| b9e6024fe9 | |||
| 31a62c18be | |||
| 2d4b6273f0 | |||
| 8dba78abce | |||
| d3ffd13c25 | |||
| 4768f293bf | |||
| 57b09c371a | |||
| b9fba8005a | |||
| 270fc13e2a | |||
| f67941d03b | |||
| c89e703bed | |||
| d0100548d4 | |||
| f7192b82b1 | |||
| 08dc8b40e4 | |||
| b875f81be3 | |||
| e8d13090b0 | |||
| f3a50a01a7 | |||
| 1290d0b1a3 | |||
| 82dfed1512 | |||
| 53e57766c9 | |||
| dde94da94f | |||
| 5f4fc4701f | |||
| 20716e13e4 | |||
| bf52a4c737 | |||
| 82ee28fa39 | |||
| f5435f5ba5 | |||
| b717691901 | |||
| 7094cc7693 | |||
| 80df352711 | |||
| 5287de930b | |||
| 378556c0c2 | |||
| b47a4da81f | |||
| 1d116cc23b | |||
| ad3b76c4d8 | |||
| 3f7cb991e4 | |||
| 9102e40f9c | |||
| 9168c344b1 | |||
| 4d4f7ac112 | |||
| 884876572b | |||
| ec7fb80a5b | |||
| c52c378f49 | |||
| 60efb3c4b4 | |||
| d694a3a166 | |||
| 90e59b2704 | |||
| 999eb83de8 | |||
| e019979749 | |||
| 15c487e547 | |||
| d8f3e22f14 | |||
| 3fa5816aab | |||
| e5f7057539 | |||
| 259a699613 | |||
| d1619af18c | |||
| bddb2504b5 | |||
| 769cb6a369 | |||
| 4512306207 | |||
| 430c617a95 | |||
| 9fde236512 | |||
| 72c2158b17 | |||
| f7ac17b6be | |||
| 1e3e5c92a8 | |||
| 5f7a3a8ca9 | |||
| 5b14f7de64 | |||
| dc4e75a61c | |||
| f484f35d85 | |||
| 9e6fac5faa | |||
| b72963ee5f | |||
| a696bf0d02 | |||
| b0cef1b143 | |||
| 02b19b7686 | |||
| 795211dba6 | |||
| 630f869f7f | |||
| 7a260c9885 | |||
| 6eb0ecbe7c | |||
| 071fbb92df | |||
| 357c3160bb | |||
| 2ba0b1b76b | |||
| a8c5454724 | |||
| c963e0b62b | |||
| 05b33012b7 | |||
| 91fcad0a93 | |||
| fb344fb646 | |||
| f5fe75a73b | |||
| df0fb9551f | |||
| 7e5b6dee9c | |||
| 174e121034 | |||
| 9ebd9c4447 | |||
| 4400b56fb5 | |||
| 4de63714ce | |||
| 0ca72a7d60 | |||
| 2aa34186e1 | |||
| adc76243dc | |||
| 565e72d9d7 | |||
| 2d7ef30e59 | |||
| 9284a01346 | |||
| b574d06f5f | |||
| 1c29874541 | |||
| 08d8026fa3 | |||
| 2286ac1c49 | |||
| 8d616133d6 | |||
| 7197017e74 | |||
| f542c7232e | |||
| 7568f6f2ec | |||
| 3271048ab6 | |||
| 791bfc181b | |||
| 1facc8efbc | |||
| b2d8e7137f | |||
| ba63fca9d8 | |||
| 655c0efb31 | |||
| 52fe7a9f2a | |||
| fb9c24b900 | |||
| 05d5f06bb5 | |||
| 9dd9448d02 | |||
| cb2593f2bb | |||
| 4c7db9e62d | |||
| 466e6008ad | |||
| 396e42e17c | |||
| f808593b2d | |||
| 7de0065216 | |||
| 285e07be76 | |||
| 66765d827b | |||
| 19ea90aff5 | |||
| ad58118df0 | |||
| 2a0be7e91e | |||
| fbdc364329 | |||
| 54798d4743 | |||
| 5aed2b379a | |||
| 6f5e0f96b4 | |||
| 9dea86068a | |||
| af3482b7cd | |||
| 707d32536c | |||
| d247a79e48 | |||
| 5820eea1cb | |||
| b6e0ed43de | |||
| 72b28ac2fc | |||
| 2ae3dd970a | |||
| a3bc6a73a3 | |||
| e1bf7daf59 | |||
| f0af6460a1 | |||
| 9dcaaedf06 | |||
| 9c58537078 | |||
| c46749f236 | |||
| c09469a71c | |||
| afbb5e2721 | |||
| 9a702cd0c4 | |||
| 77599bec1c | |||
| a5f54b5ec1 | |||
| b2df6152af | |||
| 98aad6ef76 | |||
| 730d7ec528 | |||
| c911ba4747 | |||
| 9fdb318776 | |||
| d92a621a70 | |||
| 7734f2eed8 | |||
| 10dc0bcfa2 | |||
| 5d1f224794 | |||
| d876ff522a | |||
| 8f2b51c461 | |||
| cd8d21cf8e | |||
| 3d37a6ce27 | |||
| 82c7bcd761 | |||
| 3c9367825c | |||
| e99540554a | |||
| 86152668c3 | |||
| 61088b71c6 | |||
| 1bb15fd2cc | |||
| 67f934a902 | |||
| a0a54bdd05 | |||
| ed65172308 | |||
| 0a35a2fac9 | |||
| a1d2c85d88 | |||
| 7d49f75317 | |||
| 3e883e4be4 | |||
| 3e65c1d0a3 | |||
| e25ad9759a | |||
| 06ccc0121f | |||
| 03bfffea23 | |||
| de5a55c03e | |||
| b4771030d3 | |||
| 4d06f982db | |||
| 1fb057462a | |||
| 93374facb8 | |||
| e862047142 | |||
| 90eb776310 | |||
| 9c77b2dfeb | |||
| 6abfd601ba | |||
| 38738b2a18 | |||
| 99b5f7badf | |||
| ac558afc8a | |||
| d555656a41 | |||
| 10fd86fd68 | |||
| af58734826 | |||
| 08a6ff6e6c | |||
| 7d13f96e28 | |||
| e726f82344 | |||
| 5c054fb486 | |||
| 904f5de1ea | |||
| c79fe9a1e7 | |||
| 15943eddb1 | |||
| 8d1e294b32 | |||
| c4e89bea32 | |||
| b37f6e9df1 | |||
| 30a5e31b66 | |||
| 5415fb361f | |||
| 34010c5605 | |||
| 41d2ea4306 | |||
| 36ea4658f1 | |||
| cc0b9bbca9 | |||
| f38c6d0995 | |||
| bfa2bbef85 | |||
| 7a9f4161ea | |||
| 5c0702092a | |||
| 0706564215 | |||
| 6485bd89d9 | |||
| 38f617233d | |||
| 9e774eb41c | |||
| 6f101c0a0c | |||
| 1d5b250b58 | |||
| e7d0a0345e | |||
| 50868f14f6 | |||
| 79701aa613 | |||
| ac41ba1f73 | |||
| deb69c4c72 | |||
| 76237955c7 | |||
| cfa8e94e95 | |||
| 01de778831 | |||
| 1fda2a611c | |||
| d5d19acb3f | |||
| fded22e1b3 | |||
| 91afc2079c | |||
| d09fee90ad | |||
| e1dbdce91e | |||
| 28227ea4c4 | |||
| 97ad04dfd0 | |||
| 4ada08c690 | |||
| 84ee81aba9 | |||
| 32a70a6552 | |||
| ae88702e00 | |||
| 384fe14ac6 | |||
| c52228278f | |||
| 8c07d4e7b9 | |||
| fb5b7a34e3 | |||
| 1e951605fb | |||
| 82dd025860 | |||
| f1d5a0a1b3 | |||
| 8a43789db5 | |||
| ef0e3fe6c6 | |||
| 41d12130c2 | |||
| b23062c54a | |||
| 455a20d852 | |||
| a3498c506f | |||
| 2505291065 | |||
| 81458912f9 | |||
| da93a960af | |||
| cea03d91e4 | |||
| 320d22f2a7 | |||
| 8ff0f9e869 | |||
| 74dd2553a6 | |||
| 85bb789ffa | |||
| 06dfc4e6ef | |||
| ba7b0612dc | |||
| c8c4ff39de | |||
| d12e5104e2 | |||
| 90515fdbb0 | |||
| cb9fc6fa3e | |||
| 152f04c0a7 | |||
| 527d58c9c3 | |||
| 839c0af088 | |||
| 3db06d7426 | |||
| ae607e56ca | |||
| d6b042f9fe | |||
| 735e441afc | |||
| 48d00e817f | |||
| ce4dc4ae21 | |||
| 0c1087a2e5 | |||
| abd605a066 | |||
| 5bd06d3a02 | |||
| 391cf379ae | |||
| 264cce2003 | |||
| 79dd0958d0 | |||
| 2c6188b73f | |||
| 33adabb035 | |||
| 616500b8f3 | |||
| 2f98f5a6d6 | |||
| 2a6656050c | |||
| 80b22ca2be | |||
| 53159a81cf | |||
| 6f0f7ce948 | |||
| c21dd828d5 | |||
| 97bed8e710 | |||
| aaf70d652b | |||
| 54c21b30c9 | |||
| 91f23938b5 | |||
| 0af0db6593 | |||
| 7a1ebd22ed | |||
| c2e96a081f | |||
| 1d56035a56 | |||
| 0e68a9e0fc | |||
| a143a8b1f6 | |||
| 5114b37bfa | |||
| 8c746302a2 | |||
| a1d6ca2298 | |||
| d6a617c225 | |||
| 69f57351b2 | |||
| c4d5267107 | |||
| 6b1ee680a2 | |||
| d3ebdae159 | |||
| 86a0d3faff | |||
| 3f62ad08e1 | |||
| 1a483a7d88 | |||
| 3daff15f34 | |||
| 1736c1e32e | |||
| 764ca25f8d | |||
| 79ee48d91b | |||
| e2f4fc245a | |||
| f26319a2b0 | |||
| 637c99a362 | |||
| a1a0ed0563 | |||
| 0a825a1aa4 | |||
| b5f805fc6c | |||
| 55c8633f9a | |||
| 1fa95de554 | |||
| a1080f4853 | |||
| 48d178886e | |||
| 673bac12a6 | |||
| b0a0508c85 | |||
| 69ecdd3236 | |||
| 9a950cdca6 | |||
| 7ec3cf46d6 | |||
| ba0d3d1a6a | |||
| b9ff3b6c81 | |||
| f4178e41b3 | |||
| d648227e3d | |||
| 3d0094b611 | |||
| f85a4c0467 | |||
| b24d4cce8d | |||
| a235da9cc5 | |||
| fa45ea32dc | |||
| a594c444da | |||
| 210f06d990 | |||
| 899156435c | |||
| 1303b4950f | |||
| a24deadb54 | |||
| 4b55e6e68e | |||
| 0121366f65 | |||
| c60fefa1a6 | |||
| 8c03d50421 | |||
| 7318814474 | |||
| afc4f3386a | |||
| c6c6171841 | |||
| 47bf88ed3f | |||
| 492d67c6e8 | |||
| 58b63cb58c | |||
| d4a76b979c | |||
| 4fdfd04d3c | |||
| 79f6aacc85 | |||
| c73ce3d02d | |||
| f3d03b025a | |||
| a1ac59a48a | |||
| f401f817ed | |||
| 23c76075e5 | |||
| d132e6bce4 | |||
| 1f188b2610 | |||
| a6d8b3b847 | |||
| 0de6e80093 | |||
| 3d0f8c986f | |||
| d41edf21e4 | |||
| 06167087b3 | |||
| a3d5d9112a | |||
| 1cb5ba3efd | |||
| b56d9c9e31 | |||
| a48369dc41 | |||
| 6800753f09 | |||
| e9e08c6576 | |||
| 5907bbea6e | |||
| cb5b265dcd | |||
| f9baf3eb1c | |||
| 1dba4aceca | |||
| e8b3532658 | |||
| 35979bb5a6 | |||
| 182e826dc5 | |||
| 08ef4bfbff | |||
| 1bc3f346b1 | |||
| 6dff0b13a4 | |||
| 76796c76cd | |||
| c5d2343f51 | |||
| e6e7c95e94 | |||
| f4cb9de8d9 | |||
| 6f19551a77 | |||
| efce449550 | |||
| ffa216d958 | |||
| ecb42cad9b | |||
| 0ddb77c048 | |||
| 5bd806ada6 | |||
| 2582649490 | |||
| 2084ead56c | |||
| f2e50d4ffd | |||
| 6faa7a060c | |||
| f998b72e99 | |||
| fe30f2e48e | |||
| 9a82bed3a5 | |||
| a00b8ecc55 | |||
| 9452444a9f | |||
| 2e8f56fc86 | |||
| 8148148932 | |||
| e000eeaafb | |||
| 9ac9307b44 | |||
| cdba010794 | |||
| eb947dc325 | |||
| 9e22135f35 | |||
| 5c42ced8d3 | |||
| b5e9a9d451 | |||
| cd3cfb27de | |||
| f7d35ff619 | |||
| 81dd3b46c5 | |||
| 96d3b41989 | |||
| ff837a767b | |||
| 002dc80d48 | |||
| c64d7483db | |||
| ef0f473199 | |||
| fd8161c523 | |||
| 53e2824937 | |||
| 71ebb2493e | |||
| ad9ec44228 | |||
| 8775e51ebd | |||
| f11877e72c | |||
| 66785be691 | |||
| 1fb3de2960 | |||
| 654343f875 | |||
| 0bf7a35a53 | |||
| 3a46634f4a | |||
| 67f7eaabc7 | |||
| d28669761f | |||
| 8684596d66 | |||
| 460ee7f5de | |||
| b7536ca94b | |||
| 58077c63a7 | |||
| 22b65489e2 | |||
| 2816188c83 | |||
| 4d78b6be31 | |||
| 5087d13de8 | |||
| 4d6d5c870c | |||
| dd8666036c | |||
| 27a4bc5a39 | |||
| 88f4d1e3a7 | |||
| c6d8b52d26 | |||
| 14efa6fbda | |||
| e859d3f3d1 | |||
| 0f26be85b5 | |||
| 49505ab93f | |||
| 86a6fcddc0 | |||
| c92de149a2 | |||
| 36fe83afcc | |||
| 5771e6eae8 | |||
| 7d491cb230 | |||
| a86f2615be | |||
| c37d9c10f7 | |||
| e39db3f9ad | |||
| 82f347403a | |||
| 916d7502c8 | |||
| 42651c1500 | |||
| da4a785fae | |||
| c2b78c6fdf | |||
| c260decf58 | |||
| 17eb468f38 | |||
| 75c64e12aa | |||
| ea25d12405 | |||
| ca8c5b041d | |||
| 414ce3589a | |||
| 37b1d3ae42 | |||
| f984339404 | |||
| 86895cbf45 | |||
| 18953e81bc | |||
| bae75d234a | |||
| 2f634bddd3 | |||
| 187f0bea3b | |||
| 605afeff74 | |||
| 0d45e6d70e | |||
| 4362cc0e9a | |||
| 5af88a3e2b | |||
| 9628700ced | |||
| 32ed98a9a5 | |||
| ea032b4b3e | |||
| 449192e565 | |||
| 9d1840e37a | |||
| ec0f9e49c3 | |||
| 390245806a | |||
| 22e02b545e | |||
| b020bd76c6 | |||
| 483b5a75e8 | |||
| 70d1719b7d | |||
| 30ba964f9d | |||
| 3ef93addd0 | |||
| 0980591fa2 | |||
| e59b252cc0 | |||
| 4496093cf8 | |||
| 8b78551b92 | |||
| bde2e3956d | |||
| c85ba4c259 | |||
| 403518e852 | |||
| 41091f8ebf | |||
| f78c39cc98 | |||
| 39a9b7b721 | |||
| 9d2b6cb589 | |||
| 87c42c8c5d | |||
| e31afb5885 | |||
| 2fbac107ca | |||
| a1239ee6a8 | |||
| 15ac8d9ffc | |||
| f57be52061 | |||
| f68918c5a9 | |||
| 1b481f1946 | |||
| 127c1ef8bf | |||
| 189c8701d7 | |||
| f7c1b6e060 | |||
| c25020765c | |||
| 10c3928eef | |||
| 100fe404a5 | |||
| 0ade0a44b5 | |||
| 7a20d94536 | |||
| 4e2e178417 | |||
| aad9ea0e05 | |||
| 074da1fedf | |||
| c8a760832b | |||
| b69dcb51a0 | |||
| e55229db40 | |||
| d8abd04a8e | |||
| 5935572458 | |||
| 807521f91b | |||
| 8ee14a8039 | |||
| 8cd45189c3 | |||
| fbb0a77ce3 | |||
| 854574af66 | |||
| 1f7d6461c5 | |||
| 30d5135fdd | |||
| 192c5d2c4a | |||
| 6c87673e57 | |||
| ba46b25e2f | |||
| d044147698 | |||
| 689405732c | |||
| bae54f312d | |||
| 8fbe363f3c | |||
| 141c5e60c5 | |||
| 9d41fe251b | |||
| 6ccebbf7a8 | |||
| ef27358a82 | |||
| fb13a502d2 | |||
| e6b363ef54 | |||
| 8fd3fd7259 | |||
| 3f2f799248 | |||
| b460019846 | |||
| 35b5e6a923 | |||
| e24f3585d4 | |||
| 220f55d760 | |||
| c374343ae9 | |||
| ca3035fe07 | |||
| 5af621056a | |||
| 44d43495a7 | |||
| 8a92ad1434 | |||
| 182d51eb34 | |||
| 22dc1e7f86 | |||
| babd8868d9 | |||
| 038d3bea87 | |||
| f3399ead26 | |||
| 888f0a27da | |||
| c979181bd7 | |||
| 916537b0f8 | |||
| 65152066ca | |||
| 0651e45460 | |||
| 7d96af950e | |||
| 82d5194a4f | |||
| 9d479ab64b | |||
| 1922598f0f | |||
| 3d7b86660a | |||
| 907964a7d1 | |||
| 384c0c12ea | |||
| 749568f290 | |||
| 0403bd8c3c | |||
| eafadaf15a | |||
| ea06e2e403 | |||
| 11a15ca58a | |||
| 93cb647091 | |||
| 42b879e6b8 | |||
| b8f8459275 |
@@ -0,0 +1,89 @@
|
||||
---
|
||||
Language: Cpp
|
||||
AccessModifierOffset: -4
|
||||
AlignAfterOpenBracket: Align
|
||||
AlignConsecutiveAssignments: false
|
||||
AlignConsecutiveDeclarations: false
|
||||
AlignEscapedNewlinesLeft: false
|
||||
AlignOperands: true
|
||||
AlignTrailingComments: true
|
||||
AllowAllParametersOfDeclarationOnNextLine: true
|
||||
AllowShortBlocksOnASingleLine: false
|
||||
AllowShortCaseLabelsOnASingleLine: false
|
||||
AllowShortFunctionsOnASingleLine: All
|
||||
AllowShortIfStatementsOnASingleLine: false
|
||||
AllowShortLoopsOnASingleLine: false
|
||||
AlwaysBreakAfterDefinitionReturnType: None
|
||||
AlwaysBreakAfterReturnType: None
|
||||
AlwaysBreakBeforeMultilineStrings: false
|
||||
AlwaysBreakTemplateDeclarations: true
|
||||
BinPackArguments: true
|
||||
BinPackParameters: true
|
||||
BraceWrapping:
|
||||
AfterClass: true
|
||||
AfterControlStatement: false
|
||||
AfterEnum: false
|
||||
AfterFunction: true
|
||||
AfterNamespace: true
|
||||
AfterObjCDeclaration: false
|
||||
AfterStruct: true
|
||||
AfterUnion: true
|
||||
BeforeCatch: false
|
||||
BeforeElse: false
|
||||
IndentBraces: false
|
||||
BreakBeforeBinaryOperators: None
|
||||
BreakBeforeBraces: Custom
|
||||
BreakBeforeTernaryOperators: false
|
||||
BreakConstructorInitializersBeforeComma: true
|
||||
ColumnLimit: 0
|
||||
CommentPragmas: '^ (IWYU pragma:|NOLINT)'
|
||||
ConstructorInitializerAllOnOneLineOrOnePerLine: false
|
||||
ConstructorInitializerIndentWidth: 4
|
||||
ContinuationIndentWidth: 4
|
||||
Cpp11BracedListStyle: true
|
||||
DerivePointerAlignment: false
|
||||
DisableFormat: false
|
||||
ForEachMacros: []
|
||||
IncludeCategories:
|
||||
- Regex: '^"(stdafx|PrecompiledHeader)'
|
||||
Priority: -2
|
||||
- Regex: '^".*Common'
|
||||
Priority: -1
|
||||
- Regex: '^<'
|
||||
Priority: 1
|
||||
- Regex: '^"'
|
||||
Priority: 2
|
||||
IndentCaseLabels: true
|
||||
IndentWidth: 4
|
||||
IndentWrappedFunctionNames: false
|
||||
KeepEmptyLinesAtTheStartOfBlocks: true
|
||||
MacroBlockBegin: ''
|
||||
MacroBlockEnd: ''
|
||||
MaxEmptyLinesToKeep: 3
|
||||
NamespaceIndentation: None
|
||||
ObjCBlockIndentWidth: 2
|
||||
ObjCSpaceAfterProperty: false
|
||||
ObjCSpaceBeforeProtocolList: true
|
||||
PenaltyBreakBeforeFirstCallParameter: 19
|
||||
PenaltyBreakComment: 300
|
||||
PenaltyBreakFirstLessLess: 120
|
||||
PenaltyBreakString: 1000
|
||||
PenaltyExcessCharacter: 1000000
|
||||
PenaltyReturnTypeOnItsOwnLine: 60
|
||||
PointerAlignment: Right
|
||||
ReflowComments: true
|
||||
SortIncludes: false
|
||||
SpaceAfterCStyleCast: false
|
||||
SpaceBeforeAssignmentOperators: true
|
||||
SpaceBeforeParens: ControlStatements
|
||||
SpaceInEmptyParentheses: false
|
||||
SpacesBeforeTrailingComments: 1
|
||||
SpacesInAngles: false
|
||||
SpacesInContainerLiterals: true
|
||||
SpacesInCStyleCastParentheses: false
|
||||
SpacesInParentheses: false
|
||||
SpacesInSquareBrackets: false
|
||||
Standard: Cpp11
|
||||
TabWidth: 4
|
||||
UseTab: Never
|
||||
...
|
||||
@@ -0,0 +1,12 @@
|
||||
# Should always be specified at the top of the file outside of any sections
|
||||
root = true
|
||||
|
||||
# TODO: Add one for resource script file and other Linux specific files ?
|
||||
|
||||
[*.{cpp,h}]
|
||||
indent_style = tab
|
||||
indent_size = 4
|
||||
#trim_trailing_whitespace = true
|
||||
|
||||
[*.md]
|
||||
trim_trailing_whitespace = false
|
||||
@@ -0,0 +1,8 @@
|
||||
# Set the default behavior, in case people don't have core.autocrlf set.
|
||||
* text=auto
|
||||
|
||||
# Declare files that will always have CRLF line endings on checkout.
|
||||
*.sln text eol=crlf
|
||||
*.props text eol=crlf
|
||||
*.vcxproj text eol=crlf
|
||||
*.vcxproj.filters text eol=crlf
|
||||
+114
@@ -0,0 +1,114 @@
|
||||
.*.swp
|
||||
.*.swn
|
||||
.*.swo
|
||||
|
||||
*.suo
|
||||
*.ncb
|
||||
*.sdf
|
||||
*.opensdf
|
||||
*.user
|
||||
*.log
|
||||
*.dsp
|
||||
*.dsw
|
||||
*.bsc
|
||||
*.aps
|
||||
*.exe
|
||||
*.wav
|
||||
|
||||
*.trace
|
||||
*.dump
|
||||
|
||||
*.asm
|
||||
!/plugins/zerogs/dx/x86-32.asm
|
||||
!/plugins/zerogs/dx/x86-64.asm
|
||||
!/plugins/zerogs/opengl/x86-32.asm
|
||||
!/plugins/zzogl-pg/opengl/x86-32.asm
|
||||
|
||||
*.VC.db
|
||||
*.VC.VC.opendb
|
||||
|
||||
**/Win32/Release*
|
||||
**/Win32/Debug*
|
||||
**/Win32/Devel*
|
||||
**/x64/Release*
|
||||
**/x64/Debug*
|
||||
**/x64/Devel*
|
||||
|
||||
_ReSharper.*
|
||||
pcsx2.snapshot_*
|
||||
svnrev.h
|
||||
|
||||
/build
|
||||
/obj-*
|
||||
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
Debug.txt
|
||||
install_log.txt
|
||||
padLog.txt
|
||||
|
||||
Debug
|
||||
Release
|
||||
Devel
|
||||
|
||||
oprofile_data/
|
||||
|
||||
# Recording Specific Ignores (pcsx2-rr)
|
||||
*.p2s
|
||||
*.p2m2
|
||||
*.p2m2_backup
|
||||
*.p2m2_SaveState.p2s
|
||||
|
||||
# Visual Studio upgrades
|
||||
/Backup*
|
||||
/UpgradeLog*.htm
|
||||
|
||||
/bin/**/*.dll
|
||||
/bin/**/*.exp
|
||||
/bin/**/*.ilk
|
||||
/bin/**/*.lib
|
||||
/bin/**/*.pdb
|
||||
/bin/PCSX2
|
||||
/bin/*ReplayLoader
|
||||
/bin/bios
|
||||
/bin/dumps
|
||||
/bin/help
|
||||
/bin/inis
|
||||
/bin/logs
|
||||
/bin/memcards
|
||||
/bin/plugins
|
||||
/bin/snaps
|
||||
/bin/sstates
|
||||
/deps
|
||||
/ipch
|
||||
|
||||
!/3rdparty/libjpeg/change.log
|
||||
/3rdparty/portaudio/portaudio-2.0.pc
|
||||
/3rdparty/portaudio/bin
|
||||
/3rdparty/portaudio/bin-*
|
||||
/3rdparty/portaudio/autom4te.cache
|
||||
/3rdparty/portaudio/libtool
|
||||
/3rdparty/portaudio/config.*
|
||||
/3rdparty/portaudio/lib-stamp
|
||||
/3rdparty/portaudio/Makefile
|
||||
/3rdparty/portaudio/bindings
|
||||
/3rdparty/portaudio/test
|
||||
/3rdparty/portaudio/testcvs
|
||||
/3rdparty/portaudio/src/hostapi/asio/ASIOSDK/common
|
||||
/3rdparty/portaudio/src/hostapi/asio/ASIOSDK/host
|
||||
/3rdparty/portaudio/src/hostapi/wasapi/mingw-include
|
||||
/3rdparty/**/include/wx/setup.h
|
||||
/3rdparty/**/wx/msw/rcdefs.h
|
||||
/pcsx2/gui/Resources/*.h
|
||||
!/pcsx2/gui/Resources/EmbeddedImage.h
|
||||
/plugins/GSdx/Template
|
||||
/plugins/USBqemu/Win32/bin
|
||||
/plugins/zerospu2/Windows/dsound51.cpp
|
||||
/tools/bin
|
||||
/tools/GSDumpGUI/bin
|
||||
/tools/GSDumpGUI/obj
|
||||
.vs
|
||||
|
||||
/pcsx2/windows/VCprojects/GSdx_opengl_debug_hw.txt
|
||||
/pcsx2/windows/VCprojects/GSdx_opengl_debug_sw.txt
|
||||
@@ -0,0 +1,3 @@
|
||||
[submodule "3rdparty/xz/xz"]
|
||||
path = 3rdparty/xz/xz
|
||||
url = https://github.com/PCSX2/xz.git
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
language: cpp
|
||||
|
||||
sudo: required
|
||||
|
||||
cache: ccache
|
||||
|
||||
dist: xenial
|
||||
|
||||
matrix:
|
||||
include:
|
||||
- env: VERSION=8 BITS=64
|
||||
compiler: gcc
|
||||
os: linux
|
||||
- env: VERSION=8 BITS=32
|
||||
compiler: gcc
|
||||
os: linux
|
||||
- env: VERSION=7 BITS=32
|
||||
compiler: gcc
|
||||
os: linux
|
||||
- env: VERSION=3.8 BITS=32
|
||||
compiler: clang
|
||||
os: linux
|
||||
|
||||
before_install:
|
||||
- ./travis.sh before_install
|
||||
|
||||
before_script:
|
||||
- ./travis.sh before_script
|
||||
|
||||
script:
|
||||
- ./travis.sh script
|
||||
|
||||
after_success:
|
||||
- ./travis.sh after_success
|
||||
Vendored
+21
-21
@@ -1,21 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
|
||||
<OutDir>$(SvnRootDir)\deps\$(PlatformName)\$(Configuration)\</OutDir>
|
||||
<IntDir>$(PlatformName)\$(Configuration)\</IntDir>
|
||||
<ExtensionsToDeleteOnClean>*.bsc;*.idb;*.sbr;*.res;*.pch;*.pdb;*.obj;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;*.pgc;*.pgd;*.meta;$(TargetPath);$(ExtensionsToDeleteOnClean)</ExtensionsToDeleteOnClean>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup>
|
||||
<ClCompile>
|
||||
<AdditionalIncludeDirectories>$(ProjectDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>__WIN32__;WIN32;_WINDOWS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<StructMemberAlignment>16Bytes</StructMemberAlignment>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<RuntimeTypeInfo>false</RuntimeTypeInfo>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<CompileAs>Default</CompileAs>
|
||||
</ClCompile>
|
||||
</ItemDefinitionGroup>
|
||||
</Project>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
|
||||
<OutDir>$(SolutionDir)deps\$(PlatformName)\$(Configuration)\</OutDir>
|
||||
<IntDir>$(PlatformName)\$(Configuration)\</IntDir>
|
||||
<ExtensionsToDeleteOnClean>*.bsc;*.idb;*.sbr;*.res;*.pch;*.pdb;*.obj;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;*.pgc;*.pgd;*.meta;$(TargetPath);$(ExtensionsToDeleteOnClean)</ExtensionsToDeleteOnClean>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup>
|
||||
<ClCompile>
|
||||
<AdditionalIncludeDirectories>$(ProjectDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>__WIN32__;WIN32;_WINDOWS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<StructMemberAlignment>16Bytes</StructMemberAlignment>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<RuntimeTypeInfo>false</RuntimeTypeInfo>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
<CompileAs>Default</CompileAs>
|
||||
</ClCompile>
|
||||
</ItemDefinitionGroup>
|
||||
</Project>
|
||||
|
||||
Vendored
-26
@@ -1,26 +0,0 @@
|
||||
<?xml version="1.0" encoding="windows-1250"?>
|
||||
<VisualStudioPropertySheet
|
||||
ProjectType="Visual C++"
|
||||
Version="8.00"
|
||||
Name="3rdparty"
|
||||
OutputDirectory="$(SvnRootDir)\deps\$(PlatformName)\$(ConfigurationName)"
|
||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
||||
DeleteExtensionsOnClean="*.bsc;*.idb;*.sbr;*.res;*.pch;*.pdb;*.obj;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;*.pgc;*.pgd;*.meta;$(TargetPath)"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""$(ProjectDir)""
|
||||
PreprocessorDefinitions="__WIN32__;WIN32;_WINDOWS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE"
|
||||
StructMemberAlignment="5"
|
||||
EnableFunctionLevelLinking="true"
|
||||
RuntimeTypeInfo="false"
|
||||
WarningLevel="3"
|
||||
DebugInformationFormat="3"
|
||||
CompileAs="0"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="2"
|
||||
/>
|
||||
</VisualStudioPropertySheet>
|
||||
Vendored
-28
@@ -1,28 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
|
||||
<OutDir>$(SvnRootDir)\deps\$(PlatformName)\$(Configuration)\</OutDir>
|
||||
<IntDir>$(PlatformName)\$(Configuration)\</IntDir>
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup>
|
||||
<ClCompile>
|
||||
<AdditionalIncludeDirectories>$(ProjectDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
<PreprocessorDefinitions>__WIN32__;WIN32;_WINDOWS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<StructMemberAlignment>16Bytes</StructMemberAlignment>
|
||||
<RuntimeTypeInfo>false</RuntimeTypeInfo>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<OutputFile>$(SolutionDir)bin\$(ProjectName).dll</OutputFile>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<ImportLibrary>$(OutDir)$(ProjectName).lib</ImportLibrary>
|
||||
</Link>
|
||||
<ResourceCompile>
|
||||
<AdditionalIncludeDirectories>$(SvnRootDir)/common/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ResourceCompile>
|
||||
</ItemDefinitionGroup>
|
||||
</Project>
|
||||
Vendored
-30
@@ -1,30 +0,0 @@
|
||||
<?xml version="1.0" encoding="windows-1250"?>
|
||||
<VisualStudioPropertySheet
|
||||
ProjectType="Visual C++"
|
||||
Version="8.00"
|
||||
Name="3rdpartyDLL"
|
||||
OutputDirectory="$(SvnRootDir)\deps\$(PlatformName)\$(ConfigurationName)"
|
||||
IntermediateDirectory="$(PlatformName)\$(ConfigurationName)"
|
||||
>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
AdditionalIncludeDirectories=""$(ProjectDir)""
|
||||
PreprocessorDefinitions="__WIN32__;WIN32;_WINDOWS;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE"
|
||||
StructMemberAlignment="5"
|
||||
RuntimeTypeInfo="false"
|
||||
WarningLevel="3"
|
||||
DebugInformationFormat="3"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLinkerTool"
|
||||
OutputFile="$(SolutionDir)\bin\$(ProjectName).dll"
|
||||
LinkIncremental="1"
|
||||
GenerateDebugInformation="true"
|
||||
SubSystem="2"
|
||||
ImportLibrary="$(OutDir)\$(ProjectName).lib"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
AdditionalIncludeDirectories=""$(SvnRootDir)/common/include""
|
||||
/>
|
||||
</VisualStudioPropertySheet>
|
||||
Vendored
-8
@@ -1,8 +0,0 @@
|
||||
# Check that people use the good file
|
||||
if(NOT TOP_CMAKE_WAS_SOURCED)
|
||||
message(FATAL_ERROR "
|
||||
You did not 'cmake' the good CMakeLists.txt file. Use the one in the top dir.
|
||||
It is advice to delete all wrongly generated cmake stuff => CMakeFiles & CMakeCache.txt")
|
||||
endif(NOT TOP_CMAKE_WAS_SOURCED)
|
||||
|
||||
### 3rd party was dropped
|
||||
Vendored
+17
-17
@@ -1,18 +1,18 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup Label="UserMacros">
|
||||
<ProjectRootDir>$(ProjectDir)</ProjectRootDir>
|
||||
<SvnRootDir>$(ProjectRootDir)\..\..</SvnRootDir>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<BuildMacro Include="ProjectRootDir">
|
||||
<Value>$(ProjectRootDir)</Value>
|
||||
</BuildMacro>
|
||||
<BuildMacro Include="SvnRootDir">
|
||||
<Value>$(SvnRootDir)</Value>
|
||||
</BuildMacro>
|
||||
</ItemGroup>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup Label="UserMacros">
|
||||
<ProjectRootDir>$(ProjectDir)</ProjectRootDir>
|
||||
<SvnRootDir>$(ProjectRootDir)\..\..</SvnRootDir>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<BuildMacro Include="ProjectRootDir">
|
||||
<Value>$(ProjectRootDir)</Value>
|
||||
</BuildMacro>
|
||||
<BuildMacro Include="SvnRootDir">
|
||||
<Value>$(SvnRootDir)</Value>
|
||||
</BuildMacro>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
-15
@@ -1,15 +0,0 @@
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioPropertySheet
|
||||
ProjectType="Visual C++"
|
||||
Version="8.00"
|
||||
Name="DefaultProjectRootDir"
|
||||
>
|
||||
<UserMacro
|
||||
Name="ProjectRootDir"
|
||||
Value="$(ProjectDir)"
|
||||
/>
|
||||
<UserMacro
|
||||
Name="SvnRootDir"
|
||||
Value="$(ProjectRootDir)\..\.."
|
||||
/>
|
||||
</VisualStudioPropertySheet>
|
||||
Vendored
+5866
File diff suppressed because it is too large
Load Diff
Vendored
-14435
File diff suppressed because it is too large
Load Diff
Vendored
+1704
-569
File diff suppressed because it is too large
Load Diff
Vendored
-1476
File diff suppressed because it is too large
Load Diff
Vendored
-1247
File diff suppressed because it is too large
Load Diff
Vendored
+630
-691
File diff suppressed because it is too large
Load Diff
Vendored
-349
@@ -1,349 +0,0 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Win32 version of the AMD 3DNow! optimized routines for AMD K6-2/Athlon
|
||||
/// processors. All 3DNow! optimized functions have been gathered into this
|
||||
/// single source code file, regardless to their class or original source code
|
||||
/// file, in order to ease porting the library to other compiler and processor
|
||||
/// platforms.
|
||||
///
|
||||
/// By the way; the performance gain depends heavily on the CPU generation: On
|
||||
/// K6-2 these routines provided speed-up of even 2.4 times, while on Athlon the
|
||||
/// difference to the original routines stayed at unremarkable 8%! Such a small
|
||||
/// improvement on Athlon is due to 3DNow can perform only two operations in
|
||||
/// parallel, and obviously also the Athlon FPU is doing a very good job with
|
||||
/// the standard C floating point routines! Here these routines are anyway,
|
||||
/// although it might not be worth the effort to convert these to GCC platform,
|
||||
/// for Athlon CPU at least. The situation is different regarding the SSE
|
||||
/// optimizations though, thanks to the four parallel operations of SSE that
|
||||
/// already make a difference.
|
||||
///
|
||||
/// This file is to be compiled in Windows platform with Microsoft Visual C++
|
||||
/// Compiler. Please see '3dnow_gcc.cpp' for the gcc compiler version for all
|
||||
/// GNU platforms (if file supplied).
|
||||
///
|
||||
/// NOTICE: If using Visual Studio 6.0, you'll need to install the "Visual C++
|
||||
/// 6.0 processor pack" update to support 3DNow! instruction set. The update is
|
||||
/// available for download at Microsoft Developers Network, see here:
|
||||
/// http://msdn.microsoft.com/en-us/vstudio/aa718349.aspx
|
||||
///
|
||||
/// If the above URL is expired or removed, go to "http://msdn.microsoft.com" and
|
||||
/// perform a search with keywords "processor pack".
|
||||
///
|
||||
/// Author : Copyright (c) Olli Parviainen
|
||||
/// Author e-mail : oparviai 'at' iki.fi
|
||||
/// SoundTouch WWW: http://www.surina.net/soundtouch
|
||||
///
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Last changed : $Date: 2009-02-21 18:00:14 +0200 (Sat, 21 Feb 2009) $
|
||||
// File revision : $Revision: 4 $
|
||||
//
|
||||
// $Id: 3dnow_win.cpp 63 2009-02-21 16:00:14Z oparviai $
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// License :
|
||||
//
|
||||
// SoundTouch audio processing library
|
||||
// Copyright (c) Olli Parviainen
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Lesser General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2.1 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public
|
||||
// License along with this library; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "cpu_detect.h"
|
||||
#include "STTypes.h"
|
||||
|
||||
#ifndef WIN32
|
||||
#error "wrong platform - this source code file is exclusively for Win32 platform"
|
||||
#endif
|
||||
|
||||
using namespace soundtouch;
|
||||
|
||||
#ifdef ALLOW_3DNOW
|
||||
// 3DNow! routines available only with float sample type
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// implementation of 3DNow! optimized functions of class 'TDStretch3DNow'
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "TDStretch.h"
|
||||
|
||||
|
||||
// Calculates cross correlation of two buffers
|
||||
double TDStretch3DNow::calcCrossCorrStereo(const float *pV1, const float *pV2) const
|
||||
{
|
||||
int overlapLengthLocal = overlapLength;
|
||||
float corr = 0;
|
||||
|
||||
// Calculates the cross-correlation value between 'pV1' and 'pV2' vectors
|
||||
/*
|
||||
c-pseudocode:
|
||||
|
||||
corr = 0;
|
||||
for (i = 0; i < overlapLength / 4; i ++)
|
||||
{
|
||||
corr += pV1[0] * pV2[0];
|
||||
pV1[1] * pV2[1];
|
||||
pV1[2] * pV2[2];
|
||||
pV1[3] * pV2[3];
|
||||
pV1[4] * pV2[4];
|
||||
pV1[5] * pV2[5];
|
||||
pV1[6] * pV2[6];
|
||||
pV1[7] * pV2[7];
|
||||
|
||||
pV1 += 8;
|
||||
pV2 += 8;
|
||||
}
|
||||
*/
|
||||
|
||||
_asm
|
||||
{
|
||||
// give prefetch hints to CPU of what data are to be needed soonish.
|
||||
// give more aggressive hints on pV1 as that changes more between different calls
|
||||
// while pV2 stays the same.
|
||||
prefetch [pV1]
|
||||
prefetch [pV2]
|
||||
prefetch [pV1 + 32]
|
||||
|
||||
mov eax, dword ptr pV2
|
||||
mov ebx, dword ptr pV1
|
||||
|
||||
pxor mm0, mm0
|
||||
|
||||
mov ecx, overlapLengthLocal
|
||||
shr ecx, 2 // div by four
|
||||
|
||||
loop1:
|
||||
movq mm1, [eax]
|
||||
prefetch [eax + 32] // give a prefetch hint to CPU what data are to be needed soonish
|
||||
pfmul mm1, [ebx]
|
||||
prefetch [ebx + 64] // give a prefetch hint to CPU what data are to be needed soonish
|
||||
|
||||
movq mm2, [eax + 8]
|
||||
pfadd mm0, mm1
|
||||
pfmul mm2, [ebx + 8]
|
||||
|
||||
movq mm3, [eax + 16]
|
||||
pfadd mm0, mm2
|
||||
pfmul mm3, [ebx + 16]
|
||||
|
||||
movq mm4, [eax + 24]
|
||||
pfadd mm0, mm3
|
||||
pfmul mm4, [ebx + 24]
|
||||
|
||||
add eax, 32
|
||||
pfadd mm0, mm4
|
||||
add ebx, 32
|
||||
|
||||
dec ecx
|
||||
jnz loop1
|
||||
|
||||
// add halfs of mm0 together and return the result.
|
||||
// note: mm1 is used as a dummy parameter only, we actually don't care about it's value
|
||||
pfacc mm0, mm1
|
||||
movd corr, mm0
|
||||
femms
|
||||
}
|
||||
|
||||
return corr;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// implementation of 3DNow! optimized functions of class 'FIRFilter'
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "FIRFilter.h"
|
||||
|
||||
FIRFilter3DNow::FIRFilter3DNow() : FIRFilter()
|
||||
{
|
||||
filterCoeffsUnalign = NULL;
|
||||
filterCoeffsAlign = NULL;
|
||||
}
|
||||
|
||||
|
||||
FIRFilter3DNow::~FIRFilter3DNow()
|
||||
{
|
||||
delete[] filterCoeffsUnalign;
|
||||
filterCoeffsUnalign = NULL;
|
||||
filterCoeffsAlign = NULL;
|
||||
}
|
||||
|
||||
|
||||
// (overloaded) Calculates filter coefficients for 3DNow! routine
|
||||
void FIRFilter3DNow::setCoefficients(const float *coeffs, uint newLength, uint uResultDivFactor)
|
||||
{
|
||||
uint i;
|
||||
float fDivider;
|
||||
|
||||
FIRFilter::setCoefficients(coeffs, newLength, uResultDivFactor);
|
||||
|
||||
// Scale the filter coefficients so that it won't be necessary to scale the filtering result
|
||||
// also rearrange coefficients suitably for 3DNow!
|
||||
// Ensure that filter coeffs array is aligned to 16-byte boundary
|
||||
delete[] filterCoeffsUnalign;
|
||||
filterCoeffsUnalign = new float[2 * newLength + 4];
|
||||
filterCoeffsAlign = (float *)(((uint)filterCoeffsUnalign + 15) & (uint)-16);
|
||||
|
||||
fDivider = (float)resultDivider;
|
||||
|
||||
// rearrange the filter coefficients for mmx routines
|
||||
for (i = 0; i < newLength; i ++)
|
||||
{
|
||||
filterCoeffsAlign[2 * i + 0] =
|
||||
filterCoeffsAlign[2 * i + 1] = coeffs[i + 0] / fDivider;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 3DNow!-optimized version of the filter routine for stereo sound
|
||||
uint FIRFilter3DNow::evaluateFilterStereo(float *dest, const float *src, uint numSamples) const
|
||||
{
|
||||
float *filterCoeffsLocal = filterCoeffsAlign;
|
||||
uint count = (numSamples - length) & (uint)-2;
|
||||
uint lengthLocal = length / 4;
|
||||
|
||||
assert(length != 0);
|
||||
assert(count % 2 == 0);
|
||||
|
||||
/* original code:
|
||||
|
||||
double suml1, suml2;
|
||||
double sumr1, sumr2;
|
||||
uint i, j;
|
||||
|
||||
for (j = 0; j < count; j += 2)
|
||||
{
|
||||
const float *ptr;
|
||||
|
||||
suml1 = sumr1 = 0.0;
|
||||
suml2 = sumr2 = 0.0;
|
||||
ptr = src;
|
||||
filterCoeffsLocal = filterCoeffs;
|
||||
for (i = 0; i < lengthLocal; i ++)
|
||||
{
|
||||
// unroll loop for efficiency.
|
||||
|
||||
suml1 += ptr[0] * filterCoeffsLocal[0] +
|
||||
ptr[2] * filterCoeffsLocal[2] +
|
||||
ptr[4] * filterCoeffsLocal[4] +
|
||||
ptr[6] * filterCoeffsLocal[6];
|
||||
|
||||
sumr1 += ptr[1] * filterCoeffsLocal[1] +
|
||||
ptr[3] * filterCoeffsLocal[3] +
|
||||
ptr[5] * filterCoeffsLocal[5] +
|
||||
ptr[7] * filterCoeffsLocal[7];
|
||||
|
||||
suml2 += ptr[8] * filterCoeffsLocal[0] +
|
||||
ptr[10] * filterCoeffsLocal[2] +
|
||||
ptr[12] * filterCoeffsLocal[4] +
|
||||
ptr[14] * filterCoeffsLocal[6];
|
||||
|
||||
sumr2 += ptr[9] * filterCoeffsLocal[1] +
|
||||
ptr[11] * filterCoeffsLocal[3] +
|
||||
ptr[13] * filterCoeffsLocal[5] +
|
||||
ptr[15] * filterCoeffsLocal[7];
|
||||
|
||||
ptr += 16;
|
||||
filterCoeffsLocal += 8;
|
||||
}
|
||||
dest[0] = (float)suml1;
|
||||
dest[1] = (float)sumr1;
|
||||
dest[2] = (float)suml2;
|
||||
dest[3] = (float)sumr2;
|
||||
|
||||
src += 4;
|
||||
dest += 4;
|
||||
}
|
||||
|
||||
*/
|
||||
_asm
|
||||
{
|
||||
mov eax, dword ptr dest
|
||||
mov ebx, dword ptr src
|
||||
mov edx, count
|
||||
shr edx, 1
|
||||
|
||||
loop1:
|
||||
// "outer loop" : during each round 2*2 output samples are calculated
|
||||
prefetch [ebx] // give a prefetch hint to CPU what data are to be needed soonish
|
||||
prefetch [filterCoeffsLocal] // give a prefetch hint to CPU what data are to be needed soonish
|
||||
|
||||
mov esi, ebx
|
||||
mov edi, filterCoeffsLocal
|
||||
pxor mm0, mm0
|
||||
pxor mm1, mm1
|
||||
mov ecx, lengthLocal
|
||||
|
||||
loop2:
|
||||
// "inner loop" : during each round four FIR filter taps are evaluated for 2*2 output samples
|
||||
movq mm2, [edi]
|
||||
movq mm3, mm2
|
||||
prefetch [edi + 32] // give a prefetch hint to CPU what data are to be needed soonish
|
||||
pfmul mm2, [esi]
|
||||
prefetch [esi + 32] // give a prefetch hint to CPU what data are to be needed soonish
|
||||
pfmul mm3, [esi + 8]
|
||||
|
||||
movq mm4, [edi + 8]
|
||||
movq mm5, mm4
|
||||
pfadd mm0, mm2
|
||||
pfmul mm4, [esi + 8]
|
||||
pfadd mm1, mm3
|
||||
pfmul mm5, [esi + 16]
|
||||
|
||||
movq mm2, [edi + 16]
|
||||
movq mm6, mm2
|
||||
pfadd mm0, mm4
|
||||
pfmul mm2, [esi + 16]
|
||||
pfadd mm1, mm5
|
||||
pfmul mm6, [esi + 24]
|
||||
|
||||
movq mm3, [edi + 24]
|
||||
movq mm7, mm3
|
||||
pfadd mm0, mm2
|
||||
pfmul mm3, [esi + 24]
|
||||
pfadd mm1, mm6
|
||||
pfmul mm7, [esi + 32]
|
||||
add esi, 32
|
||||
pfadd mm0, mm3
|
||||
add edi, 32
|
||||
pfadd mm1, mm7
|
||||
|
||||
dec ecx
|
||||
jnz loop2
|
||||
|
||||
movq [eax], mm0
|
||||
add ebx, 16
|
||||
movq [eax + 8], mm1
|
||||
add eax, 16
|
||||
|
||||
dec edx
|
||||
jnz loop1
|
||||
|
||||
femms
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
|
||||
#endif // ALLOW_3DNOW
|
||||
Vendored
-184
@@ -1,184 +0,0 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// FIR low-pass (anti-alias) filter with filter coefficient design routine and
|
||||
/// MMX optimization.
|
||||
///
|
||||
/// Anti-alias filter is used to prevent folding of high frequencies when
|
||||
/// transposing the sample rate with interpolation.
|
||||
///
|
||||
/// Author : Copyright (c) Olli Parviainen
|
||||
/// Author e-mail : oparviai 'at' iki.fi
|
||||
/// SoundTouch WWW: http://www.surina.net/soundtouch
|
||||
///
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Last changed : $Date: 2009-01-11 09:34:24 -0200 (dom, 11 jan 2009) $
|
||||
// File revision : $Revision: 4 $
|
||||
//
|
||||
// $Id: AAFilter.cpp 45 2009-01-11 11:34:24Z oparviai $
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// License :
|
||||
//
|
||||
// SoundTouch audio processing library
|
||||
// Copyright (c) Olli Parviainen
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Lesser General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2.1 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public
|
||||
// License along with this library; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <memory.h>
|
||||
#include <assert.h>
|
||||
#include <math.h>
|
||||
#include <stdlib.h>
|
||||
#include "AAFilter.h"
|
||||
#include "FIRFilter.h"
|
||||
|
||||
using namespace soundtouch;
|
||||
|
||||
#define PI 3.141592655357989
|
||||
#define TWOPI (2 * PI)
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Implementation of the class 'AAFilter'
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
AAFilter::AAFilter(uint len)
|
||||
{
|
||||
pFIR = FIRFilter::newInstance();
|
||||
cutoffFreq = 0.5;
|
||||
setLength(len);
|
||||
}
|
||||
|
||||
|
||||
|
||||
AAFilter::~AAFilter()
|
||||
{
|
||||
delete pFIR;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Sets new anti-alias filter cut-off edge frequency, scaled to
|
||||
// sampling frequency (nyquist frequency = 0.5).
|
||||
// The filter will cut frequencies higher than the given frequency.
|
||||
void AAFilter::setCutoffFreq(double newCutoffFreq)
|
||||
{
|
||||
cutoffFreq = newCutoffFreq;
|
||||
calculateCoeffs();
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Sets number of FIR filter taps
|
||||
void AAFilter::setLength(uint newLength)
|
||||
{
|
||||
length = newLength;
|
||||
calculateCoeffs();
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Calculates coefficients for a low-pass FIR filter using Hamming window
|
||||
void AAFilter::calculateCoeffs()
|
||||
{
|
||||
uint i;
|
||||
double cntTemp, temp, tempCoeff,h, w;
|
||||
double fc2, wc;
|
||||
double scaleCoeff, sum;
|
||||
double *work;
|
||||
SAMPLETYPE *coeffs;
|
||||
|
||||
assert(length >= 2);
|
||||
assert(length % 4 == 0);
|
||||
assert(cutoffFreq >= 0);
|
||||
assert(cutoffFreq <= 0.5);
|
||||
|
||||
work = new double[length];
|
||||
coeffs = new SAMPLETYPE[length];
|
||||
|
||||
fc2 = 2.0 * cutoffFreq;
|
||||
wc = PI * fc2;
|
||||
tempCoeff = TWOPI / (double)length;
|
||||
|
||||
sum = 0;
|
||||
for (i = 0; i < length; i ++)
|
||||
{
|
||||
cntTemp = (double)i - (double)(length / 2);
|
||||
|
||||
temp = cntTemp * wc;
|
||||
if (temp != 0)
|
||||
{
|
||||
h = fc2 * sin(temp) / temp; // sinc function
|
||||
}
|
||||
else
|
||||
{
|
||||
h = 1.0;
|
||||
}
|
||||
w = 0.54 + 0.46 * cos(tempCoeff * cntTemp); // hamming window
|
||||
|
||||
temp = w * h;
|
||||
work[i] = temp;
|
||||
|
||||
// calc net sum of coefficients
|
||||
sum += temp;
|
||||
}
|
||||
|
||||
// ensure the sum of coefficients is larger than zero
|
||||
assert(sum > 0);
|
||||
|
||||
// ensure we've really designed a lowpass filter...
|
||||
assert(work[length/2] > 0);
|
||||
assert(work[length/2 + 1] > -1e-6);
|
||||
assert(work[length/2 - 1] > -1e-6);
|
||||
|
||||
// Calculate a scaling coefficient in such a way that the result can be
|
||||
// divided by 16384
|
||||
scaleCoeff = 16384.0f / sum;
|
||||
|
||||
for (i = 0; i < length; i ++)
|
||||
{
|
||||
// scale & round to nearest integer
|
||||
temp = work[i] * scaleCoeff;
|
||||
temp += (temp >= 0) ? 0.5 : -0.5;
|
||||
// ensure no overfloods
|
||||
assert(temp >= -32768 && temp <= 32767);
|
||||
coeffs[i] = (SAMPLETYPE)temp;
|
||||
}
|
||||
|
||||
// Set coefficients. Use divide factor 14 => divide result by 2^14 = 16384
|
||||
pFIR->setCoefficients(coeffs, length, 14);
|
||||
|
||||
delete[] work;
|
||||
delete[] coeffs;
|
||||
}
|
||||
|
||||
|
||||
// Applies the filter to the given sequence of samples.
|
||||
// Note : The amount of outputted samples is by value of 'filter length'
|
||||
// smaller than the amount of input samples.
|
||||
uint AAFilter::evaluate(SAMPLETYPE *dest, const SAMPLETYPE *src, uint numSamples, uint numChannels) const
|
||||
{
|
||||
return pFIR->evaluate(dest, src, numSamples, numChannels);
|
||||
}
|
||||
|
||||
|
||||
uint AAFilter::getLength() const
|
||||
{
|
||||
return pFIR->getLength();
|
||||
}
|
||||
Vendored
-370
@@ -1,370 +0,0 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Beats-per-minute (BPM) detection routine.
|
||||
///
|
||||
/// The beat detection algorithm works as follows:
|
||||
/// - Use function 'inputSamples' to input a chunks of samples to the class for
|
||||
/// analysis. It's a good idea to enter a large sound file or stream in smallish
|
||||
/// chunks of around few kilosamples in order not to extinguish too much RAM memory.
|
||||
/// - Inputted sound data is decimated to approx 500 Hz to reduce calculation burden,
|
||||
/// which is basically ok as low (bass) frequencies mostly determine the beat rate.
|
||||
/// Simple averaging is used for anti-alias filtering because the resulting signal
|
||||
/// quality isn't of that high importance.
|
||||
/// - Decimated sound data is enveloped, i.e. the amplitude shape is detected by
|
||||
/// taking absolute value that's smoothed by sliding average. Signal levels that
|
||||
/// are below a couple of times the general RMS amplitude level are cut away to
|
||||
/// leave only notable peaks there.
|
||||
/// - Repeating sound patterns (e.g. beats) are detected by calculating short-term
|
||||
/// autocorrelation function of the enveloped signal.
|
||||
/// - After whole sound data file has been analyzed as above, the bpm level is
|
||||
/// detected by function 'getBpm' that finds the highest peak of the autocorrelation
|
||||
/// function, calculates it's precise location and converts this reading to bpm's.
|
||||
///
|
||||
/// Author : Copyright (c) Olli Parviainen
|
||||
/// Author e-mail : oparviai 'at' iki.fi
|
||||
/// SoundTouch WWW: http://www.surina.net/soundtouch
|
||||
///
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Last changed : $Date: 2012-08-30 16:45:25 -0300 (qui, 30 ago 2012) $
|
||||
// File revision : $Revision: 4 $
|
||||
//
|
||||
// $Id: BPMDetect.cpp 149 2012-08-30 19:45:25Z oparviai $
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// License :
|
||||
//
|
||||
// SoundTouch audio processing library
|
||||
// Copyright (c) Olli Parviainen
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Lesser General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2.1 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public
|
||||
// License along with this library; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <math.h>
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include "FIFOSampleBuffer.h"
|
||||
#include "PeakFinder.h"
|
||||
#include "BPMDetect.h"
|
||||
|
||||
using namespace soundtouch;
|
||||
|
||||
#define INPUT_BLOCK_SAMPLES 2048
|
||||
#define DECIMATED_BLOCK_SAMPLES 256
|
||||
|
||||
/// decay constant for calculating RMS volume sliding average approximation
|
||||
/// (time constant is about 10 sec)
|
||||
const float avgdecay = 0.99986f;
|
||||
|
||||
/// Normalization coefficient for calculating RMS sliding average approximation.
|
||||
const float avgnorm = (1 - avgdecay);
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Enable following define to create bpm analysis file:
|
||||
|
||||
// #define _CREATE_BPM_DEBUG_FILE
|
||||
|
||||
#ifdef _CREATE_BPM_DEBUG_FILE
|
||||
|
||||
#define DEBUGFILE_NAME "c:\\temp\\soundtouch-bpm-debug.txt"
|
||||
|
||||
static void _SaveDebugData(const float *data, int minpos, int maxpos, double coeff)
|
||||
{
|
||||
FILE *fptr = fopen(DEBUGFILE_NAME, "wt");
|
||||
int i;
|
||||
|
||||
if (fptr)
|
||||
{
|
||||
printf("\n\nWriting BPM debug data into file " DEBUGFILE_NAME "\n\n");
|
||||
for (i = minpos; i < maxpos; i ++)
|
||||
{
|
||||
fprintf(fptr, "%d\t%.1lf\t%f\n", i, coeff / (double)i, data[i]);
|
||||
}
|
||||
fclose(fptr);
|
||||
}
|
||||
}
|
||||
#else
|
||||
#define _SaveDebugData(a,b,c,d)
|
||||
#endif
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
BPMDetect::BPMDetect(int numChannels, int aSampleRate)
|
||||
{
|
||||
this->sampleRate = aSampleRate;
|
||||
this->channels = numChannels;
|
||||
|
||||
decimateSum = 0;
|
||||
decimateCount = 0;
|
||||
|
||||
envelopeAccu = 0;
|
||||
|
||||
// Initialize RMS volume accumulator to RMS level of 1500 (out of 32768) that's
|
||||
// safe initial RMS signal level value for song data. This value is then adapted
|
||||
// to the actual level during processing.
|
||||
#ifdef SOUNDTOUCH_INTEGER_SAMPLES
|
||||
// integer samples
|
||||
RMSVolumeAccu = (1500 * 1500) / avgnorm;
|
||||
#else
|
||||
// float samples, scaled to range [-1..+1[
|
||||
RMSVolumeAccu = (0.045f * 0.045f) / avgnorm;
|
||||
#endif
|
||||
|
||||
// choose decimation factor so that result is approx. 1000 Hz
|
||||
decimateBy = sampleRate / 1000;
|
||||
assert(decimateBy > 0);
|
||||
assert(INPUT_BLOCK_SAMPLES < decimateBy * DECIMATED_BLOCK_SAMPLES);
|
||||
|
||||
// Calculate window length & starting item according to desired min & max bpms
|
||||
windowLen = (60 * sampleRate) / (decimateBy * MIN_BPM);
|
||||
windowStart = (60 * sampleRate) / (decimateBy * MAX_BPM);
|
||||
|
||||
assert(windowLen > windowStart);
|
||||
|
||||
// allocate new working objects
|
||||
xcorr = new float[windowLen];
|
||||
memset(xcorr, 0, windowLen * sizeof(float));
|
||||
|
||||
// allocate processing buffer
|
||||
buffer = new FIFOSampleBuffer();
|
||||
// we do processing in mono mode
|
||||
buffer->setChannels(1);
|
||||
buffer->clear();
|
||||
}
|
||||
|
||||
|
||||
|
||||
BPMDetect::~BPMDetect()
|
||||
{
|
||||
delete[] xcorr;
|
||||
delete buffer;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// convert to mono, low-pass filter & decimate to about 500 Hz.
|
||||
/// return number of outputted samples.
|
||||
///
|
||||
/// Decimation is used to remove the unnecessary frequencies and thus to reduce
|
||||
/// the amount of data needed to be processed as calculating autocorrelation
|
||||
/// function is a very-very heavy operation.
|
||||
///
|
||||
/// Anti-alias filtering is done simply by averaging the samples. This is really a
|
||||
/// poor-man's anti-alias filtering, but it's not so critical in this kind of application
|
||||
/// (it'd also be difficult to design a high-quality filter with steep cut-off at very
|
||||
/// narrow band)
|
||||
int BPMDetect::decimate(SAMPLETYPE *dest, const SAMPLETYPE *src, int numsamples)
|
||||
{
|
||||
int count, outcount;
|
||||
LONG_SAMPLETYPE out;
|
||||
|
||||
assert(channels > 0);
|
||||
assert(decimateBy > 0);
|
||||
outcount = 0;
|
||||
for (count = 0; count < numsamples; count ++)
|
||||
{
|
||||
int j;
|
||||
|
||||
// convert to mono and accumulate
|
||||
for (j = 0; j < channels; j ++)
|
||||
{
|
||||
decimateSum += src[j];
|
||||
}
|
||||
src += j;
|
||||
|
||||
decimateCount ++;
|
||||
if (decimateCount >= decimateBy)
|
||||
{
|
||||
// Store every Nth sample only
|
||||
out = (LONG_SAMPLETYPE)(decimateSum / (decimateBy * channels));
|
||||
decimateSum = 0;
|
||||
decimateCount = 0;
|
||||
#ifdef SOUNDTOUCH_INTEGER_SAMPLES
|
||||
// check ranges for sure (shouldn't actually be necessary)
|
||||
if (out > 32767)
|
||||
{
|
||||
out = 32767;
|
||||
}
|
||||
else if (out < -32768)
|
||||
{
|
||||
out = -32768;
|
||||
}
|
||||
#endif // SOUNDTOUCH_INTEGER_SAMPLES
|
||||
dest[outcount] = (SAMPLETYPE)out;
|
||||
outcount ++;
|
||||
}
|
||||
}
|
||||
return outcount;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Calculates autocorrelation function of the sample history buffer
|
||||
void BPMDetect::updateXCorr(int process_samples)
|
||||
{
|
||||
int offs;
|
||||
SAMPLETYPE *pBuffer;
|
||||
|
||||
assert(buffer->numSamples() >= (uint)(process_samples + windowLen));
|
||||
|
||||
pBuffer = buffer->ptrBegin();
|
||||
for (offs = windowStart; offs < windowLen; offs ++)
|
||||
{
|
||||
LONG_SAMPLETYPE sum;
|
||||
int i;
|
||||
|
||||
sum = 0;
|
||||
for (i = 0; i < process_samples; i ++)
|
||||
{
|
||||
sum += pBuffer[i] * pBuffer[i + offs]; // scaling the sub-result shouldn't be necessary
|
||||
}
|
||||
// xcorr[offs] *= xcorr_decay; // decay 'xcorr' here with suitable coefficients
|
||||
// if it's desired that the system adapts automatically to
|
||||
// various bpms, e.g. in processing continouos music stream.
|
||||
// The 'xcorr_decay' should be a value that's smaller than but
|
||||
// close to one, and should also depend on 'process_samples' value.
|
||||
|
||||
xcorr[offs] += (float)sum;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Calculates envelope of the sample data
|
||||
void BPMDetect::calcEnvelope(SAMPLETYPE *samples, int numsamples)
|
||||
{
|
||||
const static double decay = 0.7f; // decay constant for smoothing the envelope
|
||||
const static double norm = (1 - decay);
|
||||
|
||||
int i;
|
||||
LONG_SAMPLETYPE out;
|
||||
double val;
|
||||
|
||||
for (i = 0; i < numsamples; i ++)
|
||||
{
|
||||
// calc average RMS volume
|
||||
RMSVolumeAccu *= avgdecay;
|
||||
val = (float)fabs((float)samples[i]);
|
||||
RMSVolumeAccu += val * val;
|
||||
|
||||
// cut amplitudes that are below cutoff ~2 times RMS volume
|
||||
// (we're interested in peak values, not the silent moments)
|
||||
if (val < 0.5 * sqrt(RMSVolumeAccu * avgnorm))
|
||||
{
|
||||
val = 0;
|
||||
}
|
||||
|
||||
// smooth amplitude envelope
|
||||
envelopeAccu *= decay;
|
||||
envelopeAccu += val;
|
||||
out = (LONG_SAMPLETYPE)(envelopeAccu * norm);
|
||||
|
||||
#ifdef SOUNDTOUCH_INTEGER_SAMPLES
|
||||
// cut peaks (shouldn't be necessary though)
|
||||
if (out > 32767) out = 32767;
|
||||
#endif // SOUNDTOUCH_INTEGER_SAMPLES
|
||||
samples[i] = (SAMPLETYPE)out;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void BPMDetect::inputSamples(const SAMPLETYPE *samples, int numSamples)
|
||||
{
|
||||
SAMPLETYPE decimated[DECIMATED_BLOCK_SAMPLES];
|
||||
|
||||
// iterate so that max INPUT_BLOCK_SAMPLES processed per iteration
|
||||
while (numSamples > 0)
|
||||
{
|
||||
int block;
|
||||
int decSamples;
|
||||
|
||||
block = (numSamples > INPUT_BLOCK_SAMPLES) ? INPUT_BLOCK_SAMPLES : numSamples;
|
||||
|
||||
// decimate. note that converts to mono at the same time
|
||||
decSamples = decimate(decimated, samples, block);
|
||||
samples += block * channels;
|
||||
numSamples -= block;
|
||||
|
||||
// envelope new samples and add them to buffer
|
||||
calcEnvelope(decimated, decSamples);
|
||||
buffer->putSamples(decimated, decSamples);
|
||||
}
|
||||
|
||||
// when the buffer has enought samples for processing...
|
||||
if ((int)buffer->numSamples() > windowLen)
|
||||
{
|
||||
int processLength;
|
||||
|
||||
// how many samples are processed
|
||||
processLength = (int)buffer->numSamples() - windowLen;
|
||||
|
||||
// ... calculate autocorrelations for oldest samples...
|
||||
updateXCorr(processLength);
|
||||
// ... and remove them from the buffer
|
||||
buffer->receiveSamples(processLength);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void BPMDetect::removeBias()
|
||||
{
|
||||
int i;
|
||||
float minval = 1e12f; // arbitrary large number
|
||||
|
||||
for (i = windowStart; i < windowLen; i ++)
|
||||
{
|
||||
if (xcorr[i] < minval)
|
||||
{
|
||||
minval = xcorr[i];
|
||||
}
|
||||
}
|
||||
|
||||
for (i = windowStart; i < windowLen; i ++)
|
||||
{
|
||||
xcorr[i] -= minval;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
float BPMDetect::getBpm()
|
||||
{
|
||||
double peakPos;
|
||||
double coeff;
|
||||
PeakFinder peakFinder;
|
||||
|
||||
coeff = 60.0 * ((double)sampleRate / (double)decimateBy);
|
||||
|
||||
// save bpm debug analysis data if debug data enabled
|
||||
_SaveDebugData(xcorr, windowStart, windowLen, coeff);
|
||||
|
||||
// remove bias from xcorr data
|
||||
removeBias();
|
||||
|
||||
// find peak position
|
||||
peakPos = peakFinder.detectPeak(xcorr, windowStart, windowLen);
|
||||
|
||||
assert(decimateBy != 0);
|
||||
if (peakPos < 1e-9) return 0.0; // detection failed.
|
||||
|
||||
// calculate BPM
|
||||
return (float) (coeff / peakPos);
|
||||
}
|
||||
Vendored
-164
@@ -1,164 +0,0 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Beats-per-minute (BPM) detection routine.
|
||||
///
|
||||
/// The beat detection algorithm works as follows:
|
||||
/// - Use function 'inputSamples' to input a chunks of samples to the class for
|
||||
/// analysis. It's a good idea to enter a large sound file or stream in smallish
|
||||
/// chunks of around few kilosamples in order not to extinguish too much RAM memory.
|
||||
/// - Input sound data is decimated to approx 500 Hz to reduce calculation burden,
|
||||
/// which is basically ok as low (bass) frequencies mostly determine the beat rate.
|
||||
/// Simple averaging is used for anti-alias filtering because the resulting signal
|
||||
/// quality isn't of that high importance.
|
||||
/// - Decimated sound data is enveloped, i.e. the amplitude shape is detected by
|
||||
/// taking absolute value that's smoothed by sliding average. Signal levels that
|
||||
/// are below a couple of times the general RMS amplitude level are cut away to
|
||||
/// leave only notable peaks there.
|
||||
/// - Repeating sound patterns (e.g. beats) are detected by calculating short-term
|
||||
/// autocorrelation function of the enveloped signal.
|
||||
/// - After whole sound data file has been analyzed as above, the bpm level is
|
||||
/// detected by function 'getBpm' that finds the highest peak of the autocorrelation
|
||||
/// function, calculates it's precise location and converts this reading to bpm's.
|
||||
///
|
||||
/// Author : Copyright (c) Olli Parviainen
|
||||
/// Author e-mail : oparviai 'at' iki.fi
|
||||
/// SoundTouch WWW: http://www.surina.net/soundtouch
|
||||
///
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Last changed : $Date: 2012-08-30 16:53:44 -0300 (qui, 30 ago 2012) $
|
||||
// File revision : $Revision: 4 $
|
||||
//
|
||||
// $Id: BPMDetect.h 150 2012-08-30 19:53:44Z oparviai $
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// License :
|
||||
//
|
||||
// SoundTouch audio processing library
|
||||
// Copyright (c) Olli Parviainen
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Lesser General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2.1 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public
|
||||
// License along with this library; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef _BPMDetect_H_
|
||||
#define _BPMDetect_H_
|
||||
|
||||
#include "STTypes.h"
|
||||
#include "FIFOSampleBuffer.h"
|
||||
|
||||
namespace soundtouch
|
||||
{
|
||||
|
||||
/// Minimum allowed BPM rate. Used to restrict accepted result above a reasonable limit.
|
||||
#define MIN_BPM 29
|
||||
|
||||
/// Maximum allowed BPM rate. Used to restrict accepted result below a reasonable limit.
|
||||
#define MAX_BPM 200
|
||||
|
||||
|
||||
/// Class for calculating BPM rate for audio data.
|
||||
class BPMDetect
|
||||
{
|
||||
protected:
|
||||
/// Auto-correlation accumulator bins.
|
||||
float *xcorr;
|
||||
|
||||
/// Amplitude envelope sliding average approximation level accumulator
|
||||
double envelopeAccu;
|
||||
|
||||
/// RMS volume sliding average approximation level accumulator
|
||||
double RMSVolumeAccu;
|
||||
|
||||
/// Sample average counter.
|
||||
int decimateCount;
|
||||
|
||||
/// Sample average accumulator for FIFO-like decimation.
|
||||
soundtouch::LONG_SAMPLETYPE decimateSum;
|
||||
|
||||
/// Decimate sound by this coefficient to reach approx. 500 Hz.
|
||||
int decimateBy;
|
||||
|
||||
/// Auto-correlation window length
|
||||
int windowLen;
|
||||
|
||||
/// Number of channels (1 = mono, 2 = stereo)
|
||||
int channels;
|
||||
|
||||
/// sample rate
|
||||
int sampleRate;
|
||||
|
||||
/// Beginning of auto-correlation window: Autocorrelation isn't being updated for
|
||||
/// the first these many correlation bins.
|
||||
int windowStart;
|
||||
|
||||
/// FIFO-buffer for decimated processing samples.
|
||||
soundtouch::FIFOSampleBuffer *buffer;
|
||||
|
||||
/// Updates auto-correlation function for given number of decimated samples that
|
||||
/// are read from the internal 'buffer' pipe (samples aren't removed from the pipe
|
||||
/// though).
|
||||
void updateXCorr(int process_samples /// How many samples are processed.
|
||||
);
|
||||
|
||||
/// Decimates samples to approx. 500 Hz.
|
||||
///
|
||||
/// \return Number of output samples.
|
||||
int decimate(soundtouch::SAMPLETYPE *dest, ///< Destination buffer
|
||||
const soundtouch::SAMPLETYPE *src, ///< Source sample buffer
|
||||
int numsamples ///< Number of source samples.
|
||||
);
|
||||
|
||||
/// Calculates amplitude envelope for the buffer of samples.
|
||||
/// Result is output to 'samples'.
|
||||
void calcEnvelope(soundtouch::SAMPLETYPE *samples, ///< Pointer to input/output data buffer
|
||||
int numsamples ///< Number of samples in buffer
|
||||
);
|
||||
|
||||
/// remove constant bias from xcorr data
|
||||
void removeBias();
|
||||
|
||||
public:
|
||||
/// Constructor.
|
||||
BPMDetect(int numChannels, ///< Number of channels in sample data.
|
||||
int sampleRate ///< Sample rate in Hz.
|
||||
);
|
||||
|
||||
/// Destructor.
|
||||
virtual ~BPMDetect();
|
||||
|
||||
/// Inputs a block of samples for analyzing: Envelopes the samples and then
|
||||
/// updates the autocorrelation estimation. When whole song data has been input
|
||||
/// in smaller blocks using this function, read the resulting bpm with 'getBpm'
|
||||
/// function.
|
||||
///
|
||||
/// Notice that data in 'samples' array can be disrupted in processing.
|
||||
void inputSamples(const soundtouch::SAMPLETYPE *samples, ///< Pointer to input/working data buffer
|
||||
int numSamples ///< Number of samples in buffer
|
||||
);
|
||||
|
||||
|
||||
/// Analyzes the results and returns the BPM rate. Use this function to read result
|
||||
/// after whole song data has been input to the class by consecutive calls of
|
||||
/// 'inputSamples' function.
|
||||
///
|
||||
/// \return Beats-per-minute rate, or zero if detection failed.
|
||||
float getBpm();
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // _BPMDetect_H_
|
||||
Vendored
-67
@@ -1,67 +0,0 @@
|
||||
# SoundTouch library
|
||||
|
||||
# library name
|
||||
set(Output pcsx2_SoundTouch)
|
||||
|
||||
set(CommonFlags
|
||||
-march=athlon-xp
|
||||
-march=prescott
|
||||
)
|
||||
|
||||
set(OptimizationFlags
|
||||
-Os
|
||||
-W
|
||||
)
|
||||
|
||||
# Debug - Build
|
||||
if(CMAKE_BUILD_TYPE STREQUAL Debug)
|
||||
# add defines
|
||||
add_definitions(${CommonFlags} -g)
|
||||
endif(CMAKE_BUILD_TYPE STREQUAL Debug)
|
||||
|
||||
# Devel - Build
|
||||
if(CMAKE_BUILD_TYPE STREQUAL Devel)
|
||||
# add defines
|
||||
add_definitions(${CommonFlags} ${OptimizationFlags})
|
||||
endif(CMAKE_BUILD_TYPE STREQUAL Devel)
|
||||
|
||||
# Release - Build
|
||||
if(CMAKE_BUILD_TYPE STREQUAL Release)
|
||||
# add defines
|
||||
add_definitions(${CommonFlags} ${OptimizationFlags})
|
||||
endif(CMAKE_BUILD_TYPE STREQUAL Release)
|
||||
|
||||
# variable with all sources of this library
|
||||
set(SoundTouchSources
|
||||
AAFilter.cpp
|
||||
FIFOSampleBuffer.cpp
|
||||
FIRFilter.cpp
|
||||
RateTransposer.cpp
|
||||
SoundTouch.cpp
|
||||
TDStretch.cpp
|
||||
# WavFile.cpp # directly include in spu2x
|
||||
cpu_detect_x86_gcc.cpp
|
||||
mmx_optimized.cpp
|
||||
sse_optimized.cpp)
|
||||
|
||||
# variable with all headers of this library
|
||||
set(SoundTouchHeaders
|
||||
AAFilter.h
|
||||
BPMDetect.h
|
||||
FIFOSampleBuffer.h
|
||||
FIFOSamplePipe.h
|
||||
FIRFilter.h
|
||||
RateTransposer.h
|
||||
STTypes.h
|
||||
SoundTouch.h
|
||||
TDStretch.h
|
||||
# WavFile.h # directly include in spu2x
|
||||
cpu_detect.h)
|
||||
|
||||
# add library
|
||||
add_library(${Output} STATIC ${SoundTouchSources} ${SoundTouchHeaders})
|
||||
|
||||
# User flags options
|
||||
if(NOT USER_CMAKE_LD_FLAGS STREQUAL "")
|
||||
target_link_libraries(${Output} "${USER_CMAKE_LD_FLAGS}")
|
||||
endif(NOT USER_CMAKE_LD_FLAGS STREQUAL "")
|
||||
Vendored
-259
@@ -1,259 +0,0 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// General FIR digital filter routines with MMX optimization.
|
||||
///
|
||||
/// Note : MMX optimized functions reside in a separate, platform-specific file,
|
||||
/// e.g. 'mmx_win.cpp' or 'mmx_gcc.cpp'
|
||||
///
|
||||
/// Author : Copyright (c) Olli Parviainen
|
||||
/// Author e-mail : oparviai 'at' iki.fi
|
||||
/// SoundTouch WWW: http://www.surina.net/soundtouch
|
||||
///
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Last changed : $Date: 2011-09-02 15:56:11 -0300 (sex, 02 set 2011) $
|
||||
// File revision : $Revision: 4 $
|
||||
//
|
||||
// $Id: FIRFilter.cpp 131 2011-09-02 18:56:11Z oparviai $
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// License :
|
||||
//
|
||||
// SoundTouch audio processing library
|
||||
// Copyright (c) Olli Parviainen
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Lesser General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2.1 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public
|
||||
// License along with this library; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <memory.h>
|
||||
#include <assert.h>
|
||||
#include <math.h>
|
||||
#include <stdlib.h>
|
||||
#include "FIRFilter.h"
|
||||
#include "cpu_detect.h"
|
||||
|
||||
using namespace soundtouch;
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Implementation of the class 'FIRFilter'
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
FIRFilter::FIRFilter()
|
||||
{
|
||||
resultDivFactor = 0;
|
||||
resultDivider = 0;
|
||||
length = 0;
|
||||
lengthDiv8 = 0;
|
||||
filterCoeffs = NULL;
|
||||
}
|
||||
|
||||
|
||||
FIRFilter::~FIRFilter()
|
||||
{
|
||||
delete[] filterCoeffs;
|
||||
}
|
||||
|
||||
// Usual C-version of the filter routine for stereo sound
|
||||
uint FIRFilter::evaluateFilterStereo(SAMPLETYPE *dest, const SAMPLETYPE *src, uint numSamples) const
|
||||
{
|
||||
uint i, j, end;
|
||||
LONG_SAMPLETYPE suml, sumr;
|
||||
#ifdef SOUNDTOUCH_FLOAT_SAMPLES
|
||||
// when using floating point samples, use a scaler instead of a divider
|
||||
// because division is much slower operation than multiplying.
|
||||
double dScaler = 1.0 / (double)resultDivider;
|
||||
#endif
|
||||
|
||||
assert(length != 0);
|
||||
assert(src != NULL);
|
||||
assert(dest != NULL);
|
||||
assert(filterCoeffs != NULL);
|
||||
|
||||
end = 2 * (numSamples - length);
|
||||
|
||||
for (j = 0; j < end; j += 2)
|
||||
{
|
||||
const SAMPLETYPE *ptr;
|
||||
|
||||
suml = sumr = 0;
|
||||
ptr = src + j;
|
||||
|
||||
for (i = 0; i < length; i += 4)
|
||||
{
|
||||
// loop is unrolled by factor of 4 here for efficiency
|
||||
suml += ptr[2 * i + 0] * filterCoeffs[i + 0] +
|
||||
ptr[2 * i + 2] * filterCoeffs[i + 1] +
|
||||
ptr[2 * i + 4] * filterCoeffs[i + 2] +
|
||||
ptr[2 * i + 6] * filterCoeffs[i + 3];
|
||||
sumr += ptr[2 * i + 1] * filterCoeffs[i + 0] +
|
||||
ptr[2 * i + 3] * filterCoeffs[i + 1] +
|
||||
ptr[2 * i + 5] * filterCoeffs[i + 2] +
|
||||
ptr[2 * i + 7] * filterCoeffs[i + 3];
|
||||
}
|
||||
|
||||
#ifdef SOUNDTOUCH_INTEGER_SAMPLES
|
||||
suml >>= resultDivFactor;
|
||||
sumr >>= resultDivFactor;
|
||||
// saturate to 16 bit integer limits
|
||||
suml = (suml < -32768) ? -32768 : (suml > 32767) ? 32767 : suml;
|
||||
// saturate to 16 bit integer limits
|
||||
sumr = (sumr < -32768) ? -32768 : (sumr > 32767) ? 32767 : sumr;
|
||||
#else
|
||||
suml *= dScaler;
|
||||
sumr *= dScaler;
|
||||
#endif // SOUNDTOUCH_INTEGER_SAMPLES
|
||||
dest[j] = (SAMPLETYPE)suml;
|
||||
dest[j + 1] = (SAMPLETYPE)sumr;
|
||||
}
|
||||
return numSamples - length;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// Usual C-version of the filter routine for mono sound
|
||||
uint FIRFilter::evaluateFilterMono(SAMPLETYPE *dest, const SAMPLETYPE *src, uint numSamples) const
|
||||
{
|
||||
uint i, j, end;
|
||||
LONG_SAMPLETYPE sum;
|
||||
#ifdef SOUNDTOUCH_FLOAT_SAMPLES
|
||||
// when using floating point samples, use a scaler instead of a divider
|
||||
// because division is much slower operation than multiplying.
|
||||
double dScaler = 1.0 / (double)resultDivider;
|
||||
#endif
|
||||
|
||||
|
||||
assert(length != 0);
|
||||
|
||||
end = numSamples - length;
|
||||
for (j = 0; j < end; j ++)
|
||||
{
|
||||
sum = 0;
|
||||
for (i = 0; i < length; i += 4)
|
||||
{
|
||||
// loop is unrolled by factor of 4 here for efficiency
|
||||
sum += src[i + 0] * filterCoeffs[i + 0] +
|
||||
src[i + 1] * filterCoeffs[i + 1] +
|
||||
src[i + 2] * filterCoeffs[i + 2] +
|
||||
src[i + 3] * filterCoeffs[i + 3];
|
||||
}
|
||||
#ifdef SOUNDTOUCH_INTEGER_SAMPLES
|
||||
sum >>= resultDivFactor;
|
||||
// saturate to 16 bit integer limits
|
||||
sum = (sum < -32768) ? -32768 : (sum > 32767) ? 32767 : sum;
|
||||
#else
|
||||
sum *= dScaler;
|
||||
#endif // SOUNDTOUCH_INTEGER_SAMPLES
|
||||
dest[j] = (SAMPLETYPE)sum;
|
||||
src ++;
|
||||
}
|
||||
return end;
|
||||
}
|
||||
|
||||
|
||||
// Set filter coeffiecients and length.
|
||||
//
|
||||
// Throws an exception if filter length isn't divisible by 8
|
||||
void FIRFilter::setCoefficients(const SAMPLETYPE *coeffs, uint newLength, uint uResultDivFactor)
|
||||
{
|
||||
assert(newLength > 0);
|
||||
if (newLength % 8) ST_THROW_RT_ERROR("FIR filter length not divisible by 8");
|
||||
|
||||
lengthDiv8 = newLength / 8;
|
||||
length = lengthDiv8 * 8;
|
||||
assert(length == newLength);
|
||||
|
||||
resultDivFactor = uResultDivFactor;
|
||||
resultDivider = (SAMPLETYPE)::pow(2.0, (int)resultDivFactor);
|
||||
|
||||
delete[] filterCoeffs;
|
||||
filterCoeffs = new SAMPLETYPE[length];
|
||||
memcpy(filterCoeffs, coeffs, length * sizeof(SAMPLETYPE));
|
||||
}
|
||||
|
||||
|
||||
uint FIRFilter::getLength() const
|
||||
{
|
||||
return length;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Applies the filter to the given sequence of samples.
|
||||
//
|
||||
// Note : The amount of outputted samples is by value of 'filter_length'
|
||||
// smaller than the amount of input samples.
|
||||
uint FIRFilter::evaluate(SAMPLETYPE *dest, const SAMPLETYPE *src, uint numSamples, uint numChannels) const
|
||||
{
|
||||
assert(numChannels == 1 || numChannels == 2);
|
||||
|
||||
assert(length > 0);
|
||||
assert(lengthDiv8 * 8 == length);
|
||||
if (numSamples < length) return 0;
|
||||
if (numChannels == 2)
|
||||
{
|
||||
return evaluateFilterStereo(dest, src, numSamples);
|
||||
} else {
|
||||
return evaluateFilterMono(dest, src, numSamples);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Operator 'new' is overloaded so that it automatically creates a suitable instance
|
||||
// depending on if we've a MMX-capable CPU available or not.
|
||||
void * FIRFilter::operator new(size_t s)
|
||||
{
|
||||
// Notice! don't use "new FIRFilter" directly, use "newInstance" to create a new instance instead!
|
||||
ST_THROW_RT_ERROR("Error in FIRFilter::new: Don't use 'new FIRFilter', use 'newInstance' member instead!");
|
||||
return newInstance();
|
||||
}
|
||||
|
||||
|
||||
FIRFilter * FIRFilter::newInstance()
|
||||
{
|
||||
uint uExtensions;
|
||||
|
||||
uExtensions = detectCPUextensions();
|
||||
|
||||
// Check if MMX/SSE instruction set extensions supported by CPU
|
||||
|
||||
#ifdef SOUNDTOUCH_ALLOW_MMX
|
||||
// MMX routines available only with integer sample types
|
||||
if (uExtensions & SUPPORT_MMX)
|
||||
{
|
||||
return ::new FIRFilterMMX;
|
||||
}
|
||||
else
|
||||
#endif // SOUNDTOUCH_ALLOW_MMX
|
||||
|
||||
#ifdef SOUNDTOUCH_ALLOW_SSE
|
||||
if (uExtensions & SUPPORT_SSE)
|
||||
{
|
||||
// SSE support
|
||||
return ::new FIRFilterSSE;
|
||||
}
|
||||
else
|
||||
#endif // SOUNDTOUCH_ALLOW_SSE
|
||||
|
||||
{
|
||||
// ISA optimizations not supported, use plain C version
|
||||
return ::new FIRFilter;
|
||||
}
|
||||
}
|
||||
Vendored
-71
@@ -1,71 +0,0 @@
|
||||
## Process this file with automake to create Makefile.in
|
||||
##
|
||||
## $Id: Makefile.am 138 2012-04-01 20:00:09Z oparviai $
|
||||
##
|
||||
## This file is part of SoundTouch, an audio processing library for pitch/time adjustments
|
||||
##
|
||||
## SoundTouch is free software; you can redistribute it and/or modify it under the
|
||||
## terms of the GNU General Public License as published by the Free Software
|
||||
## Foundation; either version 2 of the License, or (at your option) any later
|
||||
## version.
|
||||
##
|
||||
## SoundTouch is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
## WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||
## A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
##
|
||||
## You should have received a copy of the GNU General Public License along with
|
||||
## this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
||||
## Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
|
||||
|
||||
include $(top_srcdir)/config/am_include.mk
|
||||
|
||||
|
||||
# set to something if you want other stuff to be included in the distribution tarball
|
||||
EXTRA_DIST=SoundTouch.dsp SoundTouch.dsw SoundTouch.sln SoundTouch.vcproj
|
||||
|
||||
noinst_HEADERS=AAFilter.h cpu_detect.h cpu_detect_x86.cpp FIRFilter.h RateTransposer.h TDStretch.h PeakFinder.h
|
||||
|
||||
lib_LTLIBRARIES=libSoundTouch.la
|
||||
#
|
||||
libSoundTouch_la_SOURCES=AAFilter.cpp FIRFilter.cpp FIFOSampleBuffer.cpp RateTransposer.cpp SoundTouch.cpp TDStretch.cpp cpu_detect_x86.cpp BPMDetect.cpp PeakFinder.cpp
|
||||
|
||||
|
||||
# Compiler flags
|
||||
AM_CXXFLAGS=-O3 -fcheck-new -I../../include
|
||||
|
||||
# Compile the files that need MMX and SSE individually.
|
||||
libSoundTouch_la_LIBADD=libSoundTouchMMX.la libSoundTouchSSE.la
|
||||
noinst_LTLIBRARIES=libSoundTouchMMX.la libSoundTouchSSE.la
|
||||
libSoundTouchMMX_la_SOURCES=mmx_optimized.cpp
|
||||
libSoundTouchSSE_la_SOURCES=sse_optimized.cpp
|
||||
|
||||
# We enable optimizations by default.
|
||||
# If MMX is supported compile with -mmmx.
|
||||
# Do not assume -msse is also supported.
|
||||
if HAVE_MMX
|
||||
libSoundTouchMMX_la_CXXFLAGS = -mmmx $(AM_CXXFLAGS)
|
||||
else
|
||||
libSoundTouchMMX_la_CXXFLAGS = $(AM_CXXFLAGS)
|
||||
endif
|
||||
|
||||
# We enable optimizations by default.
|
||||
# If SSE is supported compile with -msse.
|
||||
if HAVE_SSE
|
||||
libSoundTouchSSE_la_CXXFLAGS = -msse $(AM_CXXFLAGS)
|
||||
else
|
||||
libSoundTouchSSE_la_CXXFLAGS = $(AM_CXXFLAGS)
|
||||
endif
|
||||
|
||||
# Let the user disable optimizations if he wishes to.
|
||||
if !X86_OPTIMIZATIONS
|
||||
libSoundTouchMMX_la_CXXFLAGS = $(AM_CXXFLAGS)
|
||||
libSoundTouchSSE_la_CXXFLAGS = $(AM_CXXFLAGS)
|
||||
endif
|
||||
|
||||
|
||||
# other linking flags to add
|
||||
# noinst_LTLIBRARIES = libSoundTouchOpt.la
|
||||
# libSoundTouch_la_LIBADD = libSoundTouchOpt.la
|
||||
# libSoundTouchOpt_la_SOURCES = mmx_optimized.cpp sse_optimized.cpp
|
||||
# libSoundTouchOpt_la_CXXFLAGS = -O3 -msse -fcheck-new -I../../include
|
||||
Vendored
-777
@@ -1,777 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<head>
|
||||
<title>SoundTouch library README</title>
|
||||
<meta http-equiv="Content-Type"
|
||||
content="text/html; charset=windows-1252">
|
||||
<meta http-equiv="Content-Language" content="en-us">
|
||||
<meta name="author" content="Olli Parviainen">
|
||||
<meta name="description"
|
||||
content="Readme file for SoundTouch audio processing library">
|
||||
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
|
||||
<meta name="ProgId" content="FrontPage.Editor.Document">
|
||||
<style> <!-- .normal { font-family: Arial }
|
||||
--></style>
|
||||
</head>
|
||||
<body class="normal">
|
||||
<hr>
|
||||
<h1>SoundTouch audio processing library v1.7.1</h1>
|
||||
<p class="normal">SoundTouch library Copyright © Olli Parviainen 2001-2012 </p>
|
||||
<hr>
|
||||
<h2>1. Introduction </h2>
|
||||
<p>SoundTouch is an open-source audio processing library that allows
|
||||
changing the sound tempo, pitch and playback rate parameters
|
||||
independently from each other, i.e.:</p>
|
||||
<ul>
|
||||
<li> Sound tempo can be increased or decreased while maintaining the
|
||||
original pitch </li>
|
||||
<li> Sound pitch can be increased or decreased while maintaining the
|
||||
original tempo </li>
|
||||
<li> Change playback rate that affects both tempo and pitch at the
|
||||
same time </li>
|
||||
<li> Choose any combination of tempo/pitch/rate</li>
|
||||
</ul>
|
||||
<h3>1.1 Contact information </h3>
|
||||
<p>Author email: oparviai 'at' iki.fi </p>
|
||||
<p>SoundTouch WWW page: <a href="http://www.surina.net/soundtouch">http://www.surina.net/soundtouch</a></p>
|
||||
<hr>
|
||||
<h2>2. Compiling SoundTouch</h2>
|
||||
<p>Before compiling, notice that you can choose the sample data format
|
||||
if it's desirable to use floating point sample data instead of 16bit
|
||||
integers. See section "sample data format" for more information.</p>
|
||||
<h3>2.1. Building in Microsoft Windows</h3>
|
||||
<p>Project files for Microsoft Visual C++ 6.0 and Visual C++ .NET are
|
||||
supplied with the source code package.<br>
|
||||
</p>
|
||||
<p> Please notice that SoundTouch library uses processor-specific
|
||||
optimizations for Pentium III and AMD processors. Visual Studio .NET
|
||||
and later versions supports the required instructions by default, but
|
||||
Visual Studio 6.0 requires a processor pack upgrade to be installed in
|
||||
order to support these optimizations. The processor pack upgrade can be
|
||||
downloaded from Microsoft site at this URL:</p>
|
||||
<p><a href="http://msdn.microsoft.com/en-us/vstudio/aa718349.aspx">http://msdn.microsoft.com/en-us/vstudio/aa718349.aspx</a></p>
|
||||
<p>If the above URL is unavailable or removed, go to <a
|
||||
href="http://msdn.microsoft.com/"> http://msdn.microsoft.com</a> and
|
||||
perform a search with keywords "processor pack". </p>
|
||||
<p>To build the binaries with Visual C++ compiler, either run
|
||||
"make-win.bat" script, or open the appropriate project files in source
|
||||
code directories with Visual Studio. The final executable will appear
|
||||
under the "SoundTouch\bin" directory. If using the Visual Studio IDE
|
||||
instead of the make-win.bat script, directories bin and lib may need to
|
||||
be created manually to the SoundTouch package root for the final
|
||||
executables. The make-win.bat script creates these directories
|
||||
automatically. </p>
|
||||
<h3>2.2. Building in Gnu platforms</h3>
|
||||
<p>The SoundTouch library compiles in practically any platform
|
||||
supporting GNU compiler (GCC) tools. SoundTouch requires GCC version 4.3 or later.</p>
|
||||
<p>To build and install the binaries, run the following commands in
|
||||
/soundtouch directory:</p>
|
||||
<table border="0" cellpadding="0" cellspacing="4">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="vertical-align: top;">
|
||||
<pre>./bootstrap -</pre>
|
||||
</td>
|
||||
<td style="vertical-align: top;">Creates "configure" file with
|
||||
local autoconf/automake toolset.<br>
|
||||
</td>
|
||||
</tr>
|
||||
<tr valign="top">
|
||||
<td>
|
||||
<pre>./configure -</pre>
|
||||
</td>
|
||||
<td>
|
||||
<p>Configures the SoundTouch package for the local environment.
|
||||
Notice that "configure" file is not available before running the
|
||||
"./bootstrap" command as above.<br>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr valign="top">
|
||||
<td>
|
||||
<pre>make -</pre>
|
||||
</td>
|
||||
<td>
|
||||
<p>Builds the SoundTouch library & SoundStretch utility.</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr valign="top">
|
||||
<td>
|
||||
<pre>make install -</pre>
|
||||
</td>
|
||||
<td>
|
||||
<p>Installs the SoundTouch & BPM libraries to <b>/usr/local/lib</b>
|
||||
and SoundStretch utility to <b>/usr/local/bin</b>. Please notice that
|
||||
'root' privileges may be required to install the binaries to the
|
||||
destination locations.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h4><b>2.2.1 Required GNU tools</b> </h4>
|
||||
<p> <span style="font-weight: bold;">Bash shell</span>, <span
|
||||
style="font-weight: bold;">GNU C++ compiler</span>, <span
|
||||
style="font-weight: bold;">libtool</span>, <span
|
||||
style="font-weight: bold;">autoconf</span> and <span
|
||||
style="font-weight: bold;">automake</span> tools
|
||||
are required for compiling the SoundTouch library. These are usually
|
||||
included with the GNU/Linux distribution, but if not, install these
|
||||
packages first. For example, Ubuntu Linux can acquire and install
|
||||
these with the following command:</p>
|
||||
<pre><b>sudo apt-get install automake autoconf libtool build-essential</b></pre>
|
||||
<h4><b>2.2.2 Problems with GCC compiler compatibility</b></h4>
|
||||
<p>At the release time the SoundTouch package has been tested to
|
||||
compile in GNU/Linux platform. However, If you have problems getting the
|
||||
SoundTouch library compiled, try disabling optimizations that are specific for
|
||||
x86 processors by running <b>./configure</b> script with switch
|
||||
<blockquote>
|
||||
<pre>--enable-x86-optimizations=no</pre>
|
||||
</blockquote>
|
||||
|
||||
Alternatively, if you don't use GNU Configure system, edit file "include/STTypes.h"
|
||||
directly and remove the following definition:<blockquote>
|
||||
<pre>#define SOUNDTOUCH_ALLOW_X86_OPTIMIZATIONS 1</pre>
|
||||
</blockquote>
|
||||
|
||||
<h4><b>2.2.3 Compiling Shared Library / DLL version</b></h4>
|
||||
<p>
|
||||
The GNU compilation does not automatically create a shared-library version of
|
||||
SoundTouch (.so or .dll). If such is desired, then you can create it as follows
|
||||
after running the usual compilation:</p>
|
||||
<blockquote>
|
||||
<pre>g++ -shared -static -DDLL_EXPORTS -I../../include -o SoundTouch.dll \
|
||||
SoundTouchDLL.cpp ../SoundTouch/.libs/libSoundTouch.a
|
||||
sstrip SoundTouch.dll</pre>
|
||||
</blockquote>
|
||||
|
||||
<h3>2.1. Building in Android</h3>
|
||||
<p>Android compilation instructions are within the
|
||||
source code package, see file "<b>source/Android-lib/README-SoundTouch-Android.html</b>"
|
||||
in the package.</p>
|
||||
|
||||
<hr>
|
||||
<h2>3. About implementation & Usage tips <h3>3.1. Supported sample data formats</h3>
|
||||
<p>The sample data format can be chosen between 16bit signed integer
|
||||
and 32bit floating point values, the default is 32bit floating point. </p>
|
||||
<p> In Windows environment, the sample data format is chosen in file
|
||||
"STTypes.h" by choosing one of the following defines:</p>
|
||||
<ul>
|
||||
<li> <span style="font-weight: bold;">#define
|
||||
SOUNDTOUCH_INTEGER_SAMPLES</span> for 16bit signed integer </li>
|
||||
<li> <span style="font-weight: bold;">#define </span><span
|
||||
style="font-weight: bold;">SOUNDTOUCH_</span><span
|
||||
style="font-weight: bold;">FLOAT_SAMPLES</span> for 32bit floating
|
||||
point</li>
|
||||
</ul>
|
||||
<p> In GNU environment, the floating sample format is used by default,
|
||||
but integer sample format can be chosen by giving the following switch
|
||||
to the configure script: </p>
|
||||
<blockquote>
|
||||
<pre>./configure --enable-integer-samples</pre>
|
||||
</blockquote>
|
||||
<p>The sample data can have either single (mono) or double (stereo)
|
||||
audio channel. Stereo data is interleaved so that every other data
|
||||
value is for left channel and every second for right channel. Notice
|
||||
that while it'd be possible in theory to process stereo sound as two
|
||||
separate mono channels, this isn't recommended because processing the
|
||||
channels separately would result in losing the phase coherency between
|
||||
the channels, which consequently would ruin the stereo effect.</p>
|
||||
<p>Sample rates between 8000-48000H are supported.</p>
|
||||
<h3>3.2. Processing latency</h3>
|
||||
<p>The processing and latency constraints of the SoundTouch library are:</p>
|
||||
<ul>
|
||||
<li> Input/output processing latency for the SoundTouch processor is
|
||||
around 100 ms. This is when time-stretching is used. If the rate
|
||||
transposing effect alone is used, the latency requirement is much
|
||||
shorter, see section 'About algorithms'. </li>
|
||||
<li> Processing CD-quality sound (16bit stereo sound with 44100H
|
||||
sample rate) in real-time or faster is possible starting from
|
||||
processors equivalent to Intel Pentium 133Mh or better, if using the
|
||||
"quick" processing algorithm. If not using the "quick" mode or if
|
||||
floating point sample data are being used, several times more CPU power
|
||||
is typically required.</li>
|
||||
</ul>
|
||||
<h3>3.3. About algorithms</h3>
|
||||
<p>SoundTouch provides three seemingly independent effects: tempo,
|
||||
pitch and playback rate control. These three controls are implemented
|
||||
as combination of two primary effects, <em>sample rate transposing</em>
|
||||
and <em>time-stretching</em>.</p>
|
||||
<p><em>Sample rate transposing</em> affects both the audio stream
|
||||
duration and pitch. It's implemented simply by converting the original
|
||||
audio sample stream to the desired duration by interpolating from
|
||||
the original audio samples. In SoundTouch, linear interpolation with
|
||||
anti-alias filtering is used. Theoretically a higher-order
|
||||
interpolation provide better result than 1st order linear
|
||||
interpolation, but in audio application linear interpolation together
|
||||
with anti-alias filtering performs subjectively about as well as
|
||||
higher-order filtering would.</p>
|
||||
<p><em>Time-stretching </em>means changing the audio stream duration
|
||||
without affecting it's pitch. SoundTouch uses WSOLA-like
|
||||
time-stretching routines that operate in the time domain. Compared to
|
||||
sample rate transposing, time-stretching is a much heavier operation
|
||||
and also requires a longer processing "window" of sound samples used by
|
||||
the processing algorithm, thus increasing the algorithm input/output
|
||||
latency. Typical i/o latency for the SoundTouch time-stretch algorithm
|
||||
is around 100 ms.</p>
|
||||
<p>Sample rate transposing and time-stretching are then used together
|
||||
to produce the tempo, pitch and rate controls:</p>
|
||||
<ul>
|
||||
<li> <strong>'Tempo'</strong> control is implemented purely by
|
||||
time-stretching. </li>
|
||||
<li> <strong>'Rate</strong>' control is implemented purely by sample
|
||||
rate transposing. </li>
|
||||
<li> <strong>'Pitch</strong>' control is implemented as a
|
||||
combination of time-stretching and sample rate transposing. For
|
||||
example, to increase pitch the audio stream is first time-stretched to
|
||||
longer duration (without affecting pitch) and then transposed back to
|
||||
original duration by sample rate transposing, which simultaneously
|
||||
reduces duration and increases pitch. The result is original duration
|
||||
but increased pitch.</li>
|
||||
</ul>
|
||||
<h3>3.4 Tuning the algorithm parameters</h3>
|
||||
<p>The time-stretch algorithm has few parameters that can be tuned to
|
||||
optimize sound quality for certain application. The current default
|
||||
parameters have been chosen by iterative if-then analysis (read: "trial
|
||||
and error") to obtain best subjective sound quality in pop/rock music
|
||||
processing, but in applications processing different kind of sound the
|
||||
default parameter set may result into a sub-optimal result.</p>
|
||||
<p>The time-stretch algorithm default parameter values are set by the
|
||||
following #defines in file "TDStretch.h":</p>
|
||||
<blockquote>
|
||||
<pre>#define DEFAULT_SEQUENCE_MS AUTOMATIC<br>#define DEFAULT_SEEKWINDOW_MS AUTOMATIC<br>#define DEFAULT_OVERLAP_MS 8</pre>
|
||||
</blockquote>
|
||||
<p>These parameters affect to the time-stretch algorithm as follows:</p>
|
||||
<ul>
|
||||
<li> <strong>DEFAULT_SEQUENCE_MS</strong>: This is the default
|
||||
length of a single processing sequence in milliseconds which determines
|
||||
the how the original sound is chopped in the time-stretch algorithm.
|
||||
Larger values mean fewer sequences are used in processing. In principle
|
||||
a larger value sounds better when slowing down the tempo, but worse
|
||||
when increasing the tempo and vice versa. <br>
|
||||
<br>
|
||||
By default, this setting value is calculated automatically according to
|
||||
tempo value.<br>
|
||||
</li>
|
||||
<li> <strong>DEFAULT_SEEKWINDOW_MS</strong>: The seeking window
|
||||
default length in milliseconds is for the algorithm that seeks the best
|
||||
possible overlapping location. This determines from how wide a sample
|
||||
"window" the algorithm can use to find an optimal mixing location when
|
||||
the sound sequences are to be linked back together. <br>
|
||||
<br>
|
||||
The bigger this window setting is, the higher the possibility to find a
|
||||
better mixing position becomes, but at the same time large values may
|
||||
cause a "drifting" sound artifact because neighboring sequences can be
|
||||
chosen at more uneven intervals. If there's a disturbing artifact that
|
||||
sounds as if a constant frequency was drifting around, try reducing
|
||||
this setting.<br>
|
||||
<br>
|
||||
By default, this setting value is calculated automatically according to
|
||||
tempo value.<br>
|
||||
</li>
|
||||
<li> <strong>DEFAULT_OVERLAP_MS</strong>: Overlap length in
|
||||
milliseconds. When the sound sequences are mixed back together to form
|
||||
again a continuous sound stream, this parameter defines how much the
|
||||
ends of the consecutive sequences will overlap with each other.<br>
|
||||
<br>
|
||||
This shouldn't be that critical parameter. If you reduce the
|
||||
DEFAULT_SEQUENCE_MS setting by a large amount, you might wish to try a
|
||||
smaller value on this.</li>
|
||||
</ul>
|
||||
<p>Notice that these parameters can also be set during execution time
|
||||
with functions "<strong>TDStretch::setParameters()</strong>" and "<strong>SoundTouch::setSetting()</strong>".</p>
|
||||
<p>The table below summaries how the parameters can be adjusted for
|
||||
different applications:</p>
|
||||
<table border="1">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td valign="top"><strong>Parameter name</strong></td>
|
||||
<td valign="top"><strong>Default value magnitude</strong></td>
|
||||
<td valign="top"><strong>Larger value affects...</strong></td>
|
||||
<td valign="top"><strong>Smaller value affects...</strong></td>
|
||||
<td valign="top"><strong>Effect to CPU burden</strong></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<pre>SEQUENCE_MS</pre>
|
||||
</td>
|
||||
<td valign="top">Default value is relatively large, chosen for
|
||||
slowing down music tempo</td>
|
||||
<td valign="top">Larger value is usually better for slowing down
|
||||
tempo. Growing the value decelerates the "echoing" artifact when
|
||||
slowing down the tempo.</td>
|
||||
<td valign="top">Smaller value might be better for speeding up
|
||||
tempo. Reducing the value accelerates the "echoing" artifact when
|
||||
slowing down the tempo </td>
|
||||
<td valign="top">Increasing the parameter value reduces
|
||||
computation burden</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<pre>SEEKWINDOW_MS</pre>
|
||||
</td>
|
||||
<td valign="top">Default value is relatively large, chosen for
|
||||
slowing down music tempo</td>
|
||||
<td valign="top">Larger value eases finding a good mixing
|
||||
position, but may cause a "drifting" artifact</td>
|
||||
<td valign="top">Smaller reduce possibility to find a good mixing
|
||||
position, but reduce the "drifting" artifact.</td>
|
||||
<td valign="top">Increasing the parameter value increases
|
||||
computation burden</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<pre>OVERLAP_MS</pre>
|
||||
</td>
|
||||
<td valign="top">Default value is relatively large, chosen to
|
||||
suit with above parameters.</td>
|
||||
<td valign="top"> </td>
|
||||
<td valign="top">If you reduce the "sequence ms" setting, you
|
||||
might wish to try a smaller value.</td>
|
||||
<td valign="top">Increasing the parameter value increases
|
||||
computation burden</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h3>3.5 Performance Optimizations </h3>
|
||||
<p><strong>General optimizations:</strong></p>
|
||||
<p>The time-stretch routine has a 'quick' mode that substantially
|
||||
speeds up the algorithm but may degrade the sound quality by a small
|
||||
amount. This mode is activated by calling SoundTouch::setSetting()
|
||||
function with parameter id of SETTING_USE_QUICKSEEK and value
|
||||
"1", i.e. </p>
|
||||
<blockquote>
|
||||
<p>setSetting(SETTING_USE_QUICKSEEK, 1);</p>
|
||||
</blockquote>
|
||||
<p><strong>CPU-specific optimizations:</strong></p>
|
||||
<ul>
|
||||
<li> Intel MMX optimized routines are used with compatible CPUs when
|
||||
16bit integer sample type is used. MMX optimizations are available both
|
||||
in Win32 and Gnu/x86 platforms. Compatible processors are Intel
|
||||
PentiumMMX and later; AMD K6-2, Athlon and later. </li>
|
||||
<li> Intel SSE optimized routines are used with compatible CPUs when
|
||||
floating point sample type is used. SSE optimizations are currently
|
||||
implemented for Win32 platform only. Processors compatible with SSE
|
||||
extension are Intel processors starting from Pentium-III, and AMD
|
||||
processors starting from Athlon XP. </li>
|
||||
<li> AMD 3DNow! optimized routines are used with compatible CPUs when
|
||||
floating point sample type is used, but SSE extension isn't supported .
|
||||
3DNow! optimizations are currently implemented for Win32 platform only.
|
||||
These optimizations are used in AMD K6-2 and Athlon (classic) CPU's;
|
||||
better performing SSE routines are used with AMD processor starting
|
||||
from Athlon XP. </li>
|
||||
</ul>
|
||||
<hr>
|
||||
<h2><a name="SoundStretch"></a>4. SoundStretch audio processing utility
|
||||
</h2>
|
||||
<p>SoundStretch audio processing utility<br>
|
||||
Copyright (c) Olli Parviainen 2002-2012</p>
|
||||
<p>SoundStretch is a simple command-line application that can change
|
||||
tempo, pitch and playback rates of WAV sound files. This program is
|
||||
intended primarily to demonstrate how the "SoundTouch" library can be
|
||||
used to process sound in your own program, but it can as well be used
|
||||
for processing sound files.</p>
|
||||
<h3>4.1. SoundStretch Usage Instructions</h3>
|
||||
<p>SoundStretch Usage syntax:</p>
|
||||
<blockquote>
|
||||
<pre>soundstretch infilename outfilename [switches]</pre>
|
||||
</blockquote>
|
||||
<p>Where: </p>
|
||||
<table width="100%" border="0" cellpadding="2">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<pre>"infilename"</pre>
|
||||
</td>
|
||||
<td valign="top">Name of the input sound data file (in .WAV audio
|
||||
file format). Give "stdin" as filename to use standard input pipe. </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<pre>"outfilename"</pre>
|
||||
</td>
|
||||
<td valign="top">Name of the output sound file where the
|
||||
resulting sound is saved (in .WAV audio file format). This parameter
|
||||
may be omitted if you don't want to save the output (e.g. when
|
||||
only calculating BPM rate with '-bpm' switch). Give "stdout" as
|
||||
filename to use standard output pipe.</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<pre> [switches]</pre>
|
||||
</td>
|
||||
<td valign="top">Are one or more control switches.</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>Available control switches are:</p>
|
||||
<table width="100%" border="0" cellpadding="2">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<pre>-tempo=n </pre>
|
||||
</td>
|
||||
<td valign="top">Change the sound tempo by n percents (n = -95.0
|
||||
.. +5000.0 %) </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<pre>-pitch=n</pre>
|
||||
</td>
|
||||
<td valign="top">Change the sound pitch by n semitones (n = -60.0
|
||||
.. + 60.0 semitones) </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<pre>-rate=n</pre>
|
||||
</td>
|
||||
<td valign="top">Change the sound playback rate by n percents (n
|
||||
= -95.0 .. +5000.0 %) </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<pre>-bpm=n</pre>
|
||||
</td>
|
||||
<td valign="top">Detect the Beats-Per-Minute (BPM) rate of the
|
||||
sound and adjust the tempo to meet 'n' BPMs. When this switch is
|
||||
applied, the "-tempo" switch is ignored. If "=n" is omitted, i.e.
|
||||
switch "-bpm" is used alone, then the BPM rate is estimated and
|
||||
displayed, but tempo not adjusted according to the BPM value. </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<pre>-quick</pre>
|
||||
</td>
|
||||
<td valign="top">Use quicker tempo change algorithm. Gains speed
|
||||
but loses sound quality. </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<pre>-naa</pre>
|
||||
</td>
|
||||
<td valign="top">Don't use anti-alias filtering in sample rate
|
||||
transposing. Gains speed but loses sound quality. </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<pre>-license</pre>
|
||||
</td>
|
||||
<td valign="top">Displays the program license text (LGPL)</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>Notes:</p>
|
||||
<ul>
|
||||
<li> To use standard input/output pipes for processing, give "stdin"
|
||||
and "stdout" as input/output filenames correspondingly. The standard
|
||||
input/output pipes will still carry the audio data in .wav audio file
|
||||
format. </li>
|
||||
<li> The numerical switches allow both integer (e.g. "-tempo=123")
|
||||
and decimal (e.g. "-tempo=123.45") numbers. </li>
|
||||
<li> The "-naa" and/or "-quick" switches can be used to reduce CPU
|
||||
usage while compromising some sound quality </li>
|
||||
<li> The BPM detection algorithm works by detecting repeating bass or
|
||||
drum patterns at low frequencies of <250Hz. A lower-than-expected
|
||||
BPM figure may be reported for music with uneven or complex bass
|
||||
patterns. </li>
|
||||
</ul>
|
||||
<h3>4.2. SoundStretch usage examples </h3>
|
||||
<p><strong>Example 1</strong></p>
|
||||
<p>The following command increases tempo of the sound file
|
||||
"originalfile.wav" by 12.5% and stores result to file
|
||||
"destinationfile.wav":</p>
|
||||
<blockquote>
|
||||
<pre>soundstretch originalfile.wav destinationfile.wav -tempo=12.5</pre>
|
||||
</blockquote>
|
||||
<p><strong>Example 2</strong></p>
|
||||
<p>The following command decreases the sound pitch (key) of the sound
|
||||
file "orig.wav" by two semitones and stores the result to file
|
||||
"dest.wav":</p>
|
||||
<blockquote>
|
||||
<pre>soundstretch orig.wav dest.wav -pitch=-2</pre>
|
||||
</blockquote>
|
||||
<p><strong>Example 3</strong></p>
|
||||
<p>The following command processes the file "orig.wav" by decreasing
|
||||
the sound tempo by 25.3% and increasing the sound pitch (key) by 1.5
|
||||
semitones. Resulting .wav audio data is directed to standard output
|
||||
pipe:</p>
|
||||
<blockquote>
|
||||
<pre>soundstretch orig.wav stdout -tempo=-25.3 -pitch=1.5</pre>
|
||||
</blockquote>
|
||||
<p><strong>Example 4</strong></p>
|
||||
<p>The following command detects the BPM rate of the file "orig.wav"
|
||||
and adjusts the tempo to match 100 beats per minute. Result is stored
|
||||
to file "dest.wav":</p>
|
||||
<blockquote>
|
||||
<pre>soundstretch orig.wav dest.wav -bpm=100</pre>
|
||||
</blockquote>
|
||||
<p><strong>Example 5</strong></p>
|
||||
<p>The following command reads .wav sound data from standard input pipe
|
||||
and estimates the BPM rate:</p>
|
||||
<blockquote>
|
||||
<pre>soundstretch stdin -bpm</pre>
|
||||
</blockquote>
|
||||
<hr>
|
||||
<h2>5. Change History</h2>
|
||||
<h3>5.1. SoundTouch library Change History </h3>
|
||||
<p><b>1.7.1:</b></p>
|
||||
<ul>
|
||||
<li>Added files for Android compilation
|
||||
</ul>
|
||||
<p><b>1.7.0:</b></p>
|
||||
<ul>
|
||||
<li>Sound quality improvements/li>
|
||||
<li>Improved flush() to adjust output sound stream duration to match better with
|
||||
ideal duration</li>
|
||||
<li>Rewrote x86 cpu feature check to resolve compatibility problems</li>
|
||||
<li>Configure script automatically checks if CPU supports mmx & sse compatibility for GNU platform, and
|
||||
the script support now "--enable-x86-optimizations" switch to allow disabling x86-specific optimizations.</li>
|
||||
<li>Revised #define conditions for 32bit/64bit compatibility</li>
|
||||
<li>gnu autoconf/automake script compatibility fixes</li>
|
||||
<li>Tuned beat-per-minute detection algorithm</li>
|
||||
</ul>
|
||||
<p><b>1.6.0:</b></p>
|
||||
<ul>
|
||||
<li> Added automatic cutoff threshold adaptation to beat detection
|
||||
routine to better adapt BPM calculation to different types of music </li>
|
||||
<li> Retired 3DNow! optimization support as 3DNow! is nowadays
|
||||
obsoleted and assembler code is nuisance to maintain</li>
|
||||
<li>Retired "configure" file from source code package due to
|
||||
autoconf/automake versio conflicts, so that it is from now on to be
|
||||
generated by invoking "boostrap" script that uses locally available
|
||||
toolchain version for generating the "configure" file</li>
|
||||
<li>Resolved namespace/label naming conflicts with other libraries by
|
||||
replacing global labels such as INTEGER_SAMPLES with more specific
|
||||
SOUNDTOUCH_INTEGER_SAMPLES etc.<br>
|
||||
</li>
|
||||
<li>Updated windows build scripts & project files for Visual
|
||||
Studio 2008 support</li>
|
||||
<li> Updated SoundTouch.dll API for .NET compatibility</li>
|
||||
<li> Added API for querying nominal processing input & output
|
||||
sample batch sizes</li>
|
||||
</ul>
|
||||
<p><strong>1.5.0:</strong></p>
|
||||
<ul>
|
||||
<li> Added normalization to correlation calculation and improvement
|
||||
automatic seek/sequence parameter calculation to improve sound quality </li>
|
||||
<li> Bugfixes:
|
||||
<ul>
|
||||
<li> Fixed negative array indexing in quick seek algorithm </li>
|
||||
<li> FIR autoalias filter running too far in processing buffer </li>
|
||||
<li> Check against zero sample count in rate transposing </li>
|
||||
<li> Fix for x86-64 support: Removed pop/push instructions from
|
||||
the cpu detection algorithm. </li>
|
||||
<li> Check against empty buffers in FIFOSampleBuffer </li>
|
||||
<li> Other minor fixes & code cleanup</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li> Fixes in compilation scripts for non-Intel platforms </li>
|
||||
<li> Added Dynamic-Link-Library (DLL) version of SoundTouch library
|
||||
build, provided with Delphi/Pascal wrapper for calling the dll routines
|
||||
</li>
|
||||
<li> Added #define PREVENT_CLICK_AT_RATE_CROSSOVER that prevents a
|
||||
click artifact when crossing the nominal pitch from either positive to
|
||||
negative side or vice versa</li>
|
||||
</ul>
|
||||
<p><strong>1.4.1:</strong></p>
|
||||
<ul>
|
||||
<li> Fixed a buffer overflow bug in BPM detect algorithm routines if
|
||||
processing more than 2048 samples at one call </li>
|
||||
</ul>
|
||||
<p><strong>1.4.0:</strong></p>
|
||||
<ul>
|
||||
<li> Improved sound quality by automatic calculation of time stretch
|
||||
algorithm processing parameters according to tempo setting </li>
|
||||
<li> Moved BPM detection routines from SoundStretch application into
|
||||
SoundTouch library </li>
|
||||
<li> Bugfixes: Usage of uninitialied variables, GNU build scripts,
|
||||
compiler errors due to 'const' keyword mismatch. </li>
|
||||
<li> Source code cleanup</li>
|
||||
</ul>
|
||||
<p><strong>1.3.1: </strong> </p>
|
||||
<ul>
|
||||
<li> Changed static class declaration to GCC 4.x compiler compatible
|
||||
syntax. </li>
|
||||
<li> Enabled MMX/SSE-optimized routines also for GCC compilers.
|
||||
Earlier the MMX/SSE-optimized routines were written in
|
||||
compiler-specific inline assembler, now these routines are migrated to
|
||||
use compiler intrinsic syntax which allows compiling the same
|
||||
MMX/SSE-optimized source code with both Visual C++ and GCC compilers. </li>
|
||||
<li> Set floating point as the default sample format and added switch
|
||||
to the GNU configure script for selecting the other sample format.</li>
|
||||
</ul>
|
||||
<p><strong>1.3.0: </strong> </p>
|
||||
<ul>
|
||||
<li> Fixed tempo routine output duration inaccuracy due to rounding
|
||||
error </li>
|
||||
<li> Implemented separate processing routines for integer and
|
||||
floating arithmetic to allow improvements to floating point routines
|
||||
(earlier used algorithms mostly optimized for integer arithmetic also
|
||||
for floating point samples) </li>
|
||||
<li> Fixed a bug that distorts sound if sample rate changes during
|
||||
the sound stream </li>
|
||||
<li> Fixed a memory leak that appeared in MMX/SSE/3DNow! optimized
|
||||
routines </li>
|
||||
<li> Reduced redundant code pieces in MMX/SSE/3DNow! optimized
|
||||
routines vs. the standard C routines. </li>
|
||||
<li> MMX routine incompatibility with new gcc compiler versions </li>
|
||||
<li> Other miscellaneous bug fixes </li>
|
||||
</ul>
|
||||
<p><strong>1.2.1: </strong> </p>
|
||||
<ul>
|
||||
<li> Added automake/autoconf scripts for GNU platforms (in courtesy
|
||||
of David Durham) </li>
|
||||
<li> Fixed SCALE overflow bug in rate transposer routine. </li>
|
||||
<li> Fixed 64bit address space bugs. </li>
|
||||
<li> Created a 'soundtouch' namespace for SAMPLETYPE definitions.</li>
|
||||
</ul>
|
||||
<p><strong>1.2.0: </strong> </p>
|
||||
<ul>
|
||||
<li> Added support for 32bit floating point sample data type with
|
||||
SSE/3DNow! optimizations for Win32 platform (SSE/3DNow! optimizations
|
||||
currently not supported in GCC environment) </li>
|
||||
<li> Replaced 'make-gcc' script for GNU environment by master
|
||||
Makefile </li>
|
||||
<li> Added time-stretch routine configurability to SoundTouch main
|
||||
class </li>
|
||||
<li> Bugfixes</li>
|
||||
</ul>
|
||||
<p><strong>1.1.1: </strong> </p>
|
||||
<ul>
|
||||
<li> Moved SoundTouch under lesser GPL license (LGPL). This allows
|
||||
using SoundTouch library in programs that aren't released under GPL
|
||||
license. </li>
|
||||
<li> Changed MMX routine organiation so that MMX optimized routines
|
||||
are now implemented in classes that are derived from the basic classes
|
||||
having the standard non-mmx routines. </li>
|
||||
<li> MMX routines to support gcc version 3. </li>
|
||||
<li> Replaced windows makefiles by script using the .dsw files </li>
|
||||
</ul>
|
||||
<p><strong>1.0.1: </strong> </p>
|
||||
<ul>
|
||||
<li> "mmx_gcc.cpp": Added "using namespace std" and removed "return
|
||||
0" from a function with void return value to fix compiler errors when
|
||||
compiling the library in Solaris environment. </li>
|
||||
<li> Moved file "FIFOSampleBuffer.h" to "include" directory to allow
|
||||
accessing the FIFOSampleBuffer class from external files. </li>
|
||||
</ul>
|
||||
<p><strong>1.0: </strong> </p>
|
||||
<ul>
|
||||
<li> Initial release </li>
|
||||
</ul>
|
||||
<p> </p>
|
||||
<h3>5.2. SoundStretch application Change History </h3>
|
||||
<p><b>1.7.0:</b></p>
|
||||
<ul>
|
||||
<li>Bugfixes in Wavfile: exception string formatting, avoid getLengthMs() integer
|
||||
precision overflow, support WAV files using 24/32bit sample format.</li>
|
||||
</ul>
|
||||
<p><b>1.5.0:</b></p>
|
||||
<ul>
|
||||
<li> Added "-speech" switch to activate algorithm parameters more
|
||||
suitable for speech processing than the default parameters tuned for
|
||||
music processing.</li>
|
||||
</ul>
|
||||
<p><strong>1.4.0:</strong></p>
|
||||
<ul>
|
||||
<li> Moved BPM detection routines from SoundStretch application into
|
||||
SoundTouch library </li>
|
||||
<li> Allow using standard input/output pipes as audio processing
|
||||
input/output streams</li>
|
||||
</ul>
|
||||
<p><strong>1.3.0:</strong></p>
|
||||
<ul>
|
||||
<li> Simplified accessing WAV files with floating point sample
|
||||
format. </li>
|
||||
</ul>
|
||||
<p><strong>1.2.1: </strong> </p>
|
||||
<ul>
|
||||
<li> Fixed 64bit address space bugs.</li>
|
||||
</ul>
|
||||
<p><strong>1.2.0: </strong> </p>
|
||||
<ul>
|
||||
<li> Added support for 32bit floating point sample data type </li>
|
||||
<li> Restructured the BPM routines into separate library </li>
|
||||
<li> Fixed big-endian conversion bugs in WAV file routines (hopefully
|
||||
:)</li>
|
||||
</ul>
|
||||
<p><strong>1.1.1: </strong> </p>
|
||||
<ul>
|
||||
<li> Fixed bugs in WAV file reading & added byte-order conversion
|
||||
for big-endian processors. </li>
|
||||
<li> Moved SoundStretch source code under 'example' directory to
|
||||
highlight difference from SoundTouch stuff. </li>
|
||||
<li> Replaced windows makefiles by script using the .dsw files </li>
|
||||
<li> Output file name isn't required if output isn't desired (e.g. if
|
||||
using the switch '-bpm' in plain format only) </li>
|
||||
</ul>
|
||||
<p><strong>1.1:</strong></p>
|
||||
<ul>
|
||||
<li> Fixed "Release" settings in Microsoft Visual C++ project file
|
||||
(.dsp) </li>
|
||||
<li> Added beats-per-minute (BPM) detection routine and command-line
|
||||
switch "-bpm" </li>
|
||||
</ul>
|
||||
<p><strong>1.01: </strong> </p>
|
||||
<ul>
|
||||
<li> Initial release </li>
|
||||
</ul>
|
||||
<hr>
|
||||
<h2>6. Acknowledgements </h2>
|
||||
<p>Kudos for these people who have contributed to development or
|
||||
submitted bugfixes since SoundTouch v1.3.1: </p>
|
||||
<ul>
|
||||
<li> Arthur A</li>
|
||||
<li> Richard Ash</li>
|
||||
<li> Stanislav Brabec</li>
|
||||
<li> Christian Budde</li>
|
||||
<li> Jacek Caban</li>
|
||||
<li> Brian Cameron</li>
|
||||
<li> Jason Champion</li>
|
||||
<li> David Clark</li>
|
||||
<li> Patrick Colis</li>
|
||||
<li> Miquel Colon</li>
|
||||
<li> Justin Frankel</li>
|
||||
<li> Jason Garland</li>
|
||||
<li> Takashi Iwai</li>
|
||||
<li> Yuval Naveh</li>
|
||||
<li> Paulo Pizarro</li>
|
||||
<li> Blaise Potard</li>
|
||||
<li> RJ Ryan</li>
|
||||
<li> Patrick Colis </li>
|
||||
<li> Miquel Colon </li>
|
||||
<li> Sandro Cumerlato</li>
|
||||
<li> Justin Frankel </li>
|
||||
<li> Jason Garland </li>
|
||||
<li> Takashi Iwai </li>
|
||||
<li> Mathias Möhl</li>
|
||||
<li> Yuval Naveh </li>
|
||||
<li> Paulo Pizarro </li>
|
||||
<li> Blaise Potard</li>
|
||||
<li> RJ Ryan </li>
|
||||
<li> John Sheehy</li>
|
||||
<li> Tim Shuttleworth</li>
|
||||
<li> John Stumpo</li>
|
||||
<li> Tim Shuttleworth</li>
|
||||
<li> Katja Vetter</li>
|
||||
</ul>
|
||||
<p>Moral greetings to all other contributors and users also!</p>
|
||||
<hr>
|
||||
<h2>7. LICENSE </h2>
|
||||
<p>SoundTouch audio processing library<br>
|
||||
Copyright (c) Olli Parviainen</p>
|
||||
<p>This library is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU Lesser General Public License version 2.1
|
||||
as published by the Free Software Foundation.</p>
|
||||
<p>This library is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
|
||||
General Public License for more details.</p>
|
||||
<p>You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA</p>
|
||||
<hr><!--
|
||||
$Id: README.html 168 2012-12-28 20:55:19Z oparviai $
|
||||
-->
|
||||
<p>
|
||||
<i>RREADME.html file updated on 28-Dec-2012</i></p>
|
||||
</body>
|
||||
-626
@@ -1,626 +0,0 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Sample rate transposer. Changes sample rate by using linear interpolation
|
||||
/// together with anti-alias filtering (first order interpolation with anti-
|
||||
/// alias filtering should be quite adequate for this application)
|
||||
///
|
||||
/// Author : Copyright (c) Olli Parviainen
|
||||
/// Author e-mail : oparviai 'at' iki.fi
|
||||
/// SoundTouch WWW: http://www.surina.net/soundtouch
|
||||
///
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Last changed : $Date: 2011-09-02 15:56:11 -0300 (sex, 02 set 2011) $
|
||||
// File revision : $Revision: 4 $
|
||||
//
|
||||
// $Id: RateTransposer.cpp 131 2011-09-02 18:56:11Z oparviai $
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// License :
|
||||
//
|
||||
// SoundTouch audio processing library
|
||||
// Copyright (c) Olli Parviainen
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Lesser General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2.1 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public
|
||||
// License along with this library; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <memory.h>
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include "RateTransposer.h"
|
||||
#include "AAFilter.h"
|
||||
|
||||
using namespace soundtouch;
|
||||
|
||||
|
||||
/// A linear samplerate transposer class that uses integer arithmetics.
|
||||
/// for the transposing.
|
||||
class RateTransposerInteger : public RateTransposer
|
||||
{
|
||||
protected:
|
||||
int iSlopeCount;
|
||||
int iRate;
|
||||
SAMPLETYPE sPrevSampleL, sPrevSampleR;
|
||||
|
||||
virtual void resetRegisters();
|
||||
|
||||
virtual uint transposeStereo(SAMPLETYPE *dest,
|
||||
const SAMPLETYPE *src,
|
||||
uint numSamples);
|
||||
virtual uint transposeMono(SAMPLETYPE *dest,
|
||||
const SAMPLETYPE *src,
|
||||
uint numSamples);
|
||||
|
||||
public:
|
||||
RateTransposerInteger();
|
||||
virtual ~RateTransposerInteger();
|
||||
|
||||
/// Sets new target rate. Normal rate = 1.0, smaller values represent slower
|
||||
/// rate, larger faster rates.
|
||||
virtual void setRate(float newRate);
|
||||
|
||||
};
|
||||
|
||||
|
||||
/// A linear samplerate transposer class that uses floating point arithmetics
|
||||
/// for the transposing.
|
||||
class RateTransposerFloat : public RateTransposer
|
||||
{
|
||||
protected:
|
||||
float fSlopeCount;
|
||||
SAMPLETYPE sPrevSampleL, sPrevSampleR;
|
||||
|
||||
virtual void resetRegisters();
|
||||
|
||||
virtual uint transposeStereo(SAMPLETYPE *dest,
|
||||
const SAMPLETYPE *src,
|
||||
uint numSamples);
|
||||
virtual uint transposeMono(SAMPLETYPE *dest,
|
||||
const SAMPLETYPE *src,
|
||||
uint numSamples);
|
||||
|
||||
public:
|
||||
RateTransposerFloat();
|
||||
virtual ~RateTransposerFloat();
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
// Operator 'new' is overloaded so that it automatically creates a suitable instance
|
||||
// depending on if we've a MMX/SSE/etc-capable CPU available or not.
|
||||
void * RateTransposer::operator new(size_t s)
|
||||
{
|
||||
ST_THROW_RT_ERROR("Error in RateTransoser::new: don't use \"new TDStretch\" directly, use \"newInstance\" to create a new instance instead!");
|
||||
return newInstance();
|
||||
}
|
||||
|
||||
|
||||
RateTransposer *RateTransposer::newInstance()
|
||||
{
|
||||
#ifdef SOUNDTOUCH_INTEGER_SAMPLES
|
||||
return ::new RateTransposerInteger;
|
||||
#else
|
||||
return ::new RateTransposerFloat;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
// Constructor
|
||||
RateTransposer::RateTransposer() : FIFOProcessor(&outputBuffer)
|
||||
{
|
||||
numChannels = 2;
|
||||
bUseAAFilter = TRUE;
|
||||
fRate = 0;
|
||||
|
||||
// Instantiates the anti-alias filter with default tap length
|
||||
// of 32
|
||||
pAAFilter = new AAFilter(32);
|
||||
}
|
||||
|
||||
|
||||
|
||||
RateTransposer::~RateTransposer()
|
||||
{
|
||||
delete pAAFilter;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// Enables/disables the anti-alias filter. Zero to disable, nonzero to enable
|
||||
void RateTransposer::enableAAFilter(BOOL newMode)
|
||||
{
|
||||
bUseAAFilter = newMode;
|
||||
}
|
||||
|
||||
|
||||
/// Returns nonzero if anti-alias filter is enabled.
|
||||
BOOL RateTransposer::isAAFilterEnabled() const
|
||||
{
|
||||
return bUseAAFilter;
|
||||
}
|
||||
|
||||
|
||||
AAFilter *RateTransposer::getAAFilter()
|
||||
{
|
||||
return pAAFilter;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Sets new target iRate. Normal iRate = 1.0, smaller values represent slower
|
||||
// iRate, larger faster iRates.
|
||||
void RateTransposer::setRate(float newRate)
|
||||
{
|
||||
double fCutoff;
|
||||
|
||||
fRate = newRate;
|
||||
|
||||
// design a new anti-alias filter
|
||||
if (newRate > 1.0f)
|
||||
{
|
||||
fCutoff = 0.5f / newRate;
|
||||
}
|
||||
else
|
||||
{
|
||||
fCutoff = 0.5f * newRate;
|
||||
}
|
||||
pAAFilter->setCutoffFreq(fCutoff);
|
||||
}
|
||||
|
||||
|
||||
// Outputs as many samples of the 'outputBuffer' as possible, and if there's
|
||||
// any room left, outputs also as many of the incoming samples as possible.
|
||||
// The goal is to drive the outputBuffer empty.
|
||||
//
|
||||
// It's allowed for 'output' and 'input' parameters to point to the same
|
||||
// memory position.
|
||||
/*
|
||||
void RateTransposer::flushStoreBuffer()
|
||||
{
|
||||
if (storeBuffer.isEmpty()) return;
|
||||
|
||||
outputBuffer.moveSamples(storeBuffer);
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
// Adds 'nSamples' pcs of samples from the 'samples' memory position into
|
||||
// the input of the object.
|
||||
void RateTransposer::putSamples(const SAMPLETYPE *samples, uint nSamples)
|
||||
{
|
||||
processSamples(samples, nSamples);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Transposes up the sample rate, causing the observed playback 'rate' of the
|
||||
// sound to decrease
|
||||
void RateTransposer::upsample(const SAMPLETYPE *src, uint nSamples)
|
||||
{
|
||||
uint count, sizeTemp, num;
|
||||
|
||||
// If the parameter 'uRate' value is smaller than 'SCALE', first transpose
|
||||
// the samples and then apply the anti-alias filter to remove aliasing.
|
||||
|
||||
// First check that there's enough room in 'storeBuffer'
|
||||
// (+16 is to reserve some slack in the destination buffer)
|
||||
sizeTemp = (uint)((float)nSamples / fRate + 16.0f);
|
||||
|
||||
// Transpose the samples, store the result into the end of "storeBuffer"
|
||||
count = transpose(storeBuffer.ptrEnd(sizeTemp), src, nSamples);
|
||||
storeBuffer.putSamples(count);
|
||||
|
||||
// Apply the anti-alias filter to samples in "store output", output the
|
||||
// result to "dest"
|
||||
num = storeBuffer.numSamples();
|
||||
count = pAAFilter->evaluate(outputBuffer.ptrEnd(num),
|
||||
storeBuffer.ptrBegin(), num, (uint)numChannels);
|
||||
outputBuffer.putSamples(count);
|
||||
|
||||
// Remove the processed samples from "storeBuffer"
|
||||
storeBuffer.receiveSamples(count);
|
||||
}
|
||||
|
||||
|
||||
// Transposes down the sample rate, causing the observed playback 'rate' of the
|
||||
// sound to increase
|
||||
void RateTransposer::downsample(const SAMPLETYPE *src, uint nSamples)
|
||||
{
|
||||
uint count, sizeTemp;
|
||||
|
||||
// If the parameter 'uRate' value is larger than 'SCALE', first apply the
|
||||
// anti-alias filter to remove high frequencies (prevent them from folding
|
||||
// over the lover frequencies), then transpose.
|
||||
|
||||
// Add the new samples to the end of the storeBuffer
|
||||
storeBuffer.putSamples(src, nSamples);
|
||||
|
||||
// Anti-alias filter the samples to prevent folding and output the filtered
|
||||
// data to tempBuffer. Note : because of the FIR filter length, the
|
||||
// filtering routine takes in 'filter_length' more samples than it outputs.
|
||||
assert(tempBuffer.isEmpty());
|
||||
sizeTemp = storeBuffer.numSamples();
|
||||
|
||||
count = pAAFilter->evaluate(tempBuffer.ptrEnd(sizeTemp),
|
||||
storeBuffer.ptrBegin(), sizeTemp, (uint)numChannels);
|
||||
|
||||
if (count == 0) return;
|
||||
|
||||
// Remove the filtered samples from 'storeBuffer'
|
||||
storeBuffer.receiveSamples(count);
|
||||
|
||||
// Transpose the samples (+16 is to reserve some slack in the destination buffer)
|
||||
sizeTemp = (uint)((float)nSamples / fRate + 16.0f);
|
||||
count = transpose(outputBuffer.ptrEnd(sizeTemp), tempBuffer.ptrBegin(), count);
|
||||
outputBuffer.putSamples(count);
|
||||
}
|
||||
|
||||
|
||||
// Transposes sample rate by applying anti-alias filter to prevent folding.
|
||||
// Returns amount of samples returned in the "dest" buffer.
|
||||
// The maximum amount of samples that can be returned at a time is set by
|
||||
// the 'set_returnBuffer_size' function.
|
||||
void RateTransposer::processSamples(const SAMPLETYPE *src, uint nSamples)
|
||||
{
|
||||
uint count;
|
||||
uint sizeReq;
|
||||
|
||||
if (nSamples == 0) return;
|
||||
assert(pAAFilter);
|
||||
|
||||
// If anti-alias filter is turned off, simply transpose without applying
|
||||
// the filter
|
||||
if (bUseAAFilter == FALSE)
|
||||
{
|
||||
sizeReq = (uint)((float)nSamples / fRate + 1.0f);
|
||||
count = transpose(outputBuffer.ptrEnd(sizeReq), src, nSamples);
|
||||
outputBuffer.putSamples(count);
|
||||
return;
|
||||
}
|
||||
|
||||
// Transpose with anti-alias filter
|
||||
if (fRate < 1.0f)
|
||||
{
|
||||
upsample(src, nSamples);
|
||||
}
|
||||
else
|
||||
{
|
||||
downsample(src, nSamples);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Transposes the sample rate of the given samples using linear interpolation.
|
||||
// Returns the number of samples returned in the "dest" buffer
|
||||
inline uint RateTransposer::transpose(SAMPLETYPE *dest, const SAMPLETYPE *src, uint nSamples)
|
||||
{
|
||||
if (numChannels == 2)
|
||||
{
|
||||
return transposeStereo(dest, src, nSamples);
|
||||
}
|
||||
else
|
||||
{
|
||||
return transposeMono(dest, src, nSamples);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Sets the number of channels, 1 = mono, 2 = stereo
|
||||
void RateTransposer::setChannels(int nChannels)
|
||||
{
|
||||
assert(nChannels > 0);
|
||||
if (numChannels == nChannels) return;
|
||||
|
||||
assert(nChannels == 1 || nChannels == 2);
|
||||
numChannels = nChannels;
|
||||
|
||||
storeBuffer.setChannels(numChannels);
|
||||
tempBuffer.setChannels(numChannels);
|
||||
outputBuffer.setChannels(numChannels);
|
||||
|
||||
// Inits the linear interpolation registers
|
||||
resetRegisters();
|
||||
}
|
||||
|
||||
|
||||
// Clears all the samples in the object
|
||||
void RateTransposer::clear()
|
||||
{
|
||||
outputBuffer.clear();
|
||||
storeBuffer.clear();
|
||||
}
|
||||
|
||||
|
||||
// Returns nonzero if there aren't any samples available for outputting.
|
||||
int RateTransposer::isEmpty() const
|
||||
{
|
||||
int res;
|
||||
|
||||
res = FIFOProcessor::isEmpty();
|
||||
if (res == 0) return 0;
|
||||
return storeBuffer.isEmpty();
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// RateTransposerInteger - integer arithmetic implementation
|
||||
//
|
||||
|
||||
/// fixed-point interpolation routine precision
|
||||
#define SCALE 65536
|
||||
|
||||
// Constructor
|
||||
RateTransposerInteger::RateTransposerInteger() : RateTransposer()
|
||||
{
|
||||
// Notice: use local function calling syntax for sake of clarity,
|
||||
// to indicate the fact that C++ constructor can't call virtual functions.
|
||||
RateTransposerInteger::resetRegisters();
|
||||
RateTransposerInteger::setRate(1.0f);
|
||||
}
|
||||
|
||||
|
||||
RateTransposerInteger::~RateTransposerInteger()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void RateTransposerInteger::resetRegisters()
|
||||
{
|
||||
iSlopeCount = 0;
|
||||
sPrevSampleL =
|
||||
sPrevSampleR = 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Transposes the sample rate of the given samples using linear interpolation.
|
||||
// 'Mono' version of the routine. Returns the number of samples returned in
|
||||
// the "dest" buffer
|
||||
uint RateTransposerInteger::transposeMono(SAMPLETYPE *dest, const SAMPLETYPE *src, uint nSamples)
|
||||
{
|
||||
unsigned int i, used;
|
||||
LONG_SAMPLETYPE temp, vol1;
|
||||
|
||||
if (nSamples == 0) return 0; // no samples, no work
|
||||
|
||||
used = 0;
|
||||
i = 0;
|
||||
|
||||
// Process the last sample saved from the previous call first...
|
||||
while (iSlopeCount <= SCALE)
|
||||
{
|
||||
vol1 = (LONG_SAMPLETYPE)(SCALE - iSlopeCount);
|
||||
temp = vol1 * sPrevSampleL + iSlopeCount * src[0];
|
||||
dest[i] = (SAMPLETYPE)(temp / SCALE);
|
||||
i++;
|
||||
iSlopeCount += iRate;
|
||||
}
|
||||
// now always (iSlopeCount > SCALE)
|
||||
iSlopeCount -= SCALE;
|
||||
|
||||
while (1)
|
||||
{
|
||||
while (iSlopeCount > SCALE)
|
||||
{
|
||||
iSlopeCount -= SCALE;
|
||||
used ++;
|
||||
if (used >= nSamples - 1) goto end;
|
||||
}
|
||||
vol1 = (LONG_SAMPLETYPE)(SCALE - iSlopeCount);
|
||||
temp = src[used] * vol1 + iSlopeCount * src[used + 1];
|
||||
dest[i] = (SAMPLETYPE)(temp / SCALE);
|
||||
|
||||
i++;
|
||||
iSlopeCount += iRate;
|
||||
}
|
||||
end:
|
||||
// Store the last sample for the next round
|
||||
sPrevSampleL = src[nSamples - 1];
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
|
||||
// Transposes the sample rate of the given samples using linear interpolation.
|
||||
// 'Stereo' version of the routine. Returns the number of samples returned in
|
||||
// the "dest" buffer
|
||||
uint RateTransposerInteger::transposeStereo(SAMPLETYPE *dest, const SAMPLETYPE *src, uint nSamples)
|
||||
{
|
||||
unsigned int srcPos, i, used;
|
||||
LONG_SAMPLETYPE temp, vol1;
|
||||
|
||||
if (nSamples == 0) return 0; // no samples, no work
|
||||
|
||||
used = 0;
|
||||
i = 0;
|
||||
|
||||
// Process the last sample saved from the sPrevSampleLious call first...
|
||||
while (iSlopeCount <= SCALE)
|
||||
{
|
||||
vol1 = (LONG_SAMPLETYPE)(SCALE - iSlopeCount);
|
||||
temp = vol1 * sPrevSampleL + iSlopeCount * src[0];
|
||||
dest[2 * i] = (SAMPLETYPE)(temp / SCALE);
|
||||
temp = vol1 * sPrevSampleR + iSlopeCount * src[1];
|
||||
dest[2 * i + 1] = (SAMPLETYPE)(temp / SCALE);
|
||||
i++;
|
||||
iSlopeCount += iRate;
|
||||
}
|
||||
// now always (iSlopeCount > SCALE)
|
||||
iSlopeCount -= SCALE;
|
||||
|
||||
while (1)
|
||||
{
|
||||
while (iSlopeCount > SCALE)
|
||||
{
|
||||
iSlopeCount -= SCALE;
|
||||
used ++;
|
||||
if (used >= nSamples - 1) goto end;
|
||||
}
|
||||
srcPos = 2 * used;
|
||||
vol1 = (LONG_SAMPLETYPE)(SCALE - iSlopeCount);
|
||||
temp = src[srcPos] * vol1 + iSlopeCount * src[srcPos + 2];
|
||||
dest[2 * i] = (SAMPLETYPE)(temp / SCALE);
|
||||
temp = src[srcPos + 1] * vol1 + iSlopeCount * src[srcPos + 3];
|
||||
dest[2 * i + 1] = (SAMPLETYPE)(temp / SCALE);
|
||||
|
||||
i++;
|
||||
iSlopeCount += iRate;
|
||||
}
|
||||
end:
|
||||
// Store the last sample for the next round
|
||||
sPrevSampleL = src[2 * nSamples - 2];
|
||||
sPrevSampleR = src[2 * nSamples - 1];
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
|
||||
// Sets new target iRate. Normal iRate = 1.0, smaller values represent slower
|
||||
// iRate, larger faster iRates.
|
||||
void RateTransposerInteger::setRate(float newRate)
|
||||
{
|
||||
iRate = (int)(newRate * SCALE + 0.5f);
|
||||
RateTransposer::setRate(newRate);
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// RateTransposerFloat - floating point arithmetic implementation
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Constructor
|
||||
RateTransposerFloat::RateTransposerFloat() : RateTransposer()
|
||||
{
|
||||
// Notice: use local function calling syntax for sake of clarity,
|
||||
// to indicate the fact that C++ constructor can't call virtual functions.
|
||||
RateTransposerFloat::resetRegisters();
|
||||
RateTransposerFloat::setRate(1.0f);
|
||||
}
|
||||
|
||||
|
||||
RateTransposerFloat::~RateTransposerFloat()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void RateTransposerFloat::resetRegisters()
|
||||
{
|
||||
fSlopeCount = 0;
|
||||
sPrevSampleL =
|
||||
sPrevSampleR = 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Transposes the sample rate of the given samples using linear interpolation.
|
||||
// 'Mono' version of the routine. Returns the number of samples returned in
|
||||
// the "dest" buffer
|
||||
uint RateTransposerFloat::transposeMono(SAMPLETYPE *dest, const SAMPLETYPE *src, uint nSamples)
|
||||
{
|
||||
unsigned int i, used;
|
||||
|
||||
used = 0;
|
||||
i = 0;
|
||||
|
||||
// Process the last sample saved from the previous call first...
|
||||
while (fSlopeCount <= 1.0f)
|
||||
{
|
||||
dest[i] = (SAMPLETYPE)((1.0f - fSlopeCount) * sPrevSampleL + fSlopeCount * src[0]);
|
||||
i++;
|
||||
fSlopeCount += fRate;
|
||||
}
|
||||
fSlopeCount -= 1.0f;
|
||||
|
||||
if (nSamples > 1)
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
while (fSlopeCount > 1.0f)
|
||||
{
|
||||
fSlopeCount -= 1.0f;
|
||||
used ++;
|
||||
if (used >= nSamples - 1) goto end;
|
||||
}
|
||||
dest[i] = (SAMPLETYPE)((1.0f - fSlopeCount) * src[used] + fSlopeCount * src[used + 1]);
|
||||
i++;
|
||||
fSlopeCount += fRate;
|
||||
}
|
||||
}
|
||||
end:
|
||||
// Store the last sample for the next round
|
||||
sPrevSampleL = src[nSamples - 1];
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
|
||||
// Transposes the sample rate of the given samples using linear interpolation.
|
||||
// 'Mono' version of the routine. Returns the number of samples returned in
|
||||
// the "dest" buffer
|
||||
uint RateTransposerFloat::transposeStereo(SAMPLETYPE *dest, const SAMPLETYPE *src, uint nSamples)
|
||||
{
|
||||
unsigned int srcPos, i, used;
|
||||
|
||||
if (nSamples == 0) return 0; // no samples, no work
|
||||
|
||||
used = 0;
|
||||
i = 0;
|
||||
|
||||
// Process the last sample saved from the sPrevSampleLious call first...
|
||||
while (fSlopeCount <= 1.0f)
|
||||
{
|
||||
dest[2 * i] = (SAMPLETYPE)((1.0f - fSlopeCount) * sPrevSampleL + fSlopeCount * src[0]);
|
||||
dest[2 * i + 1] = (SAMPLETYPE)((1.0f - fSlopeCount) * sPrevSampleR + fSlopeCount * src[1]);
|
||||
i++;
|
||||
fSlopeCount += fRate;
|
||||
}
|
||||
// now always (iSlopeCount > 1.0f)
|
||||
fSlopeCount -= 1.0f;
|
||||
|
||||
if (nSamples > 1)
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
while (fSlopeCount > 1.0f)
|
||||
{
|
||||
fSlopeCount -= 1.0f;
|
||||
used ++;
|
||||
if (used >= nSamples - 1) goto end;
|
||||
}
|
||||
srcPos = 2 * used;
|
||||
|
||||
dest[2 * i] = (SAMPLETYPE)((1.0f - fSlopeCount) * src[srcPos]
|
||||
+ fSlopeCount * src[srcPos + 2]);
|
||||
dest[2 * i + 1] = (SAMPLETYPE)((1.0f - fSlopeCount) * src[srcPos + 1]
|
||||
+ fSlopeCount * src[srcPos + 3]);
|
||||
|
||||
i++;
|
||||
fSlopeCount += fRate;
|
||||
}
|
||||
}
|
||||
end:
|
||||
// Store the last sample for the next round
|
||||
sPrevSampleL = src[2 * nSamples - 2];
|
||||
sPrevSampleR = src[2 * nSamples - 1];
|
||||
|
||||
return i;
|
||||
}
|
||||
Vendored
-159
@@ -1,159 +0,0 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Sample rate transposer. Changes sample rate by using linear interpolation
|
||||
/// together with anti-alias filtering (first order interpolation with anti-
|
||||
/// alias filtering should be quite adequate for this application).
|
||||
///
|
||||
/// Use either of the derived classes of 'RateTransposerInteger' or
|
||||
/// 'RateTransposerFloat' for corresponding integer/floating point tranposing
|
||||
/// algorithm implementation.
|
||||
///
|
||||
/// Author : Copyright (c) Olli Parviainen
|
||||
/// Author e-mail : oparviai 'at' iki.fi
|
||||
/// SoundTouch WWW: http://www.surina.net/soundtouch
|
||||
///
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Last changed : $Date: 2009-02-21 13:00:14 -0300 (sáb, 21 fev 2009) $
|
||||
// File revision : $Revision: 4 $
|
||||
//
|
||||
// $Id: RateTransposer.h 63 2009-02-21 16:00:14Z oparviai $
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// License :
|
||||
//
|
||||
// SoundTouch audio processing library
|
||||
// Copyright (c) Olli Parviainen
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Lesser General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2.1 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public
|
||||
// License along with this library; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef RateTransposer_H
|
||||
#define RateTransposer_H
|
||||
|
||||
#include <stddef.h>
|
||||
#include "AAFilter.h"
|
||||
#include "FIFOSamplePipe.h"
|
||||
#include "FIFOSampleBuffer.h"
|
||||
|
||||
#include "STTypes.h"
|
||||
|
||||
namespace soundtouch
|
||||
{
|
||||
|
||||
/// A common linear samplerate transposer class.
|
||||
///
|
||||
/// Note: Use function "RateTransposer::newInstance()" to create a new class
|
||||
/// instance instead of the "new" operator; that function automatically
|
||||
/// chooses a correct implementation depending on if integer or floating
|
||||
/// arithmetics are to be used.
|
||||
class RateTransposer : public FIFOProcessor
|
||||
{
|
||||
protected:
|
||||
/// Anti-alias filter object
|
||||
AAFilter *pAAFilter;
|
||||
|
||||
float fRate;
|
||||
|
||||
int numChannels;
|
||||
|
||||
/// Buffer for collecting samples to feed the anti-alias filter between
|
||||
/// two batches
|
||||
FIFOSampleBuffer storeBuffer;
|
||||
|
||||
/// Buffer for keeping samples between transposing & anti-alias filter
|
||||
FIFOSampleBuffer tempBuffer;
|
||||
|
||||
/// Output sample buffer
|
||||
FIFOSampleBuffer outputBuffer;
|
||||
|
||||
BOOL bUseAAFilter;
|
||||
|
||||
virtual void resetRegisters() = 0;
|
||||
|
||||
virtual uint transposeStereo(SAMPLETYPE *dest,
|
||||
const SAMPLETYPE *src,
|
||||
uint numSamples) = 0;
|
||||
virtual uint transposeMono(SAMPLETYPE *dest,
|
||||
const SAMPLETYPE *src,
|
||||
uint numSamples) = 0;
|
||||
inline uint transpose(SAMPLETYPE *dest,
|
||||
const SAMPLETYPE *src,
|
||||
uint numSamples);
|
||||
|
||||
void downsample(const SAMPLETYPE *src,
|
||||
uint numSamples);
|
||||
void upsample(const SAMPLETYPE *src,
|
||||
uint numSamples);
|
||||
|
||||
/// Transposes sample rate by applying anti-alias filter to prevent folding.
|
||||
/// Returns amount of samples returned in the "dest" buffer.
|
||||
/// The maximum amount of samples that can be returned at a time is set by
|
||||
/// the 'set_returnBuffer_size' function.
|
||||
void processSamples(const SAMPLETYPE *src,
|
||||
uint numSamples);
|
||||
|
||||
|
||||
public:
|
||||
RateTransposer();
|
||||
virtual ~RateTransposer();
|
||||
|
||||
/// Operator 'new' is overloaded so that it automatically creates a suitable instance
|
||||
/// depending on if we're to use integer or floating point arithmetics.
|
||||
static void *operator new(size_t s);
|
||||
|
||||
/// Use this function instead of "new" operator to create a new instance of this class.
|
||||
/// This function automatically chooses a correct implementation, depending on if
|
||||
/// integer ot floating point arithmetics are to be used.
|
||||
static RateTransposer *newInstance();
|
||||
|
||||
/// Returns the output buffer object
|
||||
FIFOSamplePipe *getOutput() { return &outputBuffer; };
|
||||
|
||||
/// Returns the store buffer object
|
||||
FIFOSamplePipe *getStore() { return &storeBuffer; };
|
||||
|
||||
/// Return anti-alias filter object
|
||||
AAFilter *getAAFilter();
|
||||
|
||||
/// Enables/disables the anti-alias filter. Zero to disable, nonzero to enable
|
||||
void enableAAFilter(BOOL newMode);
|
||||
|
||||
/// Returns nonzero if anti-alias filter is enabled.
|
||||
BOOL isAAFilterEnabled() const;
|
||||
|
||||
/// Sets new target rate. Normal rate = 1.0, smaller values represent slower
|
||||
/// rate, larger faster rates.
|
||||
virtual void setRate(float newRate);
|
||||
|
||||
/// Sets the number of channels, 1 = mono, 2 = stereo
|
||||
void setChannels(int channels);
|
||||
|
||||
/// Adds 'numSamples' pcs of samples from the 'samples' memory position into
|
||||
/// the input of the object.
|
||||
void putSamples(const SAMPLETYPE *samples, uint numSamples);
|
||||
|
||||
/// Clears all the samples in the object
|
||||
void clear();
|
||||
|
||||
/// Returns nonzero if there aren't any samples available for outputting.
|
||||
int isEmpty() const;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
Vendored
-86
@@ -1,86 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
|
||||
<CodeBlocks_project_file>
|
||||
<FileVersion major="1" minor="6" />
|
||||
<Project>
|
||||
<Option title="SoundTouch" />
|
||||
<Option pch_mode="2" />
|
||||
<Option compiler="gcc" />
|
||||
<Build>
|
||||
<Target title="Debug">
|
||||
<Option output="../../deps/debug/libsoundtouch-dbg" prefix_auto="1" extension_auto="1" />
|
||||
<Option working_dir="" />
|
||||
<Option object_output="./.objs/debug" />
|
||||
<Option type="2" />
|
||||
<Option compiler="gcc" />
|
||||
<Option createDefFile="1" />
|
||||
<Compiler>
|
||||
<Add option="-g" />
|
||||
<Add option="-O0" />
|
||||
</Compiler>
|
||||
</Target>
|
||||
<Target title="Devel">
|
||||
<Option output="../../deps/devel/libsoundtouch-dev" prefix_auto="1" extension_auto="1" />
|
||||
<Option working_dir="" />
|
||||
<Option object_output="./.objs/devel" />
|
||||
<Option type="2" />
|
||||
<Option compiler="gcc" />
|
||||
<Option createDefFile="1" />
|
||||
<Compiler>
|
||||
<Add option="-O1" />
|
||||
<Add option="-W" />
|
||||
<Add option="-g" />
|
||||
<Add option="-DNDEBUG" />
|
||||
</Compiler>
|
||||
</Target>
|
||||
<Target title="Release">
|
||||
<Option output="../../deps/libsoundtouch" prefix_auto="1" extension_auto="1" />
|
||||
<Option working_dir="" />
|
||||
<Option object_output="./.objs/release" />
|
||||
<Option type="2" />
|
||||
<Option compiler="gcc" />
|
||||
<Option createDefFile="1" />
|
||||
<Compiler>
|
||||
<Add option="-fexpensive-optimizations" />
|
||||
<Add option="-O3" />
|
||||
<Add option="-W" />
|
||||
<Add option="-DNDEBUG" />
|
||||
</Compiler>
|
||||
<Linker>
|
||||
<Add option="-s" />
|
||||
</Linker>
|
||||
</Target>
|
||||
</Build>
|
||||
<Compiler>
|
||||
<Add option="-march=athlon-xp" />
|
||||
<Add option="-march=prescott" />
|
||||
</Compiler>
|
||||
<Unit filename="AAFilter.cpp" />
|
||||
<Unit filename="AAFilter.h" />
|
||||
<Unit filename="BPMDetect.h" />
|
||||
<Unit filename="FIFOSampleBuffer.cpp" />
|
||||
<Unit filename="FIFOSampleBuffer.h" />
|
||||
<Unit filename="FIFOSamplePipe.h" />
|
||||
<Unit filename="FIRFilter.cpp" />
|
||||
<Unit filename="FIRFilter.h" />
|
||||
<Unit filename="RateTransposer.cpp" />
|
||||
<Unit filename="RateTransposer.h" />
|
||||
<Unit filename="STTypes.h" />
|
||||
<Unit filename="SoundTouch.cpp" />
|
||||
<Unit filename="SoundTouch.h" />
|
||||
<Unit filename="TDStretch.cpp" />
|
||||
<Unit filename="TDStretch.h" />
|
||||
<Unit filename="WavFile.cpp" />
|
||||
<Unit filename="WavFile.h" />
|
||||
<Unit filename="cpu_detect.h" />
|
||||
<Unit filename="cpu_detect_x86_gcc.cpp" />
|
||||
<Unit filename="mmx_optimized.cpp" />
|
||||
<Unit filename="soundtouch_config.h" />
|
||||
<Unit filename="sse_optimized.cpp" />
|
||||
<Extensions>
|
||||
<envvars />
|
||||
<code_completion />
|
||||
<lib_finder disable_auto="1" />
|
||||
<debugger />
|
||||
</Extensions>
|
||||
</Project>
|
||||
</CodeBlocks_project_file>
|
||||
Vendored
-501
@@ -1,501 +0,0 @@
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// SoundTouch - main class for tempo/pitch/rate adjusting routines.
|
||||
///
|
||||
/// Notes:
|
||||
/// - Initialize the SoundTouch object instance by setting up the sound stream
|
||||
/// parameters with functions 'setSampleRate' and 'setChannels', then set
|
||||
/// desired tempo/pitch/rate settings with the corresponding functions.
|
||||
///
|
||||
/// - The SoundTouch class behaves like a first-in-first-out pipeline: The
|
||||
/// samples that are to be processed are fed into one of the pipe by calling
|
||||
/// function 'putSamples', while the ready processed samples can be read
|
||||
/// from the other end of the pipeline with function 'receiveSamples'.
|
||||
///
|
||||
/// - The SoundTouch processing classes require certain sized 'batches' of
|
||||
/// samples in order to process the sound. For this reason the classes buffer
|
||||
/// incoming samples until there are enough of samples available for
|
||||
/// processing, then they carry out the processing step and consequently
|
||||
/// make the processed samples available for outputting.
|
||||
///
|
||||
/// - For the above reason, the processing routines introduce a certain
|
||||
/// 'latency' between the input and output, so that the samples input to
|
||||
/// SoundTouch may not be immediately available in the output, and neither
|
||||
/// the amount of outputtable samples may not immediately be in direct
|
||||
/// relationship with the amount of previously input samples.
|
||||
///
|
||||
/// - The tempo/pitch/rate control parameters can be altered during processing.
|
||||
/// Please notice though that they aren't currently protected by semaphores,
|
||||
/// so in multi-thread application external semaphore protection may be
|
||||
/// required.
|
||||
///
|
||||
/// - This class utilizes classes 'TDStretch' for tempo change (without modifying
|
||||
/// pitch) and 'RateTransposer' for changing the playback rate (that is, both
|
||||
/// tempo and pitch in the same ratio) of the sound. The third available control
|
||||
/// 'pitch' (change pitch but maintain tempo) is produced by a combination of
|
||||
/// combining the two other controls.
|
||||
///
|
||||
/// Author : Copyright (c) Olli Parviainen
|
||||
/// Author e-mail : oparviai 'at' iki.fi
|
||||
/// SoundTouch WWW: http://www.surina.net/soundtouch
|
||||
///
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Last changed : $Date: 2012-06-13 16:29:53 -0300 (qua, 13 jun 2012) $
|
||||
// File revision : $Revision: 4 $
|
||||
//
|
||||
// $Id: SoundTouch.cpp 143 2012-06-13 19:29:53Z oparviai $
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// License :
|
||||
//
|
||||
// SoundTouch audio processing library
|
||||
// Copyright (c) Olli Parviainen
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Lesser General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2.1 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public
|
||||
// License along with this library; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <memory.h>
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "SoundTouch.h"
|
||||
#include "TDStretch.h"
|
||||
#include "RateTransposer.h"
|
||||
#include "cpu_detect.h"
|
||||
|
||||
using namespace soundtouch;
|
||||
|
||||
/// test if two floating point numbers are equal
|
||||
#define TEST_FLOAT_EQUAL(a, b) (fabs(a - b) < 1e-10)
|
||||
|
||||
|
||||
/// Print library version string for autoconf
|
||||
extern "C" void soundtouch_ac_test()
|
||||
{
|
||||
printf("SoundTouch Version: %s\n",SOUNDTOUCH_VERSION);
|
||||
}
|
||||
|
||||
|
||||
SoundTouch::SoundTouch()
|
||||
{
|
||||
// Initialize rate transposer and tempo changer instances
|
||||
|
||||
pRateTransposer = RateTransposer::newInstance();
|
||||
pTDStretch = TDStretch::newInstance();
|
||||
|
||||
setOutPipe(pTDStretch);
|
||||
|
||||
rate = tempo = 0;
|
||||
|
||||
virtualPitch =
|
||||
virtualRate =
|
||||
virtualTempo = 1.0;
|
||||
|
||||
calcEffectiveRateAndTempo();
|
||||
|
||||
channels = 0;
|
||||
bSrateSet = FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
SoundTouch::~SoundTouch()
|
||||
{
|
||||
delete pRateTransposer;
|
||||
delete pTDStretch;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// Get SoundTouch library version string
|
||||
const char *SoundTouch::getVersionString()
|
||||
{
|
||||
static const char *_version = SOUNDTOUCH_VERSION;
|
||||
|
||||
return _version;
|
||||
}
|
||||
|
||||
|
||||
/// Get SoundTouch library version Id
|
||||
uint SoundTouch::getVersionId()
|
||||
{
|
||||
return SOUNDTOUCH_VERSION_ID;
|
||||
}
|
||||
|
||||
|
||||
// Sets the number of channels, 1 = mono, 2 = stereo
|
||||
void SoundTouch::setChannels(uint numChannels)
|
||||
{
|
||||
if (numChannels != 1 && numChannels != 2)
|
||||
{
|
||||
ST_THROW_RT_ERROR("Illegal number of channels");
|
||||
}
|
||||
channels = numChannels;
|
||||
pRateTransposer->setChannels((int)numChannels);
|
||||
pTDStretch->setChannels((int)numChannels);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Sets new rate control value. Normal rate = 1.0, smaller values
|
||||
// represent slower rate, larger faster rates.
|
||||
void SoundTouch::setRate(float newRate)
|
||||
{
|
||||
virtualRate = newRate;
|
||||
calcEffectiveRateAndTempo();
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Sets new rate control value as a difference in percents compared
|
||||
// to the original rate (-50 .. +100 %)
|
||||
void SoundTouch::setRateChange(float newRate)
|
||||
{
|
||||
virtualRate = 1.0f + 0.01f * newRate;
|
||||
calcEffectiveRateAndTempo();
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Sets new tempo control value. Normal tempo = 1.0, smaller values
|
||||
// represent slower tempo, larger faster tempo.
|
||||
void SoundTouch::setTempo(float newTempo)
|
||||
{
|
||||
virtualTempo = newTempo;
|
||||
calcEffectiveRateAndTempo();
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Sets new tempo control value as a difference in percents compared
|
||||
// to the original tempo (-50 .. +100 %)
|
||||
void SoundTouch::setTempoChange(float newTempo)
|
||||
{
|
||||
virtualTempo = 1.0f + 0.01f * newTempo;
|
||||
calcEffectiveRateAndTempo();
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Sets new pitch control value. Original pitch = 1.0, smaller values
|
||||
// represent lower pitches, larger values higher pitch.
|
||||
void SoundTouch::setPitch(float newPitch)
|
||||
{
|
||||
virtualPitch = newPitch;
|
||||
calcEffectiveRateAndTempo();
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Sets pitch change in octaves compared to the original pitch
|
||||
// (-1.00 .. +1.00)
|
||||
void SoundTouch::setPitchOctaves(float newPitch)
|
||||
{
|
||||
virtualPitch = (float)exp(0.69314718056f * newPitch);
|
||||
calcEffectiveRateAndTempo();
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Sets pitch change in semi-tones compared to the original pitch
|
||||
// (-12 .. +12)
|
||||
void SoundTouch::setPitchSemiTones(int newPitch)
|
||||
{
|
||||
setPitchOctaves((float)newPitch / 12.0f);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SoundTouch::setPitchSemiTones(float newPitch)
|
||||
{
|
||||
setPitchOctaves(newPitch / 12.0f);
|
||||
}
|
||||
|
||||
|
||||
// Calculates 'effective' rate and tempo values from the
|
||||
// nominal control values.
|
||||
void SoundTouch::calcEffectiveRateAndTempo()
|
||||
{
|
||||
float oldTempo = tempo;
|
||||
float oldRate = rate;
|
||||
|
||||
tempo = virtualTempo / virtualPitch;
|
||||
rate = virtualPitch * virtualRate;
|
||||
|
||||
if (!TEST_FLOAT_EQUAL(rate,oldRate)) pRateTransposer->setRate(rate);
|
||||
if (!TEST_FLOAT_EQUAL(tempo, oldTempo)) pTDStretch->setTempo(tempo);
|
||||
|
||||
#ifndef SOUNDTOUCH_PREVENT_CLICK_AT_RATE_CROSSOVER
|
||||
if (rate <= 1.0f)
|
||||
{
|
||||
if (output != pTDStretch)
|
||||
{
|
||||
FIFOSamplePipe *tempoOut;
|
||||
|
||||
assert(output == pRateTransposer);
|
||||
// move samples in the current output buffer to the output of pTDStretch
|
||||
tempoOut = pTDStretch->getOutput();
|
||||
tempoOut->moveSamples(*output);
|
||||
// move samples in pitch transposer's store buffer to tempo changer's input
|
||||
pTDStretch->moveSamples(*pRateTransposer->getStore());
|
||||
|
||||
output = pTDStretch;
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
if (output != pRateTransposer)
|
||||
{
|
||||
FIFOSamplePipe *transOut;
|
||||
|
||||
assert(output == pTDStretch);
|
||||
// move samples in the current output buffer to the output of pRateTransposer
|
||||
transOut = pRateTransposer->getOutput();
|
||||
transOut->moveSamples(*output);
|
||||
// move samples in tempo changer's input to pitch transposer's input
|
||||
pRateTransposer->moveSamples(*pTDStretch->getInput());
|
||||
|
||||
output = pRateTransposer;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Sets sample rate.
|
||||
void SoundTouch::setSampleRate(uint srate)
|
||||
{
|
||||
bSrateSet = TRUE;
|
||||
// set sample rate, leave other tempo changer parameters as they are.
|
||||
pTDStretch->setParameters((int)srate);
|
||||
}
|
||||
|
||||
|
||||
// Adds 'numSamples' pcs of samples from the 'samples' memory position into
|
||||
// the input of the object.
|
||||
void SoundTouch::putSamples(const SAMPLETYPE *samples, uint nSamples)
|
||||
{
|
||||
if (bSrateSet == FALSE)
|
||||
{
|
||||
ST_THROW_RT_ERROR("SoundTouch : Sample rate not defined");
|
||||
}
|
||||
else if (channels == 0)
|
||||
{
|
||||
ST_THROW_RT_ERROR("SoundTouch : Number of channels not defined");
|
||||
}
|
||||
|
||||
// Transpose the rate of the new samples if necessary
|
||||
/* Bypass the nominal setting - can introduce a click in sound when tempo/pitch control crosses the nominal value...
|
||||
if (rate == 1.0f)
|
||||
{
|
||||
// The rate value is same as the original, simply evaluate the tempo changer.
|
||||
assert(output == pTDStretch);
|
||||
if (pRateTransposer->isEmpty() == 0)
|
||||
{
|
||||
// yet flush the last samples in the pitch transposer buffer
|
||||
// (may happen if 'rate' changes from a non-zero value to zero)
|
||||
pTDStretch->moveSamples(*pRateTransposer);
|
||||
}
|
||||
pTDStretch->putSamples(samples, nSamples);
|
||||
}
|
||||
*/
|
||||
#ifndef SOUNDTOUCH_PREVENT_CLICK_AT_RATE_CROSSOVER
|
||||
else if (rate <= 1.0f)
|
||||
{
|
||||
// transpose the rate down, output the transposed sound to tempo changer buffer
|
||||
assert(output == pTDStretch);
|
||||
pRateTransposer->putSamples(samples, nSamples);
|
||||
pTDStretch->moveSamples(*pRateTransposer);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
// evaluate the tempo changer, then transpose the rate up,
|
||||
assert(output == pRateTransposer);
|
||||
pTDStretch->putSamples(samples, nSamples);
|
||||
pRateTransposer->moveSamples(*pTDStretch);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Flushes the last samples from the processing pipeline to the output.
|
||||
// Clears also the internal processing buffers.
|
||||
//
|
||||
// Note: This function is meant for extracting the last samples of a sound
|
||||
// stream. This function may introduce additional blank samples in the end
|
||||
// of the sound stream, and thus it's not recommended to call this function
|
||||
// in the middle of a sound stream.
|
||||
void SoundTouch::flush()
|
||||
{
|
||||
int i;
|
||||
int nUnprocessed;
|
||||
int nOut;
|
||||
SAMPLETYPE buff[64*2]; // note: allocate 2*64 to cater 64 sample frames of stereo sound
|
||||
|
||||
// check how many samples still await processing, and scale
|
||||
// that by tempo & rate to get expected output sample count
|
||||
nUnprocessed = numUnprocessedSamples();
|
||||
nUnprocessed = (int)((double)nUnprocessed / (tempo * rate) + 0.5);
|
||||
|
||||
nOut = numSamples(); // ready samples currently in buffer ...
|
||||
nOut += nUnprocessed; // ... and how many we expect there to be in the end
|
||||
|
||||
memset(buff, 0, 64 * channels * sizeof(SAMPLETYPE));
|
||||
// "Push" the last active samples out from the processing pipeline by
|
||||
// feeding blank samples into the processing pipeline until new,
|
||||
// processed samples appear in the output (not however, more than
|
||||
// 8ksamples in any case)
|
||||
for (i = 0; i < 128; i ++)
|
||||
{
|
||||
putSamples(buff, 64);
|
||||
if ((int)numSamples() >= nOut)
|
||||
{
|
||||
// Enough new samples have appeared into the output!
|
||||
// As samples come from processing with bigger chunks, now truncate it
|
||||
// back to maximum "nOut" samples to improve duration accuracy
|
||||
adjustAmountOfSamples(nOut);
|
||||
|
||||
// finish
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Clear working buffers
|
||||
pRateTransposer->clear();
|
||||
pTDStretch->clearInput();
|
||||
// yet leave the 'tempoChanger' output intouched as that's where the
|
||||
// flushed samples are!
|
||||
}
|
||||
|
||||
|
||||
// Changes a setting controlling the processing system behaviour. See the
|
||||
// 'SETTING_...' defines for available setting ID's.
|
||||
BOOL SoundTouch::setSetting(int settingId, int value)
|
||||
{
|
||||
int sampleRate, sequenceMs, seekWindowMs, overlapMs;
|
||||
|
||||
// read current tdstretch routine parameters
|
||||
pTDStretch->getParameters(&sampleRate, &sequenceMs, &seekWindowMs, &overlapMs);
|
||||
|
||||
switch (settingId)
|
||||
{
|
||||
case SETTING_USE_AA_FILTER :
|
||||
// enables / disabless anti-alias filter
|
||||
pRateTransposer->enableAAFilter((value != 0) ? TRUE : FALSE);
|
||||
return TRUE;
|
||||
|
||||
case SETTING_AA_FILTER_LENGTH :
|
||||
// sets anti-alias filter length
|
||||
pRateTransposer->getAAFilter()->setLength(value);
|
||||
return TRUE;
|
||||
|
||||
case SETTING_USE_QUICKSEEK :
|
||||
// enables / disables tempo routine quick seeking algorithm
|
||||
pTDStretch->enableQuickSeek((value != 0) ? TRUE : FALSE);
|
||||
return TRUE;
|
||||
|
||||
case SETTING_SEQUENCE_MS:
|
||||
// change time-stretch sequence duration parameter
|
||||
pTDStretch->setParameters(sampleRate, value, seekWindowMs, overlapMs);
|
||||
return TRUE;
|
||||
|
||||
case SETTING_SEEKWINDOW_MS:
|
||||
// change time-stretch seek window length parameter
|
||||
pTDStretch->setParameters(sampleRate, sequenceMs, value, overlapMs);
|
||||
return TRUE;
|
||||
|
||||
case SETTING_OVERLAP_MS:
|
||||
// change time-stretch overlap length parameter
|
||||
pTDStretch->setParameters(sampleRate, sequenceMs, seekWindowMs, value);
|
||||
return TRUE;
|
||||
|
||||
default :
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Reads a setting controlling the processing system behaviour. See the
|
||||
// 'SETTING_...' defines for available setting ID's.
|
||||
//
|
||||
// Returns the setting value.
|
||||
int SoundTouch::getSetting(int settingId) const
|
||||
{
|
||||
int temp;
|
||||
|
||||
switch (settingId)
|
||||
{
|
||||
case SETTING_USE_AA_FILTER :
|
||||
return (uint)pRateTransposer->isAAFilterEnabled();
|
||||
|
||||
case SETTING_AA_FILTER_LENGTH :
|
||||
return pRateTransposer->getAAFilter()->getLength();
|
||||
|
||||
case SETTING_USE_QUICKSEEK :
|
||||
return (uint) pTDStretch->isQuickSeekEnabled();
|
||||
|
||||
case SETTING_SEQUENCE_MS:
|
||||
pTDStretch->getParameters(NULL, &temp, NULL, NULL);
|
||||
return temp;
|
||||
|
||||
case SETTING_SEEKWINDOW_MS:
|
||||
pTDStretch->getParameters(NULL, NULL, &temp, NULL);
|
||||
return temp;
|
||||
|
||||
case SETTING_OVERLAP_MS:
|
||||
pTDStretch->getParameters(NULL, NULL, NULL, &temp);
|
||||
return temp;
|
||||
|
||||
case SETTING_NOMINAL_INPUT_SEQUENCE :
|
||||
return pTDStretch->getInputSampleReq();
|
||||
|
||||
case SETTING_NOMINAL_OUTPUT_SEQUENCE :
|
||||
return pTDStretch->getOutputBatchSize();
|
||||
|
||||
default :
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Clears all the samples in the object's output and internal processing
|
||||
// buffers.
|
||||
void SoundTouch::clear()
|
||||
{
|
||||
pRateTransposer->clear();
|
||||
pTDStretch->clear();
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// Returns number of samples currently unprocessed.
|
||||
uint SoundTouch::numUnprocessedSamples() const
|
||||
{
|
||||
FIFOSamplePipe * psp;
|
||||
if (pTDStretch)
|
||||
{
|
||||
psp = pTDStretch->getInput();
|
||||
if (psp)
|
||||
{
|
||||
return psp->numSamples();
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
Vendored
-277
@@ -1,277 +0,0 @@
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// SoundTouch - main class for tempo/pitch/rate adjusting routines.
|
||||
///
|
||||
/// Notes:
|
||||
/// - Initialize the SoundTouch object instance by setting up the sound stream
|
||||
/// parameters with functions 'setSampleRate' and 'setChannels', then set
|
||||
/// desired tempo/pitch/rate settings with the corresponding functions.
|
||||
///
|
||||
/// - The SoundTouch class behaves like a first-in-first-out pipeline: The
|
||||
/// samples that are to be processed are fed into one of the pipe by calling
|
||||
/// function 'putSamples', while the ready processed samples can be read
|
||||
/// from the other end of the pipeline with function 'receiveSamples'.
|
||||
///
|
||||
/// - The SoundTouch processing classes require certain sized 'batches' of
|
||||
/// samples in order to process the sound. For this reason the classes buffer
|
||||
/// incoming samples until there are enough of samples available for
|
||||
/// processing, then they carry out the processing step and consequently
|
||||
/// make the processed samples available for outputting.
|
||||
///
|
||||
/// - For the above reason, the processing routines introduce a certain
|
||||
/// 'latency' between the input and output, so that the samples input to
|
||||
/// SoundTouch may not be immediately available in the output, and neither
|
||||
/// the amount of outputtable samples may not immediately be in direct
|
||||
/// relationship with the amount of previously input samples.
|
||||
///
|
||||
/// - The tempo/pitch/rate control parameters can be altered during processing.
|
||||
/// Please notice though that they aren't currently protected by semaphores,
|
||||
/// so in multi-thread application external semaphore protection may be
|
||||
/// required.
|
||||
///
|
||||
/// - This class utilizes classes 'TDStretch' for tempo change (without modifying
|
||||
/// pitch) and 'RateTransposer' for changing the playback rate (that is, both
|
||||
/// tempo and pitch in the same ratio) of the sound. The third available control
|
||||
/// 'pitch' (change pitch but maintain tempo) is produced by a combination of
|
||||
/// combining the two other controls.
|
||||
///
|
||||
/// Author : Copyright (c) Olli Parviainen
|
||||
/// Author e-mail : oparviai 'at' iki.fi
|
||||
/// SoundTouch WWW: http://www.surina.net/soundtouch
|
||||
///
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Last changed : $Date: 2012-12-28 17:32:59 -0200 (sex, 28 dez 2012) $
|
||||
// File revision : $Revision: 4 $
|
||||
//
|
||||
// $Id: SoundTouch.h 163 2012-12-28 19:32:59Z oparviai $
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// License :
|
||||
//
|
||||
// SoundTouch audio processing library
|
||||
// Copyright (c) Olli Parviainen
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Lesser General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2.1 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public
|
||||
// License along with this library; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef SoundTouch_H
|
||||
#define SoundTouch_H
|
||||
|
||||
#include "FIFOSamplePipe.h"
|
||||
#include "STTypes.h"
|
||||
|
||||
namespace soundtouch
|
||||
{
|
||||
|
||||
/// Soundtouch library version string
|
||||
#define SOUNDTOUCH_VERSION "1.7.1"
|
||||
|
||||
/// SoundTouch library version id
|
||||
#define SOUNDTOUCH_VERSION_ID (10701)
|
||||
|
||||
//
|
||||
// Available setting IDs for the 'setSetting' & 'get_setting' functions:
|
||||
|
||||
/// Enable/disable anti-alias filter in pitch transposer (0 = disable)
|
||||
#define SETTING_USE_AA_FILTER 0
|
||||
|
||||
/// Pitch transposer anti-alias filter length (8 .. 128 taps, default = 32)
|
||||
#define SETTING_AA_FILTER_LENGTH 1
|
||||
|
||||
/// Enable/disable quick seeking algorithm in tempo changer routine
|
||||
/// (enabling quick seeking lowers CPU utilization but causes a minor sound
|
||||
/// quality compromising)
|
||||
#define SETTING_USE_QUICKSEEK 2
|
||||
|
||||
/// Time-stretch algorithm single processing sequence length in milliseconds. This determines
|
||||
/// to how long sequences the original sound is chopped in the time-stretch algorithm.
|
||||
/// See "STTypes.h" or README for more information.
|
||||
#define SETTING_SEQUENCE_MS 3
|
||||
|
||||
/// Time-stretch algorithm seeking window length in milliseconds for algorithm that finds the
|
||||
/// best possible overlapping location. This determines from how wide window the algorithm
|
||||
/// may look for an optimal joining location when mixing the sound sequences back together.
|
||||
/// See "STTypes.h" or README for more information.
|
||||
#define SETTING_SEEKWINDOW_MS 4
|
||||
|
||||
/// Time-stretch algorithm overlap length in milliseconds. When the chopped sound sequences
|
||||
/// are mixed back together, to form a continuous sound stream, this parameter defines over
|
||||
/// how long period the two consecutive sequences are let to overlap each other.
|
||||
/// See "STTypes.h" or README for more information.
|
||||
#define SETTING_OVERLAP_MS 5
|
||||
|
||||
|
||||
/// Call "getSetting" with this ID to query nominal average processing sequence
|
||||
/// size in samples. This value tells approcimate value how many input samples
|
||||
/// SoundTouch needs to gather before it does DSP processing run for the sample batch.
|
||||
///
|
||||
/// Notices:
|
||||
/// - This is read-only parameter, i.e. setSetting ignores this parameter
|
||||
/// - Returned value is approximate average value, exact processing batch
|
||||
/// size may wary from time to time
|
||||
/// - This parameter value is not constant but may change depending on
|
||||
/// tempo/pitch/rate/samplerate settings.
|
||||
#define SETTING_NOMINAL_INPUT_SEQUENCE 6
|
||||
|
||||
|
||||
/// Call "getSetting" with this ID to query nominal average processing output
|
||||
/// size in samples. This value tells approcimate value how many output samples
|
||||
/// SoundTouch outputs once it does DSP processing run for a batch of input samples.
|
||||
///
|
||||
/// Notices:
|
||||
/// - This is read-only parameter, i.e. setSetting ignores this parameter
|
||||
/// - Returned value is approximate average value, exact processing batch
|
||||
/// size may wary from time to time
|
||||
/// - This parameter value is not constant but may change depending on
|
||||
/// tempo/pitch/rate/samplerate settings.
|
||||
#define SETTING_NOMINAL_OUTPUT_SEQUENCE 7
|
||||
|
||||
class SoundTouch : public FIFOProcessor
|
||||
{
|
||||
private:
|
||||
/// Rate transposer class instance
|
||||
class RateTransposer *pRateTransposer;
|
||||
|
||||
/// Time-stretch class instance
|
||||
class TDStretch *pTDStretch;
|
||||
|
||||
/// Virtual pitch parameter. Effective rate & tempo are calculated from these parameters.
|
||||
float virtualRate;
|
||||
|
||||
/// Virtual pitch parameter. Effective rate & tempo are calculated from these parameters.
|
||||
float virtualTempo;
|
||||
|
||||
/// Virtual pitch parameter. Effective rate & tempo are calculated from these parameters.
|
||||
float virtualPitch;
|
||||
|
||||
/// Flag: Has sample rate been set?
|
||||
BOOL bSrateSet;
|
||||
|
||||
/// Calculates effective rate & tempo valuescfrom 'virtualRate', 'virtualTempo' and
|
||||
/// 'virtualPitch' parameters.
|
||||
void calcEffectiveRateAndTempo();
|
||||
|
||||
protected :
|
||||
/// Number of channels
|
||||
uint channels;
|
||||
|
||||
/// Effective 'rate' value calculated from 'virtualRate', 'virtualTempo' and 'virtualPitch'
|
||||
float rate;
|
||||
|
||||
/// Effective 'tempo' value calculated from 'virtualRate', 'virtualTempo' and 'virtualPitch'
|
||||
float tempo;
|
||||
|
||||
public:
|
||||
SoundTouch();
|
||||
virtual ~SoundTouch();
|
||||
|
||||
/// Get SoundTouch library version string
|
||||
static const char *getVersionString();
|
||||
|
||||
/// Get SoundTouch library version Id
|
||||
static uint getVersionId();
|
||||
|
||||
/// Sets new rate control value. Normal rate = 1.0, smaller values
|
||||
/// represent slower rate, larger faster rates.
|
||||
void setRate(float newRate);
|
||||
|
||||
/// Sets new tempo control value. Normal tempo = 1.0, smaller values
|
||||
/// represent slower tempo, larger faster tempo.
|
||||
void setTempo(float newTempo);
|
||||
|
||||
/// Sets new rate control value as a difference in percents compared
|
||||
/// to the original rate (-50 .. +100 %)
|
||||
void setRateChange(float newRate);
|
||||
|
||||
/// Sets new tempo control value as a difference in percents compared
|
||||
/// to the original tempo (-50 .. +100 %)
|
||||
void setTempoChange(float newTempo);
|
||||
|
||||
/// Sets new pitch control value. Original pitch = 1.0, smaller values
|
||||
/// represent lower pitches, larger values higher pitch.
|
||||
void setPitch(float newPitch);
|
||||
|
||||
/// Sets pitch change in octaves compared to the original pitch
|
||||
/// (-1.00 .. +1.00)
|
||||
void setPitchOctaves(float newPitch);
|
||||
|
||||
/// Sets pitch change in semi-tones compared to the original pitch
|
||||
/// (-12 .. +12)
|
||||
void setPitchSemiTones(int newPitch);
|
||||
void setPitchSemiTones(float newPitch);
|
||||
|
||||
/// Sets the number of channels, 1 = mono, 2 = stereo
|
||||
void setChannels(uint numChannels);
|
||||
|
||||
/// Sets sample rate.
|
||||
void setSampleRate(uint srate);
|
||||
|
||||
/// Flushes the last samples from the processing pipeline to the output.
|
||||
/// Clears also the internal processing buffers.
|
||||
//
|
||||
/// Note: This function is meant for extracting the last samples of a sound
|
||||
/// stream. This function may introduce additional blank samples in the end
|
||||
/// of the sound stream, and thus it's not recommended to call this function
|
||||
/// in the middle of a sound stream.
|
||||
void flush();
|
||||
|
||||
/// Adds 'numSamples' pcs of samples from the 'samples' memory position into
|
||||
/// the input of the object. Notice that sample rate _has_to_ be set before
|
||||
/// calling this function, otherwise throws a runtime_error exception.
|
||||
virtual void putSamples(
|
||||
const SAMPLETYPE *samples, ///< Pointer to sample buffer.
|
||||
uint numSamples ///< Number of samples in buffer. Notice
|
||||
///< that in case of stereo-sound a single sample
|
||||
///< contains data for both channels.
|
||||
);
|
||||
|
||||
/// Clears all the samples in the object's output and internal processing
|
||||
/// buffers.
|
||||
virtual void clear();
|
||||
|
||||
/// Changes a setting controlling the processing system behaviour. See the
|
||||
/// 'SETTING_...' defines for available setting ID's.
|
||||
///
|
||||
/// \return 'TRUE' if the setting was succesfully changed
|
||||
BOOL setSetting(int settingId, ///< Setting ID number. see SETTING_... defines.
|
||||
int value ///< New setting value.
|
||||
);
|
||||
|
||||
/// Reads a setting controlling the processing system behaviour. See the
|
||||
/// 'SETTING_...' defines for available setting ID's.
|
||||
///
|
||||
/// \return the setting value.
|
||||
int getSetting(int settingId ///< Setting ID number, see SETTING_... defines.
|
||||
) const;
|
||||
|
||||
/// Returns number of samples currently unprocessed.
|
||||
virtual uint numUnprocessedSamples() const;
|
||||
|
||||
|
||||
/// Other handy functions that are implemented in the ancestor classes (see
|
||||
/// classes 'FIFOProcessor' and 'FIFOSamplePipe')
|
||||
///
|
||||
/// - receiveSamples() : Use this function to receive 'ready' processed samples from SoundTouch.
|
||||
/// - numSamples() : Get number of 'ready' samples that can be received with
|
||||
/// function 'receiveSamples()'
|
||||
/// - isEmpty() : Returns nonzero if there aren't any 'ready' samples.
|
||||
/// - clear() : Clears all samples from ready/processing buffers.
|
||||
};
|
||||
|
||||
}
|
||||
#endif
|
||||
-285
@@ -1,285 +0,0 @@
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="9.00"
|
||||
Name="SoundTouch"
|
||||
ProjectGUID="{E9B51944-7E6D-4BCD-83F2-7BBD5A46182D}"
|
||||
RootNamespace="SoundTouch"
|
||||
TargetFrameworkVersion="0"
|
||||
>
|
||||
<Platforms>
|
||||
<Platform
|
||||
Name="Win32"
|
||||
/>
|
||||
</Platforms>
|
||||
<ToolFiles>
|
||||
</ToolFiles>
|
||||
<Configurations>
|
||||
<Configuration
|
||||
Name="Debug|Win32"
|
||||
ConfigurationType="4"
|
||||
InheritedPropertySheets="..\DefaultProjectRootDir.vsprops;..\3rdparty.vsprops;..\..\common\vsprops\CodeGen_Debug.vsprops;..\..\common\vsprops\IncrementalLinking.vsprops"
|
||||
CharacterSet="2"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
WarningLevel="3"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLibrarianTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Release|Win32"
|
||||
ConfigurationType="4"
|
||||
InheritedPropertySheets="..\DefaultProjectRootDir.vsprops;..\3rdparty.vsprops;..\..\common\vsprops\CodeGen_Release.vsprops"
|
||||
CharacterSet="2"
|
||||
WholeProgramOptimization="1"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
WarningLevel="3"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLibrarianTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
<Configuration
|
||||
Name="Devel|Win32"
|
||||
ConfigurationType="4"
|
||||
InheritedPropertySheets="..\DefaultProjectRootDir.vsprops;..\3rdparty.vsprops;..\..\common\vsprops\CodeGen_Devel.vsprops;..\..\common\vsprops\IncrementalLinking.vsprops"
|
||||
CharacterSet="2"
|
||||
WholeProgramOptimization="1"
|
||||
>
|
||||
<Tool
|
||||
Name="VCPreBuildEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCustomBuildTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXMLDataGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCWebServiceProxyGeneratorTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCMIDLTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCManagedResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCResourceCompilerTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPreLinkEventTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCLibrarianTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCALinkTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCXDCMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCBscMakeTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCFxCopTool"
|
||||
/>
|
||||
<Tool
|
||||
Name="VCPostBuildEventTool"
|
||||
/>
|
||||
</Configuration>
|
||||
</Configurations>
|
||||
<References>
|
||||
</References>
|
||||
<Files>
|
||||
<Filter
|
||||
Name="Source Files"
|
||||
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
||||
>
|
||||
<File
|
||||
RelativePath=".\3dnow_win.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\AAFilter.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\cpu_detect_x86_win.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\FIFOSampleBuffer.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\FIRFilter.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\mmx_optimized.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\RateTransposer.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\SoundTouch.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\sse_optimized.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\TDStretch.cpp"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\WavFile.cpp"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Header Files"
|
||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
|
||||
>
|
||||
<File
|
||||
RelativePath=".\AAFilter.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\BPMDetect.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\cpu_detect.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\FIFOSampleBuffer.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\FIFOSamplePipe.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\FIRFilter.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\RateTransposer.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\SoundTouch.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\STTypes.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\TDStretch.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\WavFile.h"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
</Files>
|
||||
<Globals>
|
||||
</Globals>
|
||||
</VisualStudioProject>
|
||||
-112
@@ -1,112 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Devel|Win32">
|
||||
<Configuration>Devel</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{E9B51944-7E6D-4BCD-83F2-7BBD5A46182D}</ProjectGuid>
|
||||
<RootNamespace>SoundTouch</RootNamespace>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Devel|Win32'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Devel|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="..\DefaultProjectRootDir.props" />
|
||||
<Import Project="..\3rdparty.props" />
|
||||
<Import Project="..\..\common\vsprops\CodeGen_Devel.props" />
|
||||
<Import Project="..\..\common\vsprops\IncrementalLinking.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="..\DefaultProjectRootDir.props" />
|
||||
<Import Project="..\3rdparty.props" />
|
||||
<Import Project="..\..\common\vsprops\CodeGen_Release.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="..\DefaultProjectRootDir.props" />
|
||||
<Import Project="..\3rdparty.props" />
|
||||
<Import Project="..\..\common\vsprops\CodeGen_Debug.props" />
|
||||
<Import Project="..\..\common\vsprops\IncrementalLinking.props" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup>
|
||||
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
|
||||
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
|
||||
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
|
||||
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Devel|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Devel|Win32'" />
|
||||
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Devel|Win32'" />
|
||||
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
|
||||
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
|
||||
<TargetName Condition="'$(Configuration)|$(Platform)'=='Devel|Win32'">$(ProjectName)-dev</TargetName>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
</ClCompile>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
</ClCompile>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="3dnow_win.cpp" />
|
||||
<ClCompile Include="AAFilter.cpp" />
|
||||
<ClCompile Include="cpu_detect_x86_win.cpp" />
|
||||
<ClCompile Include="FIFOSampleBuffer.cpp" />
|
||||
<ClCompile Include="FIRFilter.cpp" />
|
||||
<ClCompile Include="mmx_optimized.cpp" />
|
||||
<ClCompile Include="RateTransposer.cpp" />
|
||||
<ClCompile Include="SoundTouch.cpp" />
|
||||
<ClCompile Include="sse_optimized.cpp" />
|
||||
<ClCompile Include="TDStretch.cpp" />
|
||||
<ClCompile Include="WavFile.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="AAFilter.h" />
|
||||
<ClInclude Include="BPMDetect.h" />
|
||||
<ClInclude Include="cpu_detect.h" />
|
||||
<ClInclude Include="FIFOSampleBuffer.h" />
|
||||
<ClInclude Include="FIFOSamplePipe.h" />
|
||||
<ClInclude Include="FIRFilter.h" />
|
||||
<ClInclude Include="RateTransposer.h" />
|
||||
<ClInclude Include="SoundTouch.h" />
|
||||
<ClInclude Include="STTypes.h" />
|
||||
<ClInclude Include="TDStretch.h" />
|
||||
<ClInclude Include="WavFile.h" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
-83
@@ -1,83 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="Source Files">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Header Files">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="3dnow_win.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="AAFilter.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="cpu_detect_x86_win.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="FIFOSampleBuffer.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="FIRFilter.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="mmx_optimized.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="RateTransposer.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="SoundTouch.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="sse_optimized.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="TDStretch.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="WavFile.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="AAFilter.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="BPMDetect.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="cpu_detect.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="FIFOSampleBuffer.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="FIFOSamplePipe.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="FIRFilter.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="RateTransposer.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="SoundTouch.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="STTypes.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="TDStretch.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="WavFile.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
-116
@@ -1,116 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Devel|Win32">
|
||||
<Configuration>Devel</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{E9B51944-7E6D-4BCD-83F2-7BBD5A46182D}</ProjectGuid>
|
||||
<RootNamespace>SoundTouch</RootNamespace>
|
||||
<ProjectName>SoundTouch</ProjectName>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Devel|Win32'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<PlatformToolset>v110_xp</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<PlatformToolset>v110_xp</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<PlatformToolset>v110_xp</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Devel|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="..\DefaultProjectRootDir.props" />
|
||||
<Import Project="..\3rdparty.props" />
|
||||
<Import Project="..\..\common\vsprops\CodeGen_Devel.props" />
|
||||
<Import Project="..\..\common\vsprops\IncrementalLinking.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="..\DefaultProjectRootDir.props" />
|
||||
<Import Project="..\3rdparty.props" />
|
||||
<Import Project="..\..\common\vsprops\CodeGen_Release.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="..\DefaultProjectRootDir.props" />
|
||||
<Import Project="..\3rdparty.props" />
|
||||
<Import Project="..\..\common\vsprops\CodeGen_Debug.props" />
|
||||
<Import Project="..\..\common\vsprops\IncrementalLinking.props" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup>
|
||||
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
|
||||
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
|
||||
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
|
||||
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Devel|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Devel|Win32'" />
|
||||
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Devel|Win32'" />
|
||||
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
|
||||
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
|
||||
<TargetName Condition="'$(Configuration)|$(Platform)'=='Devel|Win32'">$(ProjectName)-dev</TargetName>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
</ClCompile>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
</ClCompile>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="3dnow_win.cpp" />
|
||||
<ClCompile Include="AAFilter.cpp" />
|
||||
<ClCompile Include="cpu_detect_x86_win.cpp" />
|
||||
<ClCompile Include="FIFOSampleBuffer.cpp" />
|
||||
<ClCompile Include="FIRFilter.cpp" />
|
||||
<ClCompile Include="mmx_optimized.cpp" />
|
||||
<ClCompile Include="RateTransposer.cpp" />
|
||||
<ClCompile Include="SoundTouch.cpp" />
|
||||
<ClCompile Include="sse_optimized.cpp" />
|
||||
<ClCompile Include="TDStretch.cpp" />
|
||||
<ClCompile Include="WavFile.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="AAFilter.h" />
|
||||
<ClInclude Include="BPMDetect.h" />
|
||||
<ClInclude Include="cpu_detect.h" />
|
||||
<ClInclude Include="FIFOSampleBuffer.h" />
|
||||
<ClInclude Include="FIFOSamplePipe.h" />
|
||||
<ClInclude Include="FIRFilter.h" />
|
||||
<ClInclude Include="RateTransposer.h" />
|
||||
<ClInclude Include="SoundTouch.h" />
|
||||
<ClInclude Include="STTypes.h" />
|
||||
<ClInclude Include="TDStretch.h" />
|
||||
<ClInclude Include="WavFile.h" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
@@ -1,83 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="Source Files">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Header Files">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="3dnow_win.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="AAFilter.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="cpu_detect_x86_win.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="FIFOSampleBuffer.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="FIRFilter.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="mmx_optimized.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="RateTransposer.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="SoundTouch.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="sse_optimized.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="TDStretch.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="WavFile.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="AAFilter.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="BPMDetect.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="cpu_detect.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="FIFOSampleBuffer.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="FIFOSamplePipe.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="FIRFilter.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="RateTransposer.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="SoundTouch.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="STTypes.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="TDStretch.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="WavFile.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
-116
@@ -1,116 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Devel|Win32">
|
||||
<Configuration>Devel</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{E9B51944-7E6D-4BCD-83F2-7BBD5A46182D}</ProjectGuid>
|
||||
<RootNamespace>SoundTouch</RootNamespace>
|
||||
<ProjectName>SoundTouch</ProjectName>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Devel|Win32'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<PlatformToolset>v120_xp</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<PlatformToolset>v120_xp</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<PlatformToolset>v120_xp</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Devel|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="..\DefaultProjectRootDir.props" />
|
||||
<Import Project="..\3rdparty.props" />
|
||||
<Import Project="..\..\common\vsprops\CodeGen_Devel.props" />
|
||||
<Import Project="..\..\common\vsprops\IncrementalLinking.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="..\DefaultProjectRootDir.props" />
|
||||
<Import Project="..\3rdparty.props" />
|
||||
<Import Project="..\..\common\vsprops\CodeGen_Release.props" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
<Import Project="..\DefaultProjectRootDir.props" />
|
||||
<Import Project="..\3rdparty.props" />
|
||||
<Import Project="..\..\common\vsprops\CodeGen_Debug.props" />
|
||||
<Import Project="..\..\common\vsprops\IncrementalLinking.props" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup>
|
||||
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
|
||||
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
|
||||
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
|
||||
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Devel|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Devel|Win32'" />
|
||||
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Devel|Win32'" />
|
||||
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
|
||||
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
|
||||
<TargetName Condition="'$(Configuration)|$(Platform)'=='Devel|Win32'">$(ProjectName)-dev</TargetName>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
</ClCompile>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
</ClCompile>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="3dnow_win.cpp" />
|
||||
<ClCompile Include="AAFilter.cpp" />
|
||||
<ClCompile Include="cpu_detect_x86_win.cpp" />
|
||||
<ClCompile Include="FIFOSampleBuffer.cpp" />
|
||||
<ClCompile Include="FIRFilter.cpp" />
|
||||
<ClCompile Include="mmx_optimized.cpp" />
|
||||
<ClCompile Include="RateTransposer.cpp" />
|
||||
<ClCompile Include="SoundTouch.cpp" />
|
||||
<ClCompile Include="sse_optimized.cpp" />
|
||||
<ClCompile Include="TDStretch.cpp" />
|
||||
<ClCompile Include="WavFile.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="AAFilter.h" />
|
||||
<ClInclude Include="BPMDetect.h" />
|
||||
<ClInclude Include="cpu_detect.h" />
|
||||
<ClInclude Include="FIFOSampleBuffer.h" />
|
||||
<ClInclude Include="FIFOSamplePipe.h" />
|
||||
<ClInclude Include="FIRFilter.h" />
|
||||
<ClInclude Include="RateTransposer.h" />
|
||||
<ClInclude Include="SoundTouch.h" />
|
||||
<ClInclude Include="STTypes.h" />
|
||||
<ClInclude Include="TDStretch.h" />
|
||||
<ClInclude Include="WavFile.h" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
@@ -1,83 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="Source Files">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Header Files">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="3dnow_win.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="AAFilter.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="cpu_detect_x86_win.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="FIFOSampleBuffer.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="FIRFilter.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="mmx_optimized.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="RateTransposer.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="SoundTouch.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="sse_optimized.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="TDStretch.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="WavFile.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="AAFilter.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="BPMDetect.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="cpu_detect.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="FIFOSampleBuffer.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="FIFOSamplePipe.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="FIRFilter.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="RateTransposer.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="SoundTouch.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="STTypes.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="TDStretch.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="WavFile.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
Vendored
-808
@@ -1,808 +0,0 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Sampled sound tempo changer/time stretch algorithm. Changes the sound tempo
|
||||
/// while maintaining the original pitch by using a time domain WSOLA-like
|
||||
/// method with several performance-increasing tweaks.
|
||||
///
|
||||
/// Note : MMX optimized functions reside in a separate, platform-specific
|
||||
/// file, e.g. 'mmx_win.cpp' or 'mmx_gcc.cpp'
|
||||
///
|
||||
/// Author : Copyright (c) Olli Parviainen
|
||||
/// Author e-mail : oparviai 'at' iki.fi
|
||||
/// SoundTouch WWW: http://www.surina.net/soundtouch
|
||||
///
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Last changed : $Date: 2012-11-08 16:53:01 -0200 (qui, 08 nov 2012) $
|
||||
// File revision : $Revision: 1.12 $
|
||||
//
|
||||
// $Id: TDStretch.cpp 160 2012-11-08 18:53:01Z oparviai $
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// License :
|
||||
//
|
||||
// SoundTouch audio processing library
|
||||
// Copyright (c) Olli Parviainen
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Lesser General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2.1 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public
|
||||
// License along with this library; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <string.h>
|
||||
#include <limits.h>
|
||||
#include <assert.h>
|
||||
#include <math.h>
|
||||
#include <float.h>
|
||||
|
||||
#include "STTypes.h"
|
||||
#include "cpu_detect.h"
|
||||
#include "TDStretch.h"
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
using namespace soundtouch;
|
||||
|
||||
#define max(x, y) (((x) > (y)) ? (x) : (y))
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Constant definitions
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
// Table for the hierarchical mixing position seeking algorithm
|
||||
static const short _scanOffsets[5][24]={
|
||||
{ 124, 186, 248, 310, 372, 434, 496, 558, 620, 682, 744, 806,
|
||||
868, 930, 992, 1054, 1116, 1178, 1240, 1302, 1364, 1426, 1488, 0},
|
||||
{-100, -75, -50, -25, 25, 50, 75, 100, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{ -20, -15, -10, -5, 5, 10, 15, 20, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{ -4, -3, -2, -1, 1, 2, 3, 4, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{ 121, 114, 97, 114, 98, 105, 108, 32, 104, 99, 117, 111,
|
||||
116, 100, 110, 117, 111, 115, 0, 0, 0, 0, 0, 0}};
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Implementation of the class 'TDStretch'
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
|
||||
TDStretch::TDStretch() : FIFOProcessor(&outputBuffer)
|
||||
{
|
||||
bQuickSeek = FALSE;
|
||||
channels = 2;
|
||||
|
||||
pMidBuffer = NULL;
|
||||
pMidBufferUnaligned = NULL;
|
||||
overlapLength = 0;
|
||||
|
||||
bAutoSeqSetting = TRUE;
|
||||
bAutoSeekSetting = TRUE;
|
||||
|
||||
// outDebt = 0;
|
||||
skipFract = 0;
|
||||
|
||||
tempo = 1.0f;
|
||||
setParameters(44100, DEFAULT_SEQUENCE_MS, DEFAULT_SEEKWINDOW_MS, DEFAULT_OVERLAP_MS);
|
||||
setTempo(1.0f);
|
||||
|
||||
clear();
|
||||
}
|
||||
|
||||
|
||||
|
||||
TDStretch::~TDStretch()
|
||||
{
|
||||
delete[] pMidBufferUnaligned;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Sets routine control parameters. These control are certain time constants
|
||||
// defining how the sound is stretched to the desired duration.
|
||||
//
|
||||
// 'sampleRate' = sample rate of the sound
|
||||
// 'sequenceMS' = one processing sequence length in milliseconds (default = 82 ms)
|
||||
// 'seekwindowMS' = seeking window length for scanning the best overlapping
|
||||
// position (default = 28 ms)
|
||||
// 'overlapMS' = overlapping length (default = 12 ms)
|
||||
|
||||
void TDStretch::setParameters(int aSampleRate, int aSequenceMS,
|
||||
int aSeekWindowMS, int aOverlapMS)
|
||||
{
|
||||
// accept only positive parameter values - if zero or negative, use old values instead
|
||||
if (aSampleRate > 0) this->sampleRate = aSampleRate;
|
||||
if (aOverlapMS > 0) this->overlapMs = aOverlapMS;
|
||||
|
||||
if (aSequenceMS > 0)
|
||||
{
|
||||
this->sequenceMs = aSequenceMS;
|
||||
bAutoSeqSetting = FALSE;
|
||||
}
|
||||
else if (aSequenceMS == 0)
|
||||
{
|
||||
// if zero, use automatic setting
|
||||
bAutoSeqSetting = TRUE;
|
||||
}
|
||||
|
||||
if (aSeekWindowMS > 0)
|
||||
{
|
||||
this->seekWindowMs = aSeekWindowMS;
|
||||
bAutoSeekSetting = FALSE;
|
||||
}
|
||||
else if (aSeekWindowMS == 0)
|
||||
{
|
||||
// if zero, use automatic setting
|
||||
bAutoSeekSetting = TRUE;
|
||||
}
|
||||
|
||||
calcSeqParameters();
|
||||
|
||||
calculateOverlapLength(overlapMs);
|
||||
|
||||
// set tempo to recalculate 'sampleReq'
|
||||
setTempo(tempo);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// Get routine control parameters, see setParameters() function.
|
||||
/// Any of the parameters to this function can be NULL, in such case corresponding parameter
|
||||
/// value isn't returned.
|
||||
void TDStretch::getParameters(int *pSampleRate, int *pSequenceMs, int *pSeekWindowMs, int *pOverlapMs) const
|
||||
{
|
||||
if (pSampleRate)
|
||||
{
|
||||
*pSampleRate = sampleRate;
|
||||
}
|
||||
|
||||
if (pSequenceMs)
|
||||
{
|
||||
*pSequenceMs = (bAutoSeqSetting) ? (USE_AUTO_SEQUENCE_LEN) : sequenceMs;
|
||||
}
|
||||
|
||||
if (pSeekWindowMs)
|
||||
{
|
||||
*pSeekWindowMs = (bAutoSeekSetting) ? (USE_AUTO_SEEKWINDOW_LEN) : seekWindowMs;
|
||||
}
|
||||
|
||||
if (pOverlapMs)
|
||||
{
|
||||
*pOverlapMs = overlapMs;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Overlaps samples in 'midBuffer' with the samples in 'pInput'
|
||||
void TDStretch::overlapMono(SAMPLETYPE *pOutput, const SAMPLETYPE *pInput) const
|
||||
{
|
||||
int i;
|
||||
SAMPLETYPE m1, m2;
|
||||
|
||||
m1 = (SAMPLETYPE)0;
|
||||
m2 = (SAMPLETYPE)overlapLength;
|
||||
|
||||
for (i = 0; i < overlapLength ; i ++)
|
||||
{
|
||||
pOutput[i] = (pInput[i] * m1 + pMidBuffer[i] * m2 ) / overlapLength;
|
||||
m1 += 1;
|
||||
m2 -= 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void TDStretch::clearMidBuffer()
|
||||
{
|
||||
memset(pMidBuffer, 0, 2 * sizeof(SAMPLETYPE) * overlapLength);
|
||||
}
|
||||
|
||||
|
||||
void TDStretch::clearInput()
|
||||
{
|
||||
inputBuffer.clear();
|
||||
clearMidBuffer();
|
||||
}
|
||||
|
||||
|
||||
// Clears the sample buffers
|
||||
void TDStretch::clear()
|
||||
{
|
||||
outputBuffer.clear();
|
||||
clearInput();
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Enables/disables the quick position seeking algorithm. Zero to disable, nonzero
|
||||
// to enable
|
||||
void TDStretch::enableQuickSeek(BOOL enable)
|
||||
{
|
||||
bQuickSeek = enable;
|
||||
}
|
||||
|
||||
|
||||
// Returns nonzero if the quick seeking algorithm is enabled.
|
||||
BOOL TDStretch::isQuickSeekEnabled() const
|
||||
{
|
||||
return bQuickSeek;
|
||||
}
|
||||
|
||||
|
||||
// Seeks for the optimal overlap-mixing position.
|
||||
int TDStretch::seekBestOverlapPosition(const SAMPLETYPE *refPos)
|
||||
{
|
||||
if (bQuickSeek)
|
||||
{
|
||||
return seekBestOverlapPositionQuick(refPos);
|
||||
}
|
||||
else
|
||||
{
|
||||
return seekBestOverlapPositionFull(refPos);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Overlaps samples in 'midBuffer' with the samples in 'pInputBuffer' at position
|
||||
// of 'ovlPos'.
|
||||
inline void TDStretch::overlap(SAMPLETYPE *pOutput, const SAMPLETYPE *pInput, uint ovlPos) const
|
||||
{
|
||||
if (channels == 2)
|
||||
{
|
||||
// stereo sound
|
||||
overlapStereo(pOutput, pInput + 2 * ovlPos);
|
||||
} else {
|
||||
// mono sound.
|
||||
overlapMono(pOutput, pInput + ovlPos);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Seeks for the optimal overlap-mixing position. The 'stereo' version of the
|
||||
// routine
|
||||
//
|
||||
// The best position is determined as the position where the two overlapped
|
||||
// sample sequences are 'most alike', in terms of the highest cross-correlation
|
||||
// value over the overlapping period
|
||||
int TDStretch::seekBestOverlapPositionFull(const SAMPLETYPE *refPos)
|
||||
{
|
||||
int bestOffs;
|
||||
double bestCorr, corr;
|
||||
int i;
|
||||
|
||||
bestCorr = FLT_MIN;
|
||||
bestOffs = 0;
|
||||
|
||||
// Scans for the best correlation value by testing each possible position
|
||||
// over the permitted range.
|
||||
for (i = 0; i < seekLength; i ++)
|
||||
{
|
||||
// Calculates correlation value for the mixing position corresponding
|
||||
// to 'i'
|
||||
corr = calcCrossCorr(refPos + channels * i, pMidBuffer);
|
||||
// heuristic rule to slightly favour values close to mid of the range
|
||||
double tmp = (double)(2 * i - seekLength) / (double)seekLength;
|
||||
corr = ((corr + 0.1) * (1.0 - 0.25 * tmp * tmp));
|
||||
|
||||
// Checks for the highest correlation value
|
||||
if (corr > bestCorr)
|
||||
{
|
||||
bestCorr = corr;
|
||||
bestOffs = i;
|
||||
}
|
||||
}
|
||||
// clear cross correlation routine state if necessary (is so e.g. in MMX routines).
|
||||
clearCrossCorrState();
|
||||
|
||||
return bestOffs;
|
||||
}
|
||||
|
||||
|
||||
// Seeks for the optimal overlap-mixing position. The 'stereo' version of the
|
||||
// routine
|
||||
//
|
||||
// The best position is determined as the position where the two overlapped
|
||||
// sample sequences are 'most alike', in terms of the highest cross-correlation
|
||||
// value over the overlapping period
|
||||
int TDStretch::seekBestOverlapPositionQuick(const SAMPLETYPE *refPos)
|
||||
{
|
||||
int j;
|
||||
int bestOffs;
|
||||
double bestCorr, corr;
|
||||
int scanCount, corrOffset, tempOffset;
|
||||
|
||||
bestCorr = FLT_MIN;
|
||||
bestOffs = _scanOffsets[0][0];
|
||||
corrOffset = 0;
|
||||
tempOffset = 0;
|
||||
|
||||
// Scans for the best correlation value using four-pass hierarchical search.
|
||||
//
|
||||
// The look-up table 'scans' has hierarchical position adjusting steps.
|
||||
// In first pass the routine searhes for the highest correlation with
|
||||
// relatively coarse steps, then rescans the neighbourhood of the highest
|
||||
// correlation with better resolution and so on.
|
||||
for (scanCount = 0;scanCount < 4; scanCount ++)
|
||||
{
|
||||
j = 0;
|
||||
while (_scanOffsets[scanCount][j])
|
||||
{
|
||||
tempOffset = corrOffset + _scanOffsets[scanCount][j];
|
||||
if (tempOffset >= seekLength) break;
|
||||
|
||||
// Calculates correlation value for the mixing position corresponding
|
||||
// to 'tempOffset'
|
||||
corr = (double)calcCrossCorr(refPos + channels * tempOffset, pMidBuffer);
|
||||
// heuristic rule to slightly favour values close to mid of the range
|
||||
double tmp = (double)(2 * tempOffset - seekLength) / seekLength;
|
||||
corr = ((corr + 0.1) * (1.0 - 0.25 * tmp * tmp));
|
||||
|
||||
// Checks for the highest correlation value
|
||||
if (corr > bestCorr)
|
||||
{
|
||||
bestCorr = corr;
|
||||
bestOffs = tempOffset;
|
||||
}
|
||||
j ++;
|
||||
}
|
||||
corrOffset = bestOffs;
|
||||
}
|
||||
// clear cross correlation routine state if necessary (is so e.g. in MMX routines).
|
||||
clearCrossCorrState();
|
||||
|
||||
return bestOffs;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// clear cross correlation routine state if necessary
|
||||
void TDStretch::clearCrossCorrState()
|
||||
{
|
||||
// default implementation is empty.
|
||||
}
|
||||
|
||||
|
||||
/// Calculates processing sequence length according to tempo setting
|
||||
void TDStretch::calcSeqParameters()
|
||||
{
|
||||
// Adjust tempo param according to tempo, so that variating processing sequence length is used
|
||||
// at varius tempo settings, between the given low...top limits
|
||||
#define AUTOSEQ_TEMPO_LOW 0.5 // auto setting low tempo range (-50%)
|
||||
#define AUTOSEQ_TEMPO_TOP 2.0 // auto setting top tempo range (+100%)
|
||||
|
||||
// sequence-ms setting values at above low & top tempo
|
||||
#define AUTOSEQ_AT_MIN 125.0
|
||||
#define AUTOSEQ_AT_MAX 50.0
|
||||
#define AUTOSEQ_K ((AUTOSEQ_AT_MAX - AUTOSEQ_AT_MIN) / (AUTOSEQ_TEMPO_TOP - AUTOSEQ_TEMPO_LOW))
|
||||
#define AUTOSEQ_C (AUTOSEQ_AT_MIN - (AUTOSEQ_K) * (AUTOSEQ_TEMPO_LOW))
|
||||
|
||||
// seek-window-ms setting values at above low & top tempo
|
||||
#define AUTOSEEK_AT_MIN 25.0
|
||||
#define AUTOSEEK_AT_MAX 15.0
|
||||
#define AUTOSEEK_K ((AUTOSEEK_AT_MAX - AUTOSEEK_AT_MIN) / (AUTOSEQ_TEMPO_TOP - AUTOSEQ_TEMPO_LOW))
|
||||
#define AUTOSEEK_C (AUTOSEEK_AT_MIN - (AUTOSEEK_K) * (AUTOSEQ_TEMPO_LOW))
|
||||
|
||||
#define CHECK_LIMITS(x, mi, ma) (((x) < (mi)) ? (mi) : (((x) > (ma)) ? (ma) : (x)))
|
||||
|
||||
double seq, seek;
|
||||
|
||||
if (bAutoSeqSetting)
|
||||
{
|
||||
seq = AUTOSEQ_C + AUTOSEQ_K * tempo;
|
||||
seq = CHECK_LIMITS(seq, AUTOSEQ_AT_MAX, AUTOSEQ_AT_MIN);
|
||||
sequenceMs = (int)(seq + 0.5);
|
||||
}
|
||||
|
||||
if (bAutoSeekSetting)
|
||||
{
|
||||
seek = AUTOSEEK_C + AUTOSEEK_K * tempo;
|
||||
seek = CHECK_LIMITS(seek, AUTOSEEK_AT_MAX, AUTOSEEK_AT_MIN);
|
||||
seekWindowMs = (int)(seek + 0.5);
|
||||
}
|
||||
|
||||
// Update seek window lengths
|
||||
seekWindowLength = (sampleRate * sequenceMs) / 1000;
|
||||
if (seekWindowLength < 2 * overlapLength)
|
||||
{
|
||||
seekWindowLength = 2 * overlapLength;
|
||||
}
|
||||
seekLength = (sampleRate * seekWindowMs) / 1000;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Sets new target tempo. Normal tempo = 'SCALE', smaller values represent slower
|
||||
// tempo, larger faster tempo.
|
||||
void TDStretch::setTempo(float newTempo)
|
||||
{
|
||||
int intskip;
|
||||
|
||||
tempo = newTempo;
|
||||
|
||||
// Calculate new sequence duration
|
||||
calcSeqParameters();
|
||||
|
||||
// Calculate ideal skip length (according to tempo value)
|
||||
nominalSkip = tempo * (seekWindowLength - overlapLength);
|
||||
intskip = (int)(nominalSkip + 0.5f);
|
||||
|
||||
// Calculate how many samples are needed in the 'inputBuffer' to
|
||||
// process another batch of samples
|
||||
//sampleReq = max(intskip + overlapLength, seekWindowLength) + seekLength / 2;
|
||||
sampleReq = max(intskip + overlapLength, seekWindowLength) + seekLength;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Sets the number of channels, 1 = mono, 2 = stereo
|
||||
void TDStretch::setChannels(int numChannels)
|
||||
{
|
||||
assert(numChannels > 0);
|
||||
if (channels == numChannels) return;
|
||||
assert(numChannels == 1 || numChannels == 2);
|
||||
|
||||
channels = numChannels;
|
||||
inputBuffer.setChannels(channels);
|
||||
outputBuffer.setChannels(channels);
|
||||
}
|
||||
|
||||
|
||||
// nominal tempo, no need for processing, just pass the samples through
|
||||
// to outputBuffer
|
||||
/*
|
||||
void TDStretch::processNominalTempo()
|
||||
{
|
||||
assert(tempo == 1.0f);
|
||||
|
||||
if (bMidBufferDirty)
|
||||
{
|
||||
// If there are samples in pMidBuffer waiting for overlapping,
|
||||
// do a single sliding overlapping with them in order to prevent a
|
||||
// clicking distortion in the output sound
|
||||
if (inputBuffer.numSamples() < overlapLength)
|
||||
{
|
||||
// wait until we've got overlapLength input samples
|
||||
return;
|
||||
}
|
||||
// Mix the samples in the beginning of 'inputBuffer' with the
|
||||
// samples in 'midBuffer' using sliding overlapping
|
||||
overlap(outputBuffer.ptrEnd(overlapLength), inputBuffer.ptrBegin(), 0);
|
||||
outputBuffer.putSamples(overlapLength);
|
||||
inputBuffer.receiveSamples(overlapLength);
|
||||
clearMidBuffer();
|
||||
// now we've caught the nominal sample flow and may switch to
|
||||
// bypass mode
|
||||
}
|
||||
|
||||
// Simply bypass samples from input to output
|
||||
outputBuffer.moveSamples(inputBuffer);
|
||||
}
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
// Processes as many processing frames of the samples 'inputBuffer', store
|
||||
// the result into 'outputBuffer'
|
||||
void TDStretch::processSamples()
|
||||
{
|
||||
int ovlSkip, offset;
|
||||
int temp;
|
||||
|
||||
/* Removed this small optimization - can introduce a click to sound when tempo setting
|
||||
crosses the nominal value
|
||||
if (tempo == 1.0f)
|
||||
{
|
||||
// tempo not changed from the original, so bypass the processing
|
||||
processNominalTempo();
|
||||
return;
|
||||
}
|
||||
*/
|
||||
|
||||
// Process samples as long as there are enough samples in 'inputBuffer'
|
||||
// to form a processing frame.
|
||||
while ((int)inputBuffer.numSamples() >= sampleReq)
|
||||
{
|
||||
// If tempo differs from the normal ('SCALE'), scan for the best overlapping
|
||||
// position
|
||||
offset = seekBestOverlapPosition(inputBuffer.ptrBegin());
|
||||
|
||||
// Mix the samples in the 'inputBuffer' at position of 'offset' with the
|
||||
// samples in 'midBuffer' using sliding overlapping
|
||||
// ... first partially overlap with the end of the previous sequence
|
||||
// (that's in 'midBuffer')
|
||||
overlap(outputBuffer.ptrEnd((uint)overlapLength), inputBuffer.ptrBegin(), (uint)offset);
|
||||
outputBuffer.putSamples((uint)overlapLength);
|
||||
|
||||
// ... then copy sequence samples from 'inputBuffer' to output:
|
||||
|
||||
// length of sequence
|
||||
temp = (seekWindowLength - 2 * overlapLength);
|
||||
|
||||
// crosscheck that we don't have buffer overflow...
|
||||
if ((int)inputBuffer.numSamples() < (offset + temp + overlapLength * 2))
|
||||
{
|
||||
continue; // just in case, shouldn't really happen
|
||||
}
|
||||
|
||||
outputBuffer.putSamples(inputBuffer.ptrBegin() + channels * (offset + overlapLength), (uint)temp);
|
||||
|
||||
// Copies the end of the current sequence from 'inputBuffer' to
|
||||
// 'midBuffer' for being mixed with the beginning of the next
|
||||
// processing sequence and so on
|
||||
assert((offset + temp + overlapLength * 2) <= (int)inputBuffer.numSamples());
|
||||
memcpy(pMidBuffer, inputBuffer.ptrBegin() + channels * (offset + temp + overlapLength),
|
||||
channels * sizeof(SAMPLETYPE) * overlapLength);
|
||||
|
||||
// Remove the processed samples from the input buffer. Update
|
||||
// the difference between integer & nominal skip step to 'skipFract'
|
||||
// in order to prevent the error from accumulating over time.
|
||||
skipFract += nominalSkip; // real skip size
|
||||
ovlSkip = (int)skipFract; // rounded to integer skip
|
||||
skipFract -= ovlSkip; // maintain the fraction part, i.e. real vs. integer skip
|
||||
inputBuffer.receiveSamples((uint)ovlSkip);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Adds 'numsamples' pcs of samples from the 'samples' memory position into
|
||||
// the input of the object.
|
||||
void TDStretch::putSamples(const SAMPLETYPE *samples, uint nSamples)
|
||||
{
|
||||
// Add the samples into the input buffer
|
||||
inputBuffer.putSamples(samples, nSamples);
|
||||
// Process the samples in input buffer
|
||||
processSamples();
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// Set new overlap length parameter & reallocate RefMidBuffer if necessary.
|
||||
void TDStretch::acceptNewOverlapLength(int newOverlapLength)
|
||||
{
|
||||
int prevOvl;
|
||||
|
||||
assert(newOverlapLength >= 0);
|
||||
prevOvl = overlapLength;
|
||||
overlapLength = newOverlapLength;
|
||||
|
||||
if (overlapLength > prevOvl)
|
||||
{
|
||||
delete[] pMidBufferUnaligned;
|
||||
|
||||
pMidBufferUnaligned = new SAMPLETYPE[overlapLength * 2 + 16 / sizeof(SAMPLETYPE)];
|
||||
// ensure that 'pMidBuffer' is aligned to 16 byte boundary for efficiency
|
||||
pMidBuffer = (SAMPLETYPE *)SOUNDTOUCH_ALIGN_POINTER_16(pMidBufferUnaligned);
|
||||
|
||||
clearMidBuffer();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Operator 'new' is overloaded so that it automatically creates a suitable instance
|
||||
// depending on if we've a MMX/SSE/etc-capable CPU available or not.
|
||||
void * TDStretch::operator new(size_t s)
|
||||
{
|
||||
// Notice! don't use "new TDStretch" directly, use "newInstance" to create a new instance instead!
|
||||
ST_THROW_RT_ERROR("Error in TDStretch::new: Don't use 'new TDStretch' directly, use 'newInstance' member instead!");
|
||||
return newInstance();
|
||||
}
|
||||
|
||||
|
||||
TDStretch * TDStretch::newInstance()
|
||||
{
|
||||
uint uExtensions;
|
||||
|
||||
uExtensions = detectCPUextensions();
|
||||
|
||||
// Check if MMX/SSE instruction set extensions supported by CPU
|
||||
|
||||
#ifdef SOUNDTOUCH_ALLOW_MMX
|
||||
// MMX routines available only with integer sample types
|
||||
if (uExtensions & SUPPORT_MMX)
|
||||
{
|
||||
return ::new TDStretchMMX;
|
||||
}
|
||||
else
|
||||
#endif // SOUNDTOUCH_ALLOW_MMX
|
||||
|
||||
|
||||
#ifdef SOUNDTOUCH_ALLOW_SSE
|
||||
if (uExtensions & SUPPORT_SSE)
|
||||
{
|
||||
// SSE support
|
||||
return ::new TDStretchSSE;
|
||||
}
|
||||
else
|
||||
#endif // SOUNDTOUCH_ALLOW_SSE
|
||||
|
||||
{
|
||||
// ISA optimizations not supported, use plain C version
|
||||
return ::new TDStretch;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Integer arithmetics specific algorithm implementations.
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifdef SOUNDTOUCH_INTEGER_SAMPLES
|
||||
|
||||
// Overlaps samples in 'midBuffer' with the samples in 'input'. The 'Stereo'
|
||||
// version of the routine.
|
||||
void TDStretch::overlapStereo(short *poutput, const short *input) const
|
||||
{
|
||||
int i;
|
||||
short temp;
|
||||
int cnt2;
|
||||
|
||||
for (i = 0; i < overlapLength ; i ++)
|
||||
{
|
||||
temp = (short)(overlapLength - i);
|
||||
cnt2 = 2 * i;
|
||||
poutput[cnt2] = (input[cnt2] * i + pMidBuffer[cnt2] * temp ) / overlapLength;
|
||||
poutput[cnt2 + 1] = (input[cnt2 + 1] * i + pMidBuffer[cnt2 + 1] * temp ) / overlapLength;
|
||||
}
|
||||
}
|
||||
|
||||
// Calculates the x having the closest 2^x value for the given value
|
||||
static int _getClosest2Power(double value)
|
||||
{
|
||||
return (int)(log(value) / log(2.0) + 0.5);
|
||||
}
|
||||
|
||||
|
||||
/// Calculates overlap period length in samples.
|
||||
/// Integer version rounds overlap length to closest power of 2
|
||||
/// for a divide scaling operation.
|
||||
void TDStretch::calculateOverlapLength(int aoverlapMs)
|
||||
{
|
||||
int newOvl;
|
||||
|
||||
assert(aoverlapMs >= 0);
|
||||
|
||||
// calculate overlap length so that it's power of 2 - thus it's easy to do
|
||||
// integer division by right-shifting. Term "-1" at end is to account for
|
||||
// the extra most significatnt bit left unused in result by signed multiplication
|
||||
overlapDividerBits = _getClosest2Power((sampleRate * aoverlapMs) / 1000.0) - 1;
|
||||
if (overlapDividerBits > 9) overlapDividerBits = 9;
|
||||
if (overlapDividerBits < 3) overlapDividerBits = 3;
|
||||
newOvl = (int)pow(2.0, (int)overlapDividerBits + 1); // +1 => account for -1 above
|
||||
|
||||
acceptNewOverlapLength(newOvl);
|
||||
|
||||
// calculate sloping divider so that crosscorrelation operation won't
|
||||
// overflow 32-bit register. Max. sum of the crosscorrelation sum without
|
||||
// divider would be 2^30*(N^3-N)/3, where N = overlap length
|
||||
slopingDivider = (newOvl * newOvl - 1) / 3;
|
||||
}
|
||||
|
||||
|
||||
double TDStretch::calcCrossCorr(const short *mixingPos, const short *compare) const
|
||||
{
|
||||
long corr;
|
||||
long norm;
|
||||
int i;
|
||||
|
||||
corr = norm = 0;
|
||||
// Same routine for stereo and mono. For stereo, unroll loop for better
|
||||
// efficiency and gives slightly better resolution against rounding.
|
||||
// For mono it same routine, just unrolls loop by factor of 4
|
||||
for (i = 0; i < channels * overlapLength; i += 4)
|
||||
{
|
||||
corr += (mixingPos[i] * compare[i] +
|
||||
mixingPos[i + 1] * compare[i + 1] +
|
||||
mixingPos[i + 2] * compare[i + 2] +
|
||||
mixingPos[i + 3] * compare[i + 3]) >> overlapDividerBits;
|
||||
norm += (mixingPos[i] * mixingPos[i] +
|
||||
mixingPos[i + 1] * mixingPos[i + 1] +
|
||||
mixingPos[i + 2] * mixingPos[i + 2] +
|
||||
mixingPos[i + 3] * mixingPos[i + 3]) >> overlapDividerBits;
|
||||
}
|
||||
|
||||
// Normalize result by dividing by sqrt(norm) - this step is easiest
|
||||
// done using floating point operation
|
||||
if (norm == 0) norm = 1; // to avoid div by zero
|
||||
return (double)corr / sqrt((double)norm);
|
||||
}
|
||||
|
||||
#endif // SOUNDTOUCH_INTEGER_SAMPLES
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Floating point arithmetics specific algorithm implementations.
|
||||
//
|
||||
|
||||
#ifdef SOUNDTOUCH_FLOAT_SAMPLES
|
||||
|
||||
// Overlaps samples in 'midBuffer' with the samples in 'pInput'
|
||||
void TDStretch::overlapStereo(float *pOutput, const float *pInput) const
|
||||
{
|
||||
int i;
|
||||
float fScale;
|
||||
float f1;
|
||||
float f2;
|
||||
|
||||
fScale = 1.0f / (float)overlapLength;
|
||||
|
||||
f1 = 0;
|
||||
f2 = 1.0f;
|
||||
|
||||
for (i = 0; i < 2 * (int)overlapLength ; i += 2)
|
||||
{
|
||||
pOutput[i + 0] = pInput[i + 0] * f1 + pMidBuffer[i + 0] * f2;
|
||||
pOutput[i + 1] = pInput[i + 1] * f1 + pMidBuffer[i + 1] * f2;
|
||||
|
||||
f1 += fScale;
|
||||
f2 -= fScale;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// Calculates overlapInMsec period length in samples.
|
||||
void TDStretch::calculateOverlapLength(int overlapInMsec)
|
||||
{
|
||||
int newOvl;
|
||||
|
||||
assert(overlapInMsec >= 0);
|
||||
newOvl = (sampleRate * overlapInMsec) / 1000;
|
||||
if (newOvl < 16) newOvl = 16;
|
||||
|
||||
// must be divisible by 8
|
||||
newOvl -= newOvl % 8;
|
||||
|
||||
acceptNewOverlapLength(newOvl);
|
||||
}
|
||||
|
||||
|
||||
double TDStretch::calcCrossCorr(const float *mixingPos, const float *compare) const
|
||||
{
|
||||
double corr;
|
||||
double norm;
|
||||
int i;
|
||||
|
||||
corr = norm = 0;
|
||||
// Same routine for stereo and mono. For Stereo, unroll by factor of 2.
|
||||
// For mono it's same routine yet unrollsd by factor of 4.
|
||||
for (i = 0; i < channels * overlapLength; i += 4)
|
||||
{
|
||||
corr += mixingPos[i] * compare[i] +
|
||||
mixingPos[i + 1] * compare[i + 1];
|
||||
|
||||
norm += mixingPos[i] * mixingPos[i] +
|
||||
mixingPos[i + 1] * mixingPos[i + 1];
|
||||
|
||||
// unroll the loop for better CPU efficiency:
|
||||
corr += mixingPos[i + 2] * compare[i + 2] +
|
||||
mixingPos[i + 3] * compare[i + 3];
|
||||
|
||||
norm += mixingPos[i + 2] * mixingPos[i + 2] +
|
||||
mixingPos[i + 3] * mixingPos[i + 3];
|
||||
}
|
||||
|
||||
if (norm < 1e-9) norm = 1.0; // to avoid div by zero
|
||||
return corr / sqrt(norm);
|
||||
}
|
||||
|
||||
#endif // SOUNDTOUCH_FLOAT_SAMPLES
|
||||
Vendored
-745
@@ -1,745 +0,0 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Classes for easy reading & writing of WAV sound files.
|
||||
///
|
||||
/// For big-endian CPU, define _BIG_ENDIAN_ during compile-time to correctly
|
||||
/// parse the WAV files with such processors.
|
||||
///
|
||||
/// Admittingly, more complete WAV reader routines may exist in public domain,
|
||||
/// but the reason for 'yet another' one is that those generic WAV reader
|
||||
/// libraries are exhaustingly large and cumbersome! Wanted to have something
|
||||
/// simpler here, i.e. something that's not already larger than rest of the
|
||||
/// SoundTouch/SoundStretch program...
|
||||
///
|
||||
/// Author : Copyright (c) Olli Parviainen
|
||||
/// Author e-mail : oparviai 'at' iki.fi
|
||||
/// SoundTouch WWW: http://www.surina.net/soundtouch
|
||||
///
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Last changed : $Date: 2009-02-21 18:00:14 +0200 (Sat, 21 Feb 2009) $
|
||||
// File revision : $Revision: 4 $
|
||||
//
|
||||
// $Id: WavFile.cpp 63 2009-02-21 16:00:14Z oparviai $
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// License :
|
||||
//
|
||||
// SoundTouch audio processing library
|
||||
// Copyright (c) Olli Parviainen
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Lesser General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2.1 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public
|
||||
// License along with this library; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
#include <cstring>
|
||||
#include <assert.h>
|
||||
#include <limits.h>
|
||||
|
||||
#include "WavFile.h"
|
||||
|
||||
using namespace std;
|
||||
|
||||
static const char riffStr[] = "RIFF";
|
||||
static const char waveStr[] = "WAVE";
|
||||
static const char fmtStr[] = "fmt ";
|
||||
static const char dataStr[] = "data";
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Helper functions for swapping byte order to correctly read/write WAV files
|
||||
// with big-endian CPU's: Define compile-time definition _BIG_ENDIAN_ to
|
||||
// turn-on the conversion if it appears necessary.
|
||||
//
|
||||
// For example, Intel x86 is little-endian and doesn't require conversion,
|
||||
// while PowerPC of Mac's and many other RISC cpu's are big-endian.
|
||||
|
||||
#ifdef BYTE_ORDER
|
||||
// In gcc compiler detect the byte order automatically
|
||||
#if BYTE_ORDER == BIG_ENDIAN
|
||||
// big-endian platform.
|
||||
#define _BIG_ENDIAN_
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef _BIG_ENDIAN_
|
||||
// big-endian CPU, swap bytes in 16 & 32 bit words
|
||||
|
||||
// helper-function to swap byte-order of 32bit integer
|
||||
static inline void _swap32(unsigned int &dwData)
|
||||
{
|
||||
dwData = ((dwData >> 24) & 0x000000FF) |
|
||||
((dwData >> 8) & 0x0000FF00) |
|
||||
((dwData << 8) & 0x00FF0000) |
|
||||
((dwData << 24) & 0xFF000000);
|
||||
}
|
||||
|
||||
// helper-function to swap byte-order of 16bit integer
|
||||
static inline void _swap16(unsigned short &wData)
|
||||
{
|
||||
wData = ((wData >> 8) & 0x00FF) |
|
||||
((wData << 8) & 0xFF00);
|
||||
}
|
||||
|
||||
// helper-function to swap byte-order of buffer of 16bit integers
|
||||
static inline void _swap16Buffer(unsigned short *pData, unsigned int dwNumWords)
|
||||
{
|
||||
unsigned long i;
|
||||
|
||||
for (i = 0; i < dwNumWords; i ++)
|
||||
{
|
||||
_swap16(pData[i]);
|
||||
}
|
||||
}
|
||||
|
||||
#else // BIG_ENDIAN
|
||||
// little-endian CPU, WAV file is ok as such
|
||||
|
||||
// dummy helper-function
|
||||
static inline void _swap32(unsigned int &dwData)
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
|
||||
// dummy helper-function
|
||||
static inline void _swap16(unsigned short &wData)
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
|
||||
// dummy helper-function
|
||||
static inline void _swap16Buffer(unsigned short *pData, unsigned int dwNumBytes)
|
||||
{
|
||||
// do nothing
|
||||
}
|
||||
|
||||
#endif // BIG_ENDIAN
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Class WavInFile
|
||||
//
|
||||
|
||||
WavInFile::WavInFile(const char *fileName)
|
||||
{
|
||||
// Try to open the file for reading
|
||||
fptr = fopen(fileName, "rb");
|
||||
if (fptr == NULL)
|
||||
{
|
||||
// didn't succeed
|
||||
string msg = "Error : Unable to open file \"";
|
||||
msg += fileName;
|
||||
msg += "\" for reading.";
|
||||
throw runtime_error(msg);
|
||||
}
|
||||
|
||||
init();
|
||||
}
|
||||
|
||||
|
||||
WavInFile::WavInFile(FILE *file)
|
||||
{
|
||||
// Try to open the file for reading
|
||||
fptr = file;
|
||||
if (!file)
|
||||
{
|
||||
// didn't succeed
|
||||
string msg = "Error : Unable to access input stream for reading";
|
||||
throw runtime_error(msg);
|
||||
}
|
||||
|
||||
init();
|
||||
}
|
||||
|
||||
|
||||
/// Init the WAV file stream
|
||||
void WavInFile::init()
|
||||
{
|
||||
int hdrsOk;
|
||||
|
||||
// assume file stream is already open
|
||||
assert(fptr);
|
||||
|
||||
// Read the file headers
|
||||
hdrsOk = readWavHeaders();
|
||||
if (hdrsOk != 0)
|
||||
{
|
||||
// Something didn't match in the wav file headers
|
||||
string msg = "Input file is corrupt or not a WAV file";
|
||||
throw runtime_error(msg);
|
||||
}
|
||||
|
||||
if (header.format.fixed != 1)
|
||||
{
|
||||
string msg = "Input file uses unsupported encoding.";
|
||||
throw runtime_error(msg);
|
||||
}
|
||||
|
||||
dataRead = 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
WavInFile::~WavInFile()
|
||||
{
|
||||
if (fptr) fclose(fptr);
|
||||
fptr = NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void WavInFile::rewind()
|
||||
{
|
||||
int hdrsOk;
|
||||
|
||||
fseek(fptr, 0, SEEK_SET);
|
||||
hdrsOk = readWavHeaders();
|
||||
assert(hdrsOk == 0);
|
||||
dataRead = 0;
|
||||
}
|
||||
|
||||
|
||||
int WavInFile::checkCharTags() const
|
||||
{
|
||||
// header.format.fmt should equal to 'fmt '
|
||||
if (memcmp(fmtStr, header.format.fmt, 4) != 0) return -1;
|
||||
// header.data.data_field should equal to 'data'
|
||||
if (memcmp(dataStr, header.data.data_field, 4) != 0) return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int WavInFile::read(char *buffer, int maxElems)
|
||||
{
|
||||
int numBytes;
|
||||
uint afterDataRead;
|
||||
|
||||
// ensure it's 8 bit format
|
||||
if (header.format.bits_per_sample != 8)
|
||||
{
|
||||
throw runtime_error("Error: WavInFile::read(char*, int) works only with 8bit samples.");
|
||||
}
|
||||
assert(sizeof(char) == 1);
|
||||
|
||||
numBytes = maxElems;
|
||||
afterDataRead = dataRead + numBytes;
|
||||
if (afterDataRead > header.data.data_len)
|
||||
{
|
||||
// Don't read more samples than are marked available in header
|
||||
numBytes = (int)header.data.data_len - (int)dataRead;
|
||||
assert(numBytes >= 0);
|
||||
}
|
||||
|
||||
assert(buffer);
|
||||
numBytes = fread(buffer, 1, numBytes, fptr);
|
||||
dataRead += numBytes;
|
||||
|
||||
return numBytes;
|
||||
}
|
||||
|
||||
|
||||
int WavInFile::read(short *buffer, int maxElems)
|
||||
{
|
||||
unsigned int afterDataRead;
|
||||
int numBytes;
|
||||
int numElems;
|
||||
|
||||
assert(buffer);
|
||||
if (header.format.bits_per_sample == 8)
|
||||
{
|
||||
// 8 bit format
|
||||
char *temp = new char[maxElems];
|
||||
int i;
|
||||
|
||||
numElems = read(temp, maxElems);
|
||||
// convert from 8 to 16 bit
|
||||
for (i = 0; i < numElems; i ++)
|
||||
{
|
||||
buffer[i] = temp[i] << 8;
|
||||
}
|
||||
delete[] temp;
|
||||
}
|
||||
else
|
||||
{
|
||||
// 16 bit format
|
||||
assert(header.format.bits_per_sample == 16);
|
||||
assert(sizeof(short) == 2);
|
||||
|
||||
numBytes = maxElems * 2;
|
||||
afterDataRead = dataRead + numBytes;
|
||||
if (afterDataRead > header.data.data_len)
|
||||
{
|
||||
// Don't read more samples than are marked available in header
|
||||
numBytes = (int)header.data.data_len - (int)dataRead;
|
||||
assert(numBytes >= 0);
|
||||
}
|
||||
|
||||
numBytes = fread(buffer, 1, numBytes, fptr);
|
||||
dataRead += numBytes;
|
||||
numElems = numBytes / 2;
|
||||
|
||||
// 16bit samples, swap byte order if necessary
|
||||
_swap16Buffer((unsigned short *)buffer, numElems);
|
||||
}
|
||||
|
||||
return numElems;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int WavInFile::read(float *buffer, int maxElems)
|
||||
{
|
||||
short *temp = new short[maxElems];
|
||||
int num;
|
||||
int i;
|
||||
double fscale;
|
||||
|
||||
num = read(temp, maxElems);
|
||||
|
||||
fscale = 1.0 / 32768.0;
|
||||
// convert to floats, scale to range [-1..+1[
|
||||
for (i = 0; i < num; i ++)
|
||||
{
|
||||
buffer[i] = (float)(fscale * (double)temp[i]);
|
||||
}
|
||||
|
||||
delete[] temp;
|
||||
|
||||
return num;
|
||||
}
|
||||
|
||||
|
||||
int WavInFile::eof() const
|
||||
{
|
||||
// return true if all data has been read or file eof has reached
|
||||
return (dataRead == header.data.data_len || feof(fptr));
|
||||
}
|
||||
|
||||
|
||||
|
||||
// test if character code is between a white space ' ' and little 'z'
|
||||
static int isAlpha(char c)
|
||||
{
|
||||
return (c >= ' ' && c <= 'z') ? 1 : 0;
|
||||
}
|
||||
|
||||
|
||||
// test if all characters are between a white space ' ' and little 'z'
|
||||
static int isAlphaStr(const char *str)
|
||||
{
|
||||
char c;
|
||||
|
||||
c = str[0];
|
||||
while (c)
|
||||
{
|
||||
if (isAlpha(c) == 0) return 0;
|
||||
str ++;
|
||||
c = str[0];
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
int WavInFile::readRIFFBlock()
|
||||
{
|
||||
if (fread(&(header.riff), sizeof(WavRiff), 1, fptr) != 1) return -1;
|
||||
|
||||
// swap 32bit data byte order if necessary
|
||||
_swap32((unsigned int &)header.riff.package_len);
|
||||
|
||||
// header.riff.riff_char should equal to 'RIFF');
|
||||
if (memcmp(riffStr, header.riff.riff_char, 4) != 0) return -1;
|
||||
// header.riff.wave should equal to 'WAVE'
|
||||
if (memcmp(waveStr, header.riff.wave, 4) != 0) return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
int WavInFile::readHeaderBlock()
|
||||
{
|
||||
char label[5];
|
||||
string sLabel;
|
||||
|
||||
// lead label string
|
||||
if (fread(label, 1, 4, fptr) !=4) return -1;
|
||||
label[4] = 0;
|
||||
|
||||
if (isAlphaStr(label) == 0) return -1; // not a valid label
|
||||
|
||||
// Decode blocks according to their label
|
||||
if (strcmp(label, fmtStr) == 0)
|
||||
{
|
||||
int nLen, nDump;
|
||||
|
||||
// 'fmt ' block
|
||||
memcpy(header.format.fmt, fmtStr, 4);
|
||||
|
||||
// read length of the format field
|
||||
if (fread(&nLen, sizeof(int), 1, fptr) != 1) return -1;
|
||||
// swap byte order if necessary
|
||||
_swap32((unsigned int &)nLen); // int format_len;
|
||||
header.format.format_len = nLen;
|
||||
|
||||
// calculate how much length differs from expected
|
||||
nDump = nLen - ((int)sizeof(header.format) - 8);
|
||||
|
||||
// if format_len is larger than expected, read only as much data as we've space for
|
||||
if (nDump > 0)
|
||||
{
|
||||
nLen = sizeof(header.format) - 8;
|
||||
}
|
||||
|
||||
// read data
|
||||
if (fread(&(header.format.fixed), nLen, 1, fptr) != 1) return -1;
|
||||
|
||||
// swap byte order if necessary
|
||||
_swap16((unsigned short &)header.format.fixed); // short int fixed;
|
||||
_swap16((unsigned short &)header.format.channel_number); // short int channel_number;
|
||||
_swap32((unsigned int &)header.format.sample_rate); // int sample_rate;
|
||||
_swap32((unsigned int &)header.format.byte_rate); // int byte_rate;
|
||||
_swap16((unsigned short &)header.format.byte_per_sample); // short int byte_per_sample;
|
||||
_swap16((unsigned short &)header.format.bits_per_sample); // short int bits_per_sample;
|
||||
|
||||
// if format_len is larger than expected, skip the extra data
|
||||
if (nDump > 0)
|
||||
{
|
||||
fseek(fptr, nDump, SEEK_CUR);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
else if (strcmp(label, dataStr) == 0)
|
||||
{
|
||||
// 'data' block
|
||||
memcpy(header.data.data_field, dataStr, 4);
|
||||
if (fread(&(header.data.data_len), sizeof(uint), 1, fptr) != 1) return -1;
|
||||
|
||||
// swap byte order if necessary
|
||||
_swap32((unsigned int &)header.data.data_len);
|
||||
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
uint len, i;
|
||||
uint temp;
|
||||
// unknown block
|
||||
|
||||
// read length
|
||||
if (fread(&len, sizeof(len), 1, fptr) != 1) return -1;
|
||||
// scan through the block
|
||||
for (i = 0; i < len; i ++)
|
||||
{
|
||||
if (fread(&temp, 1, 1, fptr) != 1) return -1;
|
||||
if (feof(fptr)) return -1; // unexpected eof
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int WavInFile::readWavHeaders()
|
||||
{
|
||||
int res;
|
||||
|
||||
memset(&header, 0, sizeof(header));
|
||||
|
||||
res = readRIFFBlock();
|
||||
if (res) return 1;
|
||||
// read header blocks until data block is found
|
||||
do
|
||||
{
|
||||
// read header blocks
|
||||
res = readHeaderBlock();
|
||||
if (res < 0) return 1; // error in file structure
|
||||
} while (res == 0);
|
||||
// check that all required tags are legal
|
||||
return checkCharTags();
|
||||
}
|
||||
|
||||
|
||||
uint WavInFile::getNumChannels() const
|
||||
{
|
||||
return header.format.channel_number;
|
||||
}
|
||||
|
||||
|
||||
uint WavInFile::getNumBits() const
|
||||
{
|
||||
return header.format.bits_per_sample;
|
||||
}
|
||||
|
||||
|
||||
uint WavInFile::getBytesPerSample() const
|
||||
{
|
||||
return getNumChannels() * getNumBits() / 8;
|
||||
}
|
||||
|
||||
|
||||
uint WavInFile::getSampleRate() const
|
||||
{
|
||||
return header.format.sample_rate;
|
||||
}
|
||||
|
||||
|
||||
|
||||
uint WavInFile::getDataSizeInBytes() const
|
||||
{
|
||||
return header.data.data_len;
|
||||
}
|
||||
|
||||
|
||||
uint WavInFile::getNumSamples() const
|
||||
{
|
||||
if (header.format.byte_per_sample == 0) return 0;
|
||||
return header.data.data_len / (unsigned short)header.format.byte_per_sample;
|
||||
}
|
||||
|
||||
|
||||
uint WavInFile::getLengthMS() const
|
||||
{
|
||||
uint numSamples;
|
||||
uint sampleRate;
|
||||
|
||||
numSamples = getNumSamples();
|
||||
sampleRate = getSampleRate();
|
||||
|
||||
assert(numSamples < UINT_MAX / 1000);
|
||||
return (1000 * numSamples / sampleRate);
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Class WavOutFile
|
||||
//
|
||||
|
||||
WavOutFile::WavOutFile(const char *fileName, int sampleRate, int bits, int channels)
|
||||
{
|
||||
bytesWritten = 0;
|
||||
fptr = fopen(fileName, "wb");
|
||||
if (fptr == NULL)
|
||||
{
|
||||
string msg = "Error : Unable to open file \"";
|
||||
msg += fileName;
|
||||
msg += "\" for writing.";
|
||||
//pmsg = msg.c_str;
|
||||
throw runtime_error(msg);
|
||||
}
|
||||
|
||||
fillInHeader(sampleRate, bits, channels);
|
||||
writeHeader();
|
||||
}
|
||||
|
||||
|
||||
WavOutFile::WavOutFile(FILE *file, int sampleRate, int bits, int channels)
|
||||
{
|
||||
bytesWritten = 0;
|
||||
fptr = file;
|
||||
if (fptr == NULL)
|
||||
{
|
||||
string msg = "Error : Unable to access output file stream.";
|
||||
throw runtime_error(msg);
|
||||
}
|
||||
|
||||
fillInHeader(sampleRate, bits, channels);
|
||||
writeHeader();
|
||||
}
|
||||
|
||||
|
||||
|
||||
WavOutFile::~WavOutFile()
|
||||
{
|
||||
finishHeader();
|
||||
if (fptr) fclose(fptr);
|
||||
fptr = NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void WavOutFile::fillInHeader(uint sampleRate, uint bits, uint channels)
|
||||
{
|
||||
// fill in the 'riff' part..
|
||||
|
||||
// copy string 'RIFF' to riff_char
|
||||
memcpy(&(header.riff.riff_char), riffStr, 4);
|
||||
// package_len unknown so far
|
||||
header.riff.package_len = 0;
|
||||
// copy string 'WAVE' to wave
|
||||
memcpy(&(header.riff.wave), waveStr, 4);
|
||||
|
||||
|
||||
// fill in the 'format' part..
|
||||
|
||||
// copy string 'fmt ' to fmt
|
||||
memcpy(&(header.format.fmt), fmtStr, 4);
|
||||
|
||||
header.format.format_len = 0x10;
|
||||
header.format.fixed = 1;
|
||||
header.format.channel_number = (short)channels;
|
||||
header.format.sample_rate = (int)sampleRate;
|
||||
header.format.bits_per_sample = (short)bits;
|
||||
header.format.byte_per_sample = (short)(bits * channels / 8);
|
||||
header.format.byte_rate = header.format.byte_per_sample * (int)sampleRate;
|
||||
header.format.sample_rate = (int)sampleRate;
|
||||
|
||||
// fill in the 'data' part..
|
||||
|
||||
// copy string 'data' to data_field
|
||||
memcpy(&(header.data.data_field), dataStr, 4);
|
||||
// data_len unknown so far
|
||||
header.data.data_len = 0;
|
||||
}
|
||||
|
||||
|
||||
void WavOutFile::finishHeader()
|
||||
{
|
||||
// supplement the file length into the header structure
|
||||
header.riff.package_len = bytesWritten + 36;
|
||||
header.data.data_len = bytesWritten;
|
||||
|
||||
writeHeader();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void WavOutFile::writeHeader()
|
||||
{
|
||||
WavHeader hdrTemp;
|
||||
int res;
|
||||
|
||||
// swap byte order if necessary
|
||||
hdrTemp = header;
|
||||
_swap32((unsigned int &)hdrTemp.riff.package_len);
|
||||
_swap32((unsigned int &)hdrTemp.format.format_len);
|
||||
_swap16((unsigned short &)hdrTemp.format.fixed);
|
||||
_swap16((unsigned short &)hdrTemp.format.channel_number);
|
||||
_swap32((unsigned int &)hdrTemp.format.sample_rate);
|
||||
_swap32((unsigned int &)hdrTemp.format.byte_rate);
|
||||
_swap16((unsigned short &)hdrTemp.format.byte_per_sample);
|
||||
_swap16((unsigned short &)hdrTemp.format.bits_per_sample);
|
||||
_swap32((unsigned int &)hdrTemp.data.data_len);
|
||||
|
||||
// write the supplemented header in the beginning of the file
|
||||
fseek(fptr, 0, SEEK_SET);
|
||||
res = fwrite(&hdrTemp, sizeof(hdrTemp), 1, fptr);
|
||||
if (res != 1)
|
||||
{
|
||||
throw runtime_error("Error while writing to a wav file.");
|
||||
}
|
||||
|
||||
// jump back to the end of the file
|
||||
fseek(fptr, 0, SEEK_END);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void WavOutFile::write(const char *buffer, int numElems)
|
||||
{
|
||||
int res;
|
||||
|
||||
if (header.format.bits_per_sample != 8)
|
||||
{
|
||||
throw runtime_error("Error: WavOutFile::write(const char*, int) accepts only 8bit samples.");
|
||||
}
|
||||
assert(sizeof(char) == 1);
|
||||
|
||||
res = fwrite(buffer, 1, numElems, fptr);
|
||||
if (res != numElems)
|
||||
{
|
||||
throw runtime_error("Error while writing to a wav file.");
|
||||
}
|
||||
|
||||
bytesWritten += numElems;
|
||||
}
|
||||
|
||||
|
||||
void WavOutFile::write(const short *buffer, int numElems)
|
||||
{
|
||||
int res;
|
||||
|
||||
// 16 bit samples
|
||||
if (numElems < 1) return; // nothing to do
|
||||
|
||||
if (header.format.bits_per_sample == 8)
|
||||
{
|
||||
int i;
|
||||
char *temp = new char[numElems];
|
||||
// convert from 16bit format to 8bit format
|
||||
for (i = 0; i < numElems; i ++)
|
||||
{
|
||||
temp[i] = buffer[i] >> 8;
|
||||
}
|
||||
// write in 8bit format
|
||||
write(temp, numElems);
|
||||
delete[] temp;
|
||||
}
|
||||
else
|
||||
{
|
||||
// 16bit format
|
||||
unsigned short *pTemp = new unsigned short[numElems];
|
||||
|
||||
assert(header.format.bits_per_sample == 16);
|
||||
|
||||
// allocate temp buffer to swap byte order if necessary
|
||||
memcpy(pTemp, buffer, numElems * 2);
|
||||
_swap16Buffer(pTemp, numElems);
|
||||
|
||||
res = fwrite(pTemp, 2, numElems, fptr);
|
||||
|
||||
delete[] pTemp;
|
||||
|
||||
if (res != numElems)
|
||||
{
|
||||
throw runtime_error("Error while writing to a wav file.");
|
||||
}
|
||||
bytesWritten += 2 * numElems;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void WavOutFile::write(const float *buffer, int numElems)
|
||||
{
|
||||
int i;
|
||||
short *temp = new short[numElems];
|
||||
int iTemp;
|
||||
|
||||
// convert to 16 bit integer
|
||||
for (i = 0; i < numElems; i ++)
|
||||
{
|
||||
// convert to integer
|
||||
iTemp = (int)(32768.0f * buffer[i]);
|
||||
|
||||
// saturate
|
||||
if (iTemp < -32768) iTemp = -32768;
|
||||
if (iTemp > 32767) iTemp = 32767;
|
||||
temp[i] = (short)iTemp;
|
||||
}
|
||||
|
||||
write(temp, numElems);
|
||||
|
||||
delete[] temp;
|
||||
}
|
||||
Vendored
-28
@@ -1,28 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
curdir=`pwd`
|
||||
|
||||
echo -----------------
|
||||
echo Building SoundTouch
|
||||
echo -----------------
|
||||
|
||||
if [ $# -gt 0 ] && [ $1 = "all" ]
|
||||
then
|
||||
|
||||
aclocal
|
||||
automake -a
|
||||
autoconf
|
||||
./configure
|
||||
make clean
|
||||
make install
|
||||
|
||||
else
|
||||
make $@
|
||||
fi
|
||||
|
||||
if [ $? -ne 0 ]
|
||||
then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
#cp libZeroSPU2*.so* ${PCSX2PLUGINS}
|
||||
Vendored
-37
@@ -1,37 +0,0 @@
|
||||
# -*- Autoconf -*-
|
||||
# Process this file with autoconf to produce a configure script.
|
||||
|
||||
#AC_PREREQ([2.63])
|
||||
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
|
||||
AM_INIT_AUTOMAKE
|
||||
AC_CONFIG_SRCDIR([BPMDetect.h])
|
||||
|
||||
# Checks for programs.
|
||||
AC_PROG_CXX
|
||||
AC_PROG_CC
|
||||
AC_PROG_RANLIB
|
||||
|
||||
CFLAGS=
|
||||
CPPFLAGS=
|
||||
CXXFLAGS=
|
||||
CCASFLAGS=
|
||||
|
||||
CFLAGS+=" -m32 "
|
||||
CPPFLAGS+=" -m32 "
|
||||
CXXFLAGS+=" -m32 "
|
||||
CCASFLAGS+=" -m32 "
|
||||
|
||||
# Checks for header files.
|
||||
AC_CHECK_HEADERS([limits.h memory.h stdlib.h string.h])
|
||||
|
||||
# Checks for typedefs, structures, and compiler characteristics.
|
||||
AC_C_INLINE
|
||||
AC_C_RESTRICT
|
||||
AC_TYPE_SIZE_T
|
||||
AC_HEADER_STDBOOL
|
||||
|
||||
# Checks for library functions.
|
||||
AC_CHECK_FUNCS([memmove memset])
|
||||
|
||||
AC_CONFIG_FILES([Makefile])
|
||||
AC_OUTPUT
|
||||
-134
@@ -1,134 +0,0 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Generic version of the x86 CPU extension detection routine.
|
||||
///
|
||||
/// This file is for GNU & other non-Windows compilers, see 'cpu_detect_x86_win.cpp'
|
||||
/// for the Microsoft compiler version.
|
||||
///
|
||||
/// Author : Copyright (c) Olli Parviainen
|
||||
/// Author e-mail : oparviai 'at' iki.fi
|
||||
/// SoundTouch WWW: http://www.surina.net/soundtouch
|
||||
///
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Last changed : $Date: 2011-09-02 15:56:11 -0300 (sex, 02 set 2011) $
|
||||
// File revision : $Revision: 4 $
|
||||
//
|
||||
// $Id: cpu_detect_x86_gcc.cpp 131 2011-09-02 18:56:11Z oparviai $
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// License :
|
||||
//
|
||||
// SoundTouch audio processing library
|
||||
// Copyright (c) Olli Parviainen
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Lesser General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2.1 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public
|
||||
// License along with this library; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "cpu_detect.h"
|
||||
#include "STTypes.h"
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// processor instructions extension detection routines
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Flag variable indicating whick ISA extensions are disabled (for debugging)
|
||||
static uint _dwDisabledISA = 0x00; // 0xffffffff; //<- use this to disable all extensions
|
||||
|
||||
// Disables given set of instruction extensions. See SUPPORT_... defines.
|
||||
void disableExtensions(uint dwDisableMask)
|
||||
{
|
||||
_dwDisabledISA = dwDisableMask;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// Checks which instruction set extensions are supported by the CPU.
|
||||
uint detectCPUextensions(void)
|
||||
{
|
||||
#if (!(SOUNDTOUCH_ALLOW_X86_OPTIMIZATIONS) || !(__GNUC__))
|
||||
|
||||
return 0; // always disable extensions on non-x86 platforms.
|
||||
|
||||
#else
|
||||
uint res = 0;
|
||||
|
||||
if (_dwDisabledISA == 0xffffffff) return 0;
|
||||
|
||||
asm volatile(
|
||||
#ifndef __x86_64__
|
||||
// Check if 'cpuid' instructions is available by toggling eflags bit 21.
|
||||
// Skip this for x86-64 as they always have cpuid while stack manipulation
|
||||
// differs from 16/32bit ISA.
|
||||
"\n\txor %%esi, %%esi" // clear %%esi = result register
|
||||
|
||||
"\n\tpushf" // save eflags to stack
|
||||
"\n\tmovl (%%esp), %%eax" // load eax from stack (with eflags)
|
||||
"\n\tmovl %%eax, %%ecx" // save the original eflags values to ecx
|
||||
"\n\txor $0x00200000, %%eax" // toggle bit 21
|
||||
"\n\tmovl %%eax, (%%esp)" // store toggled eflags to stack
|
||||
"\n\tpopf" // load eflags from stack
|
||||
"\n\tpushf" // save updated eflags to stack
|
||||
"\n\tmovl (%%esp), %%eax" // load eax from stack
|
||||
"\n\tpopf" // pop stack to restore esp
|
||||
"\n\txor %%edx, %%edx" // clear edx for defaulting no mmx
|
||||
"\n\tcmp %%ecx, %%eax" // compare to original eflags values
|
||||
"\n\tjz end" // jumps to 'end' if cpuid not present
|
||||
#endif // __x86_64__
|
||||
|
||||
// cpuid instruction available, test for presence of mmx instructions
|
||||
|
||||
"\n\tmovl $1, %%eax"
|
||||
"\n\tcpuid"
|
||||
"\n\ttest $0x00800000, %%edx"
|
||||
"\n\tjz end" // branch if MMX not available
|
||||
|
||||
"\n\tor $0x01, %%esi" // otherwise add MMX support bit
|
||||
|
||||
"\n\ttest $0x02000000, %%edx"
|
||||
"\n\tjz test3DNow" // branch if SSE not available
|
||||
|
||||
"\n\tor $0x08, %%esi" // otherwise add SSE support bit
|
||||
|
||||
"\n\ttest3DNow:"
|
||||
// test for precense of AMD extensions
|
||||
"\n\tmov $0x80000000, %%eax"
|
||||
"\n\tcpuid"
|
||||
"\n\tcmp $0x80000000, %%eax"
|
||||
"\n\tjbe end" // branch if no AMD extensions detected
|
||||
|
||||
// test for precense of 3DNow! extension
|
||||
"\n\tmov $0x80000001, %%eax"
|
||||
"\n\tcpuid"
|
||||
"\n\ttest $0x80000000, %%edx"
|
||||
"\n\tjz end" // branch if 3DNow! not detected
|
||||
|
||||
"\n\tor $0x02, %%esi" // otherwise add 3DNow support bit
|
||||
|
||||
"\n\tend:"
|
||||
|
||||
"\n\tmov %%esi, %0"
|
||||
|
||||
: "=r" (res)
|
||||
: /* no inputs */
|
||||
: "%edx", "%eax", "%ecx", "%esi" );
|
||||
|
||||
return res & ~_dwDisabledISA;
|
||||
#endif
|
||||
}
|
||||
-137
@@ -1,137 +0,0 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// Win32 version of the x86 CPU detect routine.
|
||||
///
|
||||
/// This file is to be compiled in Windows platform with Microsoft Visual C++
|
||||
/// Compiler. Please see 'cpu_detect_x86_gcc.cpp' for the gcc compiler version
|
||||
/// for all GNU platforms.
|
||||
///
|
||||
/// Author : Copyright (c) Olli Parviainen
|
||||
/// Author e-mail : oparviai 'at' iki.fi
|
||||
/// SoundTouch WWW: http://www.surina.net/soundtouch
|
||||
///
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Last changed : $Date: 2011-07-17 07:58:40 -0300 (dom, 17 jul 2011) $
|
||||
// File revision : $Revision: 4 $
|
||||
//
|
||||
// $Id: cpu_detect_x86_win.cpp 127 2011-07-17 10:58:40Z oparviai $
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// License :
|
||||
//
|
||||
// SoundTouch audio processing library
|
||||
// Copyright (c) Olli Parviainen
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Lesser General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2.1 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public
|
||||
// License along with this library; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "cpu_detect.h"
|
||||
|
||||
#include "STTypes.h"
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// processor instructions extension detection routines
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Flag variable indicating whick ISA extensions are disabled (for debugging)
|
||||
static uint _dwDisabledISA = 0x00; // 0xffffffff; //<- use this to disable all extensions
|
||||
|
||||
|
||||
// Disables given set of instruction extensions. See SUPPORT_... defines.
|
||||
void disableExtensions(uint dwDisableMask)
|
||||
{
|
||||
_dwDisabledISA = dwDisableMask;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// Checks which instruction set extensions are supported by the CPU.
|
||||
uint detectCPUextensions(void)
|
||||
{
|
||||
uint res = 0;
|
||||
|
||||
if (_dwDisabledISA == 0xffffffff) return 0;
|
||||
|
||||
#ifndef _M_X64
|
||||
// 32bit compilation, detect CPU capabilities with inline assembler.
|
||||
__asm
|
||||
{
|
||||
; check if 'cpuid' instructions is available by toggling eflags bit 21
|
||||
;
|
||||
xor esi, esi ; clear esi = result register
|
||||
|
||||
pushfd ; save eflags to stack
|
||||
mov eax,dword ptr [esp] ; load eax from stack (with eflags)
|
||||
mov ecx, eax ; save the original eflags values to ecx
|
||||
xor eax, 0x00200000 ; toggle bit 21
|
||||
mov dword ptr [esp],eax ; store toggled eflags to stack
|
||||
popfd ; load eflags from stack
|
||||
|
||||
pushfd ; save updated eflags to stack
|
||||
mov eax,dword ptr [esp] ; load eax from stack
|
||||
popfd ; pop stack to restore stack pointer
|
||||
|
||||
xor edx, edx ; clear edx for defaulting no mmx
|
||||
cmp eax, ecx ; compare to original eflags values
|
||||
jz end ; jumps to 'end' if cpuid not present
|
||||
|
||||
; cpuid instruction available, test for presence of mmx instructions
|
||||
mov eax, 1
|
||||
cpuid
|
||||
test edx, 0x00800000
|
||||
jz end ; branch if MMX not available
|
||||
|
||||
or esi, SUPPORT_MMX ; otherwise add MMX support bit
|
||||
|
||||
test edx, 0x02000000
|
||||
jz test3DNow ; branch if SSE not available
|
||||
|
||||
or esi, SUPPORT_SSE ; otherwise add SSE support bit
|
||||
|
||||
test3DNow:
|
||||
; test for precense of AMD extensions
|
||||
mov eax, 0x80000000
|
||||
cpuid
|
||||
cmp eax, 0x80000000
|
||||
jbe end ; branch if no AMD extensions detected
|
||||
|
||||
; test for precense of 3DNow! extension
|
||||
mov eax, 0x80000001
|
||||
cpuid
|
||||
test edx, 0x80000000
|
||||
jz end ; branch if 3DNow! not detected
|
||||
|
||||
or esi, SUPPORT_3DNOW ; otherwise add 3DNow support bit
|
||||
|
||||
end:
|
||||
|
||||
mov res, esi
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
// Visual C++ 64bit compilation doesn't support inline assembler. However,
|
||||
// all x64 compatible CPUs support MMX & SSE extensions.
|
||||
res = SUPPORT_MMX | SUPPORT_SSE | SUPPORT_SSE2;
|
||||
|
||||
#endif
|
||||
|
||||
return res & ~_dwDisabledISA;
|
||||
}
|
||||
Vendored
-1
@@ -1 +0,0 @@
|
||||
/usr/share/automake-1.10/depcomp
|
||||
Vendored
-1
@@ -1 +0,0 @@
|
||||
/usr/share/automake-1.10/install-sh
|
||||
Vendored
-1
@@ -1 +0,0 @@
|
||||
/usr/share/automake-1.10/missing
|
||||
-317
@@ -1,317 +0,0 @@
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
///
|
||||
/// MMX optimized routines. All MMX optimized functions have been gathered into
|
||||
/// this single source code file, regardless to their class or original source
|
||||
/// code file, in order to ease porting the library to other compiler and
|
||||
/// processor platforms.
|
||||
///
|
||||
/// The MMX-optimizations are programmed using MMX compiler intrinsics that
|
||||
/// are supported both by Microsoft Visual C++ and GCC compilers, so this file
|
||||
/// should compile with both toolsets.
|
||||
///
|
||||
/// NOTICE: If using Visual Studio 6.0, you'll need to install the "Visual C++
|
||||
/// 6.0 processor pack" update to support compiler intrinsic syntax. The update
|
||||
/// is available for download at Microsoft Developers Network, see here:
|
||||
/// http://msdn.microsoft.com/en-us/vstudio/aa718349.aspx
|
||||
///
|
||||
/// Author : Copyright (c) Olli Parviainen
|
||||
/// Author e-mail : oparviai 'at' iki.fi
|
||||
/// SoundTouch WWW: http://www.surina.net/soundtouch
|
||||
///
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Last changed : $Date: 2012-11-08 16:53:01 -0200 (qui, 08 nov 2012) $
|
||||
// File revision : $Revision: 4 $
|
||||
//
|
||||
// $Id: mmx_optimized.cpp 160 2012-11-08 18:53:01Z oparviai $
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// License :
|
||||
//
|
||||
// SoundTouch audio processing library
|
||||
// Copyright (c) Olli Parviainen
|
||||
//
|
||||
// This library is free software; you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Lesser General Public
|
||||
// License as published by the Free Software Foundation; either
|
||||
// version 2.1 of the License, or (at your option) any later version.
|
||||
//
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public
|
||||
// License along with this library; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "STTypes.h"
|
||||
|
||||
#ifdef SOUNDTOUCH_ALLOW_MMX
|
||||
// MMX routines available only with integer sample type
|
||||
|
||||
using namespace soundtouch;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// implementation of MMX optimized functions of class 'TDStretchMMX'
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "TDStretch.h"
|
||||
#include <mmintrin.h>
|
||||
#include <limits.h>
|
||||
#include <math.h>
|
||||
|
||||
|
||||
// Calculates cross correlation of two buffers
|
||||
double TDStretchMMX::calcCrossCorr(const short *pV1, const short *pV2) const
|
||||
{
|
||||
const __m64 *pVec1, *pVec2;
|
||||
__m64 shifter;
|
||||
__m64 accu, normaccu;
|
||||
long corr, norm;
|
||||
int i;
|
||||
|
||||
pVec1 = (__m64*)pV1;
|
||||
pVec2 = (__m64*)pV2;
|
||||
|
||||
shifter = _m_from_int(overlapDividerBits);
|
||||
normaccu = accu = _mm_setzero_si64();
|
||||
|
||||
// Process 4 parallel sets of 2 * stereo samples or 4 * mono samples
|
||||
// during each round for improved CPU-level parallellization.
|
||||
for (i = 0; i < channels * overlapLength / 16; i ++)
|
||||
{
|
||||
__m64 temp, temp2;
|
||||
|
||||
// dictionary of instructions:
|
||||
// _m_pmaddwd : 4*16bit multiply-add, resulting two 32bits = [a0*b0+a1*b1 ; a2*b2+a3*b3]
|
||||
// _mm_add_pi32 : 2*32bit add
|
||||
// _m_psrad : 32bit right-shift
|
||||
|
||||
temp = _mm_add_pi32(_mm_madd_pi16(pVec1[0], pVec2[0]),
|
||||
_mm_madd_pi16(pVec1[1], pVec2[1]));
|
||||
temp2 = _mm_add_pi32(_mm_madd_pi16(pVec1[0], pVec1[0]),
|
||||
_mm_madd_pi16(pVec1[1], pVec1[1]));
|
||||
accu = _mm_add_pi32(accu, _mm_sra_pi32(temp, shifter));
|
||||
normaccu = _mm_add_pi32(normaccu, _mm_sra_pi32(temp2, shifter));
|
||||
|
||||
temp = _mm_add_pi32(_mm_madd_pi16(pVec1[2], pVec2[2]),
|
||||
_mm_madd_pi16(pVec1[3], pVec2[3]));
|
||||
temp2 = _mm_add_pi32(_mm_madd_pi16(pVec1[2], pVec1[2]),
|
||||
_mm_madd_pi16(pVec1[3], pVec1[3]));
|
||||
accu = _mm_add_pi32(accu, _mm_sra_pi32(temp, shifter));
|
||||
normaccu = _mm_add_pi32(normaccu, _mm_sra_pi32(temp2, shifter));
|
||||
|
||||
pVec1 += 4;
|
||||
pVec2 += 4;
|
||||
}
|
||||
|
||||
// copy hi-dword of mm0 to lo-dword of mm1, then sum mmo+mm1
|
||||
// and finally store the result into the variable "corr"
|
||||
|
||||
accu = _mm_add_pi32(accu, _mm_srli_si64(accu, 32));
|
||||
corr = _m_to_int(accu);
|
||||
|
||||
normaccu = _mm_add_pi32(normaccu, _mm_srli_si64(normaccu, 32));
|
||||
norm = _m_to_int(normaccu);
|
||||
|
||||
// Clear MMS state
|
||||
_m_empty();
|
||||
|
||||
// Normalize result by dividing by sqrt(norm) - this step is easiest
|
||||
// done using floating point operation
|
||||
if (norm == 0) norm = 1; // to avoid div by zero
|
||||
|
||||
return (double)corr / sqrt((double)norm);
|
||||
// Note: Warning about the missing EMMS instruction is harmless
|
||||
// as it'll be called elsewhere.
|
||||
}
|
||||
|
||||
|
||||
|
||||
void TDStretchMMX::clearCrossCorrState()
|
||||
{
|
||||
// Clear MMS state
|
||||
_m_empty();
|
||||
//_asm EMMS;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// MMX-optimized version of the function overlapStereo
|
||||
void TDStretchMMX::overlapStereo(short *output, const short *input) const
|
||||
{
|
||||
const __m64 *pVinput, *pVMidBuf;
|
||||
__m64 *pVdest;
|
||||
__m64 mix1, mix2, adder, shifter;
|
||||
int i;
|
||||
|
||||
pVinput = (const __m64*)input;
|
||||
pVMidBuf = (const __m64*)pMidBuffer;
|
||||
pVdest = (__m64*)output;
|
||||
|
||||
// mix1 = mixer values for 1st stereo sample
|
||||
// mix1 = mixer values for 2nd stereo sample
|
||||
// adder = adder for updating mixer values after each round
|
||||
|
||||
mix1 = _mm_set_pi16(0, overlapLength, 0, overlapLength);
|
||||
adder = _mm_set_pi16(1, -1, 1, -1);
|
||||
mix2 = _mm_add_pi16(mix1, adder);
|
||||
adder = _mm_add_pi16(adder, adder);
|
||||
|
||||
// Overlaplength-division by shifter. "+1" is to account for "-1" deduced in
|
||||
// overlapDividerBits calculation earlier.
|
||||
shifter = _m_from_int(overlapDividerBits + 1);
|
||||
|
||||
for (i = 0; i < overlapLength / 4; i ++)
|
||||
{
|
||||
__m64 temp1, temp2;
|
||||
|
||||
// load & shuffle data so that input & mixbuffer data samples are paired
|
||||
temp1 = _mm_unpacklo_pi16(pVMidBuf[0], pVinput[0]); // = i0l m0l i0r m0r
|
||||
temp2 = _mm_unpackhi_pi16(pVMidBuf[0], pVinput[0]); // = i1l m1l i1r m1r
|
||||
|
||||
// temp = (temp .* mix) >> shifter
|
||||
temp1 = _mm_sra_pi32(_mm_madd_pi16(temp1, mix1), shifter);
|
||||
temp2 = _mm_sra_pi32(_mm_madd_pi16(temp2, mix2), shifter);
|
||||
pVdest[0] = _mm_packs_pi32(temp1, temp2); // pack 2*2*32bit => 4*16bit
|
||||
|
||||
// update mix += adder
|
||||
mix1 = _mm_add_pi16(mix1, adder);
|
||||
mix2 = _mm_add_pi16(mix2, adder);
|
||||
|
||||
// --- second round begins here ---
|
||||
|
||||
// load & shuffle data so that input & mixbuffer data samples are paired
|
||||
temp1 = _mm_unpacklo_pi16(pVMidBuf[1], pVinput[1]); // = i2l m2l i2r m2r
|
||||
temp2 = _mm_unpackhi_pi16(pVMidBuf[1], pVinput[1]); // = i3l m3l i3r m3r
|
||||
|
||||
// temp = (temp .* mix) >> shifter
|
||||
temp1 = _mm_sra_pi32(_mm_madd_pi16(temp1, mix1), shifter);
|
||||
temp2 = _mm_sra_pi32(_mm_madd_pi16(temp2, mix2), shifter);
|
||||
pVdest[1] = _mm_packs_pi32(temp1, temp2); // pack 2*2*32bit => 4*16bit
|
||||
|
||||
// update mix += adder
|
||||
mix1 = _mm_add_pi16(mix1, adder);
|
||||
mix2 = _mm_add_pi16(mix2, adder);
|
||||
|
||||
pVinput += 2;
|
||||
pVMidBuf += 2;
|
||||
pVdest += 2;
|
||||
}
|
||||
|
||||
_m_empty(); // clear MMS state
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// implementation of MMX optimized functions of class 'FIRFilter'
|
||||
//
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "FIRFilter.h"
|
||||
|
||||
|
||||
FIRFilterMMX::FIRFilterMMX() : FIRFilter()
|
||||
{
|
||||
filterCoeffsUnalign = NULL;
|
||||
}
|
||||
|
||||
|
||||
FIRFilterMMX::~FIRFilterMMX()
|
||||
{
|
||||
delete[] filterCoeffsUnalign;
|
||||
}
|
||||
|
||||
|
||||
// (overloaded) Calculates filter coefficients for MMX routine
|
||||
void FIRFilterMMX::setCoefficients(const short *coeffs, uint newLength, uint uResultDivFactor)
|
||||
{
|
||||
uint i;
|
||||
FIRFilter::setCoefficients(coeffs, newLength, uResultDivFactor);
|
||||
|
||||
// Ensure that filter coeffs array is aligned to 16-byte boundary
|
||||
delete[] filterCoeffsUnalign;
|
||||
filterCoeffsUnalign = new short[2 * newLength + 8];
|
||||
filterCoeffsAlign = (short *)SOUNDTOUCH_ALIGN_POINTER_16(filterCoeffsUnalign);
|
||||
|
||||
// rearrange the filter coefficients for mmx routines
|
||||
for (i = 0;i < length; i += 4)
|
||||
{
|
||||
filterCoeffsAlign[2 * i + 0] = coeffs[i + 0];
|
||||
filterCoeffsAlign[2 * i + 1] = coeffs[i + 2];
|
||||
filterCoeffsAlign[2 * i + 2] = coeffs[i + 0];
|
||||
filterCoeffsAlign[2 * i + 3] = coeffs[i + 2];
|
||||
|
||||
filterCoeffsAlign[2 * i + 4] = coeffs[i + 1];
|
||||
filterCoeffsAlign[2 * i + 5] = coeffs[i + 3];
|
||||
filterCoeffsAlign[2 * i + 6] = coeffs[i + 1];
|
||||
filterCoeffsAlign[2 * i + 7] = coeffs[i + 3];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// mmx-optimized version of the filter routine for stereo sound
|
||||
uint FIRFilterMMX::evaluateFilterStereo(short *dest, const short *src, uint numSamples) const
|
||||
{
|
||||
// Create stack copies of the needed member variables for asm routines :
|
||||
uint i, j;
|
||||
__m64 *pVdest = (__m64*)dest;
|
||||
|
||||
if (length < 2) return 0;
|
||||
|
||||
for (i = 0; i < (numSamples - length) / 2; i ++)
|
||||
{
|
||||
__m64 accu1;
|
||||
__m64 accu2;
|
||||
const __m64 *pVsrc = (const __m64*)src;
|
||||
const __m64 *pVfilter = (const __m64*)filterCoeffsAlign;
|
||||
|
||||
accu1 = accu2 = _mm_setzero_si64();
|
||||
for (j = 0; j < lengthDiv8 * 2; j ++)
|
||||
{
|
||||
__m64 temp1, temp2;
|
||||
|
||||
temp1 = _mm_unpacklo_pi16(pVsrc[0], pVsrc[1]); // = l2 l0 r2 r0
|
||||
temp2 = _mm_unpackhi_pi16(pVsrc[0], pVsrc[1]); // = l3 l1 r3 r1
|
||||
|
||||
accu1 = _mm_add_pi32(accu1, _mm_madd_pi16(temp1, pVfilter[0])); // += l2*f2+l0*f0 r2*f2+r0*f0
|
||||
accu1 = _mm_add_pi32(accu1, _mm_madd_pi16(temp2, pVfilter[1])); // += l3*f3+l1*f1 r3*f3+r1*f1
|
||||
|
||||
temp1 = _mm_unpacklo_pi16(pVsrc[1], pVsrc[2]); // = l4 l2 r4 r2
|
||||
|
||||
accu2 = _mm_add_pi32(accu2, _mm_madd_pi16(temp2, pVfilter[0])); // += l3*f2+l1*f0 r3*f2+r1*f0
|
||||
accu2 = _mm_add_pi32(accu2, _mm_madd_pi16(temp1, pVfilter[1])); // += l4*f3+l2*f1 r4*f3+r2*f1
|
||||
|
||||
// accu1 += l2*f2+l0*f0 r2*f2+r0*f0
|
||||
// += l3*f3+l1*f1 r3*f3+r1*f1
|
||||
|
||||
// accu2 += l3*f2+l1*f0 r3*f2+r1*f0
|
||||
// l4*f3+l2*f1 r4*f3+r2*f1
|
||||
|
||||
pVfilter += 2;
|
||||
pVsrc += 2;
|
||||
}
|
||||
// accu >>= resultDivFactor
|
||||
accu1 = _mm_srai_pi32(accu1, resultDivFactor);
|
||||
accu2 = _mm_srai_pi32(accu2, resultDivFactor);
|
||||
|
||||
// pack 2*2*32bits => 4*16 bits
|
||||
pVdest[0] = _mm_packs_pi32(accu1, accu2);
|
||||
src += 4;
|
||||
pVdest ++;
|
||||
}
|
||||
|
||||
_m_empty(); // clear emms state
|
||||
|
||||
return (numSamples & 0xfffffffe) - length;
|
||||
}
|
||||
|
||||
#endif // SOUNDTOUCH_ALLOW_MMX
|
||||
-7
@@ -1,7 +0,0 @@
|
||||
|
||||
#ifndef SOUNDTOUCH_CONFIG_H_INCLUDED
|
||||
#define SOUNDTOUCH_CONFIG_H_INCLUDED
|
||||
|
||||
|
||||
|
||||
#endif // SOUNDTOUCH_CONFIG_H_INCLUDED
|
||||
Vendored
+21
@@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) Microsoft Corporation
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
Vendored
+111
@@ -0,0 +1,111 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// File: AMExtra.cpp
|
||||
//
|
||||
// Desc: DirectShow base classes - implements CRenderedInputPin class.
|
||||
//
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
#include <streams.h> // DirectShow base class definitions
|
||||
#include <mmsystem.h> // Needed for definition of timeGetTime
|
||||
#include <limits.h> // Standard data type limit definitions
|
||||
#include <measure.h> // Used for time critical log functions
|
||||
|
||||
#include "amextra.h"
|
||||
|
||||
#pragma warning(disable:4355)
|
||||
|
||||
// Implements CRenderedInputPin class
|
||||
|
||||
CRenderedInputPin::CRenderedInputPin(__in_opt LPCTSTR pObjectName,
|
||||
__in CBaseFilter *pFilter,
|
||||
__in CCritSec *pLock,
|
||||
__inout HRESULT *phr,
|
||||
__in_opt LPCWSTR pName) :
|
||||
CBaseInputPin(pObjectName, pFilter, pLock, phr, pName),
|
||||
m_bAtEndOfStream(FALSE),
|
||||
m_bCompleteNotified(FALSE)
|
||||
{
|
||||
}
|
||||
#ifdef UNICODE
|
||||
CRenderedInputPin::CRenderedInputPin(__in_opt LPCSTR pObjectName,
|
||||
__in CBaseFilter *pFilter,
|
||||
__in CCritSec *pLock,
|
||||
__inout HRESULT *phr,
|
||||
__in_opt LPCWSTR pName) :
|
||||
CBaseInputPin(pObjectName, pFilter, pLock, phr, pName),
|
||||
m_bAtEndOfStream(FALSE),
|
||||
m_bCompleteNotified(FALSE)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
// Flush end of stream condition - caller should do any
|
||||
// necessary stream level locking before calling this
|
||||
|
||||
STDMETHODIMP CRenderedInputPin::EndOfStream()
|
||||
{
|
||||
HRESULT hr = CheckStreaming();
|
||||
|
||||
// Do EC_COMPLETE handling for rendered pins
|
||||
if (S_OK == hr && !m_bAtEndOfStream) {
|
||||
m_bAtEndOfStream = TRUE;
|
||||
FILTER_STATE fs;
|
||||
EXECUTE_ASSERT(SUCCEEDED(m_pFilter->GetState(0, &fs)));
|
||||
if (fs == State_Running) {
|
||||
DoCompleteHandling();
|
||||
}
|
||||
}
|
||||
return hr;
|
||||
}
|
||||
|
||||
|
||||
// Called to complete the flush
|
||||
|
||||
STDMETHODIMP CRenderedInputPin::EndFlush()
|
||||
{
|
||||
CAutoLock lck(m_pLock);
|
||||
|
||||
// Clean up renderer state
|
||||
m_bAtEndOfStream = FALSE;
|
||||
m_bCompleteNotified = FALSE;
|
||||
|
||||
return CBaseInputPin::EndFlush();
|
||||
}
|
||||
|
||||
|
||||
// Notify of Run() from filter
|
||||
|
||||
HRESULT CRenderedInputPin::Run(REFERENCE_TIME tStart)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(tStart);
|
||||
m_bCompleteNotified = FALSE;
|
||||
if (m_bAtEndOfStream) {
|
||||
DoCompleteHandling();
|
||||
}
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
||||
// Clear status on going into paused state
|
||||
|
||||
HRESULT CRenderedInputPin::Active()
|
||||
{
|
||||
m_bAtEndOfStream = FALSE;
|
||||
m_bCompleteNotified = FALSE;
|
||||
return CBaseInputPin::Active();
|
||||
}
|
||||
|
||||
|
||||
// Do stuff to deliver end of stream
|
||||
|
||||
void CRenderedInputPin::DoCompleteHandling()
|
||||
{
|
||||
ASSERT(m_bAtEndOfStream);
|
||||
if (!m_bCompleteNotified) {
|
||||
m_bCompleteNotified = TRUE;
|
||||
m_pFilter->NotifyEvent(EC_COMPLETE, S_OK, (LONG_PTR)(IBaseFilter *)m_pFilter);
|
||||
}
|
||||
}
|
||||
|
||||
Vendored
+56
@@ -0,0 +1,56 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// File: AMExtra.h
|
||||
//
|
||||
// Desc: DirectShow base classes.
|
||||
//
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
#ifndef __AMEXTRA__
|
||||
#define __AMEXTRA__
|
||||
|
||||
// Simple rendered input pin
|
||||
//
|
||||
// NOTE if your filter queues stuff before rendering then it may not be
|
||||
// appropriate to use this class
|
||||
//
|
||||
// In that case queue the end of stream condition until the last sample
|
||||
// is actually rendered and flush the condition appropriately
|
||||
|
||||
class CRenderedInputPin : public CBaseInputPin
|
||||
{
|
||||
public:
|
||||
|
||||
CRenderedInputPin(__in_opt LPCTSTR pObjectName,
|
||||
__in CBaseFilter *pFilter,
|
||||
__in CCritSec *pLock,
|
||||
__inout HRESULT *phr,
|
||||
__in_opt LPCWSTR pName);
|
||||
#ifdef UNICODE
|
||||
CRenderedInputPin(__in_opt LPCSTR pObjectName,
|
||||
__in CBaseFilter *pFilter,
|
||||
__in CCritSec *pLock,
|
||||
__inout HRESULT *phr,
|
||||
__in_opt LPCWSTR pName);
|
||||
#endif
|
||||
|
||||
// Override methods to track end of stream state
|
||||
STDMETHODIMP EndOfStream();
|
||||
STDMETHODIMP EndFlush();
|
||||
|
||||
HRESULT Active();
|
||||
HRESULT Run(REFERENCE_TIME tStart);
|
||||
|
||||
protected:
|
||||
|
||||
// Member variables to track state
|
||||
BOOL m_bAtEndOfStream; // Set by EndOfStream
|
||||
BOOL m_bCompleteNotified; // Set when we notify for EC_COMPLETE
|
||||
|
||||
private:
|
||||
void DoCompleteHandling();
|
||||
};
|
||||
|
||||
#endif // __AMEXTRA__
|
||||
|
||||
+358
-203
File diff suppressed because it is too large
Load Diff
+166
-166
@@ -4,7 +4,7 @@
|
||||
// Desc: DirectShow base classes - efines class hierarchy for streams
|
||||
// architecture.
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -73,9 +73,9 @@ protected:
|
||||
public:
|
||||
|
||||
CBaseMediaFilter(
|
||||
const TCHAR *pName,
|
||||
LPUNKNOWN pUnk,
|
||||
CCritSec *pLock,
|
||||
__in_opt LPCTSTR pName,
|
||||
__inout_opt LPUNKNOWN pUnk,
|
||||
__in CCritSec *pLock,
|
||||
REFCLSID clsid);
|
||||
|
||||
virtual ~CBaseMediaFilter();
|
||||
@@ -83,21 +83,21 @@ public:
|
||||
DECLARE_IUNKNOWN
|
||||
|
||||
// override this to say what interfaces we support where
|
||||
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void ** ppv);
|
||||
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, __deref_out void ** ppv);
|
||||
|
||||
//
|
||||
// --- IPersist method ---
|
||||
//
|
||||
|
||||
STDMETHODIMP GetClassID(CLSID *pClsID);
|
||||
STDMETHODIMP GetClassID(__out CLSID *pClsID);
|
||||
|
||||
// --- IMediaFilter methods ---
|
||||
|
||||
STDMETHODIMP GetState(DWORD dwMSecs, FILTER_STATE *State);
|
||||
STDMETHODIMP GetState(DWORD dwMSecs, __out FILTER_STATE *State);
|
||||
|
||||
STDMETHODIMP SetSyncSource(IReferenceClock *pClock);
|
||||
STDMETHODIMP SetSyncSource(__inout_opt IReferenceClock *pClock);
|
||||
|
||||
STDMETHODIMP GetSyncSource(IReferenceClock **pClock);
|
||||
STDMETHODIMP GetSyncSource(__deref_out_opt IReferenceClock **pClock);
|
||||
|
||||
// default implementation of Stop and Pause just record the
|
||||
// state. Override to activate or de-activate your filter.
|
||||
@@ -168,37 +168,37 @@ protected:
|
||||
public:
|
||||
|
||||
CBaseFilter(
|
||||
const TCHAR *pName, // Object description
|
||||
LPUNKNOWN pUnk, // IUnknown of delegating object
|
||||
CCritSec *pLock, // Object who maintains lock
|
||||
REFCLSID clsid); // The clsid to be used to serialize this filter
|
||||
__in_opt LPCTSTR pName, // Object description
|
||||
__inout_opt LPUNKNOWN pUnk, // IUnknown of delegating object
|
||||
__in CCritSec *pLock, // Object who maintains lock
|
||||
REFCLSID clsid); // The clsid to be used to serialize this filter
|
||||
|
||||
CBaseFilter(
|
||||
TCHAR *pName, // Object description
|
||||
LPUNKNOWN pUnk, // IUnknown of delegating object
|
||||
CCritSec *pLock, // Object who maintains lock
|
||||
REFCLSID clsid, // The clsid to be used to serialize this filter
|
||||
HRESULT *phr); // General OLE return code
|
||||
__in_opt LPCTSTR pName, // Object description
|
||||
__in_opt LPUNKNOWN pUnk, // IUnknown of delegating object
|
||||
__in CCritSec *pLock, // Object who maintains lock
|
||||
REFCLSID clsid, // The clsid to be used to serialize this filter
|
||||
__inout HRESULT *phr); // General OLE return code
|
||||
#ifdef UNICODE
|
||||
CBaseFilter(
|
||||
const CHAR *pName, // Object description
|
||||
LPUNKNOWN pUnk, // IUnknown of delegating object
|
||||
CCritSec *pLock, // Object who maintains lock
|
||||
REFCLSID clsid); // The clsid to be used to serialize this filter
|
||||
__in_opt LPCSTR pName, // Object description
|
||||
__in_opt LPUNKNOWN pUnk, // IUnknown of delegating object
|
||||
__in CCritSec *pLock, // Object who maintains lock
|
||||
REFCLSID clsid); // The clsid to be used to serialize this filter
|
||||
|
||||
CBaseFilter(
|
||||
CHAR *pName, // Object description
|
||||
LPUNKNOWN pUnk, // IUnknown of delegating object
|
||||
CCritSec *pLock, // Object who maintains lock
|
||||
REFCLSID clsid, // The clsid to be used to serialize this filter
|
||||
HRESULT *phr); // General OLE return code
|
||||
__in_opt LPCSTR pName, // Object description
|
||||
__in_opt LPUNKNOWN pUnk, // IUnknown of delegating object
|
||||
__in CCritSec *pLock, // Object who maintains lock
|
||||
REFCLSID clsid, // The clsid to be used to serialize this filter
|
||||
__inout HRESULT *phr); // General OLE return code
|
||||
#endif
|
||||
~CBaseFilter();
|
||||
|
||||
DECLARE_IUNKNOWN
|
||||
|
||||
// override this to say what interfaces we support where
|
||||
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void ** ppv);
|
||||
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, __deref_out void ** ppv);
|
||||
#ifdef DEBUG
|
||||
STDMETHODIMP_(ULONG) NonDelegatingRelease();
|
||||
#endif
|
||||
@@ -207,15 +207,15 @@ public:
|
||||
// --- IPersist method ---
|
||||
//
|
||||
|
||||
STDMETHODIMP GetClassID(CLSID *pClsID);
|
||||
STDMETHODIMP GetClassID(__out CLSID *pClsID);
|
||||
|
||||
// --- IMediaFilter methods ---
|
||||
|
||||
STDMETHODIMP GetState(DWORD dwMSecs, FILTER_STATE *State);
|
||||
STDMETHODIMP GetState(DWORD dwMSecs, __out FILTER_STATE *State);
|
||||
|
||||
STDMETHODIMP SetSyncSource(IReferenceClock *pClock);
|
||||
STDMETHODIMP SetSyncSource(__in_opt IReferenceClock *pClock);
|
||||
|
||||
STDMETHODIMP GetSyncSource(IReferenceClock **pClock);
|
||||
STDMETHODIMP GetSyncSource(__deref_out_opt IReferenceClock **pClock);
|
||||
|
||||
|
||||
// override Stop and Pause so we can activate the pins.
|
||||
@@ -253,27 +253,27 @@ public:
|
||||
|
||||
// pin enumerator
|
||||
STDMETHODIMP EnumPins(
|
||||
IEnumPins ** ppEnum);
|
||||
__deref_out IEnumPins ** ppEnum);
|
||||
|
||||
|
||||
// default behaviour of FindPin assumes pin ids are their names
|
||||
STDMETHODIMP FindPin(
|
||||
LPCWSTR Id,
|
||||
IPin ** ppPin
|
||||
__deref_out IPin ** ppPin
|
||||
);
|
||||
|
||||
STDMETHODIMP QueryFilterInfo(
|
||||
FILTER_INFO * pInfo);
|
||||
__out FILTER_INFO * pInfo);
|
||||
|
||||
STDMETHODIMP JoinFilterGraph(
|
||||
IFilterGraph * pGraph,
|
||||
LPCWSTR pName);
|
||||
__inout_opt IFilterGraph * pGraph,
|
||||
__in_opt LPCWSTR pName);
|
||||
|
||||
// return a Vendor information string. Optional - may return E_NOTIMPL.
|
||||
// memory returned should be freed using CoTaskMemFree
|
||||
// default implementation returns E_NOTIMPL
|
||||
STDMETHODIMP QueryVendorInfo(
|
||||
LPWSTR* pVendorInfo
|
||||
__deref_out LPWSTR* pVendorInfo
|
||||
);
|
||||
|
||||
// --- helper methods ---
|
||||
@@ -287,7 +287,7 @@ public:
|
||||
LONG_PTR EventParam2);
|
||||
|
||||
// return the filter graph we belong to
|
||||
IFilterGraph *GetFilterGraph() {
|
||||
__out_opt IFilterGraph *GetFilterGraph() {
|
||||
return m_pGraph;
|
||||
}
|
||||
|
||||
@@ -295,7 +295,7 @@ public:
|
||||
// pPin is the pin to reconnect
|
||||
// pmt is the type to reconnect with - can be NULL
|
||||
// Calls ReconnectEx on the filter graph
|
||||
HRESULT ReconnectPin(IPin *pPin, AM_MEDIA_TYPE const *pmt);
|
||||
HRESULT ReconnectPin(IPin *pPin, __in_opt AM_MEDIA_TYPE const *pmt);
|
||||
|
||||
// find out the current pin version (used by enumerators)
|
||||
virtual LONG GetPinVersion();
|
||||
@@ -314,7 +314,7 @@ public:
|
||||
// --- setup helper methods ---
|
||||
// (override to return filters setup data)
|
||||
|
||||
virtual LPAMOVIESETUP_FILTER GetSetupData(){ return NULL; }
|
||||
virtual __out_opt LPAMOVIESETUP_FILTER GetSetupData(){ return NULL; }
|
||||
|
||||
};
|
||||
|
||||
@@ -376,8 +376,8 @@ protected:
|
||||
// try all the media types in this enumerator - for each that
|
||||
// we accept, try to connect using ReceiveConnection.
|
||||
HRESULT TryMediaTypes(
|
||||
IPin *pReceivePin, // connect to this pin
|
||||
const CMediaType *pmt, // proposed type from Connect
|
||||
IPin *pReceivePin, // connect to this pin
|
||||
__in_opt const CMediaType *pmt, // proposed type from Connect
|
||||
IEnumMediaTypes *pEnum); // try this enumerator
|
||||
|
||||
// establish a connection with a suitable mediatype. Needs to
|
||||
@@ -386,31 +386,31 @@ protected:
|
||||
// enumerator until we find one that works.
|
||||
HRESULT AgreeMediaType(
|
||||
IPin *pReceivePin, // connect to this pin
|
||||
const CMediaType *pmt); // proposed type from Connect
|
||||
const CMediaType *pmt); // proposed type from Connect
|
||||
|
||||
public:
|
||||
|
||||
CBasePin(
|
||||
TCHAR *pObjectName, // Object description
|
||||
CBaseFilter *pFilter, // Owning filter who knows about pins
|
||||
CCritSec *pLock, // Object who implements the lock
|
||||
HRESULT *phr, // General OLE return code
|
||||
LPCWSTR pName, // Pin name for us
|
||||
__in_opt LPCTSTR pObjectName, // Object description
|
||||
__in CBaseFilter *pFilter, // Owning filter who knows about pins
|
||||
__in CCritSec *pLock, // Object who implements the lock
|
||||
__inout HRESULT *phr, // General OLE return code
|
||||
__in_opt LPCWSTR pName, // Pin name for us
|
||||
PIN_DIRECTION dir); // Either PINDIR_INPUT or PINDIR_OUTPUT
|
||||
#ifdef UNICODE
|
||||
CBasePin(
|
||||
CHAR *pObjectName, // Object description
|
||||
CBaseFilter *pFilter, // Owning filter who knows about pins
|
||||
CCritSec *pLock, // Object who implements the lock
|
||||
HRESULT *phr, // General OLE return code
|
||||
LPCWSTR pName, // Pin name for us
|
||||
__in_opt LPCSTR pObjectName, // Object description
|
||||
__in CBaseFilter *pFilter, // Owning filter who knows about pins
|
||||
__in CCritSec *pLock, // Object who implements the lock
|
||||
__inout HRESULT *phr, // General OLE return code
|
||||
__in_opt LPCWSTR pName, // Pin name for us
|
||||
PIN_DIRECTION dir); // Either PINDIR_INPUT or PINDIR_OUTPUT
|
||||
#endif
|
||||
virtual ~CBasePin();
|
||||
|
||||
DECLARE_IUNKNOWN
|
||||
|
||||
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void ** ppv);
|
||||
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, __deref_out void ** ppv);
|
||||
STDMETHODIMP_(ULONG) NonDelegatingRelease();
|
||||
STDMETHODIMP_(ULONG) NonDelegatingAddRef();
|
||||
|
||||
@@ -421,7 +421,7 @@ public:
|
||||
// (subtype or format type may be GUID_NULL).
|
||||
STDMETHODIMP Connect(
|
||||
IPin * pReceivePin,
|
||||
const AM_MEDIA_TYPE *pmt // optional media type
|
||||
__in_opt const AM_MEDIA_TYPE *pmt // optional media type
|
||||
);
|
||||
|
||||
// (passive) accept a connection from another pin
|
||||
@@ -432,20 +432,20 @@ public:
|
||||
|
||||
STDMETHODIMP Disconnect();
|
||||
|
||||
STDMETHODIMP ConnectedTo(IPin **pPin);
|
||||
STDMETHODIMP ConnectedTo(__deref_out IPin **pPin);
|
||||
|
||||
STDMETHODIMP ConnectionMediaType(AM_MEDIA_TYPE *pmt);
|
||||
STDMETHODIMP ConnectionMediaType(__out AM_MEDIA_TYPE *pmt);
|
||||
|
||||
STDMETHODIMP QueryPinInfo(
|
||||
PIN_INFO * pInfo
|
||||
__out PIN_INFO * pInfo
|
||||
);
|
||||
|
||||
STDMETHODIMP QueryDirection(
|
||||
PIN_DIRECTION * pPinDir
|
||||
__out PIN_DIRECTION * pPinDir
|
||||
);
|
||||
|
||||
STDMETHODIMP QueryId(
|
||||
LPWSTR * Id
|
||||
__deref_out LPWSTR * Id
|
||||
);
|
||||
|
||||
// does the pin support this media type
|
||||
@@ -455,7 +455,7 @@ public:
|
||||
|
||||
// return an enumerator for this pins preferred media types
|
||||
STDMETHODIMP EnumMediaTypes(
|
||||
IEnumMediaTypes **ppEnum
|
||||
__deref_out IEnumMediaTypes **ppEnum
|
||||
);
|
||||
|
||||
// return an array of IPin* - the pins that this pin internally connects to
|
||||
@@ -466,9 +466,9 @@ public:
|
||||
// all visible output pins and vice versa.
|
||||
// apPin can be NULL if nPin==0 (not otherwise).
|
||||
STDMETHODIMP QueryInternalConnections(
|
||||
IPin* *apPin, // array of IPin*
|
||||
ULONG *nPin // on input, the number of slots
|
||||
// on output the number of pins
|
||||
__out_ecount_part(*nPin,*nPin) IPin* *apPin, // array of IPin*
|
||||
__inout ULONG *nPin // on input, the number of slots
|
||||
// on output the number of pins
|
||||
) { return E_NOTIMPL; }
|
||||
|
||||
// Called when no more data will be sent
|
||||
@@ -534,7 +534,7 @@ public:
|
||||
virtual HRESULT CompleteConnect(IPin *pReceivePin);
|
||||
|
||||
// returns the preferred formats for a pin
|
||||
virtual HRESULT GetMediaType(int iPosition,CMediaType *pMediaType);
|
||||
virtual HRESULT GetMediaType(int iPosition, __inout CMediaType *pMediaType);
|
||||
|
||||
// access to NewSegment values
|
||||
REFERENCE_TIME CurrentStopTime() {
|
||||
@@ -616,26 +616,26 @@ class CEnumPins : public IEnumPins // The interface we support
|
||||
public:
|
||||
|
||||
CEnumPins(
|
||||
CBaseFilter *pFilter,
|
||||
CEnumPins *pEnumPins);
|
||||
__in CBaseFilter *pFilter,
|
||||
__in_opt CEnumPins *pEnumPins);
|
||||
|
||||
virtual ~CEnumPins();
|
||||
|
||||
// IUnknown
|
||||
STDMETHODIMP QueryInterface(REFIID riid, void **ppv);
|
||||
STDMETHODIMP QueryInterface(REFIID riid, __deref_out void **ppv);
|
||||
STDMETHODIMP_(ULONG) AddRef();
|
||||
STDMETHODIMP_(ULONG) Release();
|
||||
|
||||
// IEnumPins
|
||||
STDMETHODIMP Next(
|
||||
ULONG cPins, // place this many pins...
|
||||
IPin ** ppPins, // ...in this array of IPin*
|
||||
ULONG * pcFetched // actual count passed returned here
|
||||
__out_ecount(cPins) IPin ** ppPins, // ...in this array of IPin*
|
||||
__out_opt ULONG * pcFetched // actual count passed returned here
|
||||
);
|
||||
|
||||
STDMETHODIMP Skip(ULONG cPins);
|
||||
STDMETHODIMP Reset();
|
||||
STDMETHODIMP Clone(IEnumPins **ppEnum);
|
||||
STDMETHODIMP Clone(__deref_out IEnumPins **ppEnum);
|
||||
|
||||
|
||||
};
|
||||
@@ -672,26 +672,26 @@ class CEnumMediaTypes : public IEnumMediaTypes // The interface we support
|
||||
public:
|
||||
|
||||
CEnumMediaTypes(
|
||||
CBasePin *pPin,
|
||||
CEnumMediaTypes *pEnumMediaTypes);
|
||||
__in CBasePin *pPin,
|
||||
__in_opt CEnumMediaTypes *pEnumMediaTypes);
|
||||
|
||||
virtual ~CEnumMediaTypes();
|
||||
|
||||
// IUnknown
|
||||
STDMETHODIMP QueryInterface(REFIID riid, void **ppv);
|
||||
STDMETHODIMP QueryInterface(REFIID riid, __deref_out void **ppv);
|
||||
STDMETHODIMP_(ULONG) AddRef();
|
||||
STDMETHODIMP_(ULONG) Release();
|
||||
|
||||
// IEnumMediaTypes
|
||||
STDMETHODIMP Next(
|
||||
ULONG cMediaTypes, // place this many pins...
|
||||
AM_MEDIA_TYPE ** ppMediaTypes, // ...in this array
|
||||
ULONG * pcFetched // actual count passed
|
||||
__out_ecount(cMediaTypes) AM_MEDIA_TYPE ** ppMediaTypes, // ...in this array
|
||||
__out_opt ULONG * pcFetched // actual count passed
|
||||
);
|
||||
|
||||
STDMETHODIMP Skip(ULONG cMediaTypes);
|
||||
STDMETHODIMP Reset();
|
||||
STDMETHODIMP Clone(IEnumMediaTypes **ppEnum);
|
||||
STDMETHODIMP Clone(__deref_out IEnumMediaTypes **ppEnum);
|
||||
};
|
||||
|
||||
|
||||
@@ -721,25 +721,25 @@ protected:
|
||||
public:
|
||||
|
||||
CBaseOutputPin(
|
||||
TCHAR *pObjectName,
|
||||
CBaseFilter *pFilter,
|
||||
CCritSec *pLock,
|
||||
HRESULT *phr,
|
||||
LPCWSTR pName);
|
||||
__in_opt LPCTSTR pObjectName,
|
||||
__in CBaseFilter *pFilter,
|
||||
__in CCritSec *pLock,
|
||||
__inout HRESULT *phr,
|
||||
__in_opt LPCWSTR pName);
|
||||
#ifdef UNICODE
|
||||
CBaseOutputPin(
|
||||
CHAR *pObjectName,
|
||||
CBaseFilter *pFilter,
|
||||
CCritSec *pLock,
|
||||
HRESULT *phr,
|
||||
LPCWSTR pName);
|
||||
__in_opt LPCSTR pObjectName,
|
||||
__in CBaseFilter *pFilter,
|
||||
__in CCritSec *pLock,
|
||||
__inout HRESULT *phr,
|
||||
__in_opt LPCWSTR pName);
|
||||
#endif
|
||||
// override CompleteConnect() so we can negotiate an allocator
|
||||
virtual HRESULT CompleteConnect(IPin *pReceivePin);
|
||||
|
||||
// negotiate the allocator and its buffer size/count and other properties
|
||||
// Calls DecideBufferSize to set properties
|
||||
virtual HRESULT DecideAllocator(IMemInputPin * pPin, IMemAllocator ** pAlloc);
|
||||
virtual HRESULT DecideAllocator(IMemInputPin * pPin, __deref_out IMemAllocator ** pAlloc);
|
||||
|
||||
// override this to set the buffer size and count. Return an error
|
||||
// if the size/count is not to your liking.
|
||||
@@ -748,13 +748,13 @@ public:
|
||||
// no preference on these.
|
||||
virtual HRESULT DecideBufferSize(
|
||||
IMemAllocator * pAlloc,
|
||||
ALLOCATOR_PROPERTIES * ppropInputRequest
|
||||
__inout ALLOCATOR_PROPERTIES * ppropInputRequest
|
||||
) PURE;
|
||||
|
||||
// returns an empty sample buffer from the allocator
|
||||
virtual HRESULT GetDeliveryBuffer(IMediaSample ** ppSample,
|
||||
REFERENCE_TIME * pStartTime,
|
||||
REFERENCE_TIME * pEndTime,
|
||||
virtual HRESULT GetDeliveryBuffer(__deref_out IMediaSample ** ppSample,
|
||||
__in_opt REFERENCE_TIME * pStartTime,
|
||||
__in_opt REFERENCE_TIME * pEndTime,
|
||||
DWORD dwFlags);
|
||||
|
||||
// deliver a filled-in sample to the connected input pin
|
||||
@@ -764,7 +764,7 @@ public:
|
||||
virtual HRESULT Deliver(IMediaSample *);
|
||||
|
||||
// override this to control the connection
|
||||
virtual HRESULT InitAllocator(IMemAllocator **ppAlloc);
|
||||
virtual HRESULT InitAllocator(__deref_out IMemAllocator **ppAlloc);
|
||||
HRESULT CheckConnect(IPin *pPin);
|
||||
HRESULT BreakConnect();
|
||||
|
||||
@@ -839,29 +839,29 @@ protected:
|
||||
public:
|
||||
|
||||
CBaseInputPin(
|
||||
TCHAR *pObjectName,
|
||||
CBaseFilter *pFilter,
|
||||
CCritSec *pLock,
|
||||
HRESULT *phr,
|
||||
LPCWSTR pName);
|
||||
__in_opt LPCTSTR pObjectName,
|
||||
__in CBaseFilter *pFilter,
|
||||
__in CCritSec *pLock,
|
||||
__inout HRESULT *phr,
|
||||
__in_opt LPCWSTR pName);
|
||||
#ifdef UNICODE
|
||||
CBaseInputPin(
|
||||
CHAR *pObjectName,
|
||||
CBaseFilter *pFilter,
|
||||
CCritSec *pLock,
|
||||
HRESULT *phr,
|
||||
LPCWSTR pName);
|
||||
__in_opt LPCSTR pObjectName,
|
||||
__in CBaseFilter *pFilter,
|
||||
__in CCritSec *pLock,
|
||||
__inout HRESULT *phr,
|
||||
__in_opt LPCWSTR pName);
|
||||
#endif
|
||||
virtual ~CBaseInputPin();
|
||||
|
||||
DECLARE_IUNKNOWN
|
||||
|
||||
// override this to publicise our interfaces
|
||||
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv);
|
||||
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv);
|
||||
|
||||
// return the allocator interface that this input pin
|
||||
// would like the output pin to use
|
||||
STDMETHODIMP GetAllocator(IMemAllocator ** ppAllocator);
|
||||
STDMETHODIMP GetAllocator(__deref_out IMemAllocator ** ppAllocator);
|
||||
|
||||
// tell the input pin which allocator the output pin is actually
|
||||
// going to use.
|
||||
@@ -874,9 +874,9 @@ public:
|
||||
|
||||
// do something with these media samples
|
||||
STDMETHODIMP ReceiveMultiple (
|
||||
IMediaSample **pSamples,
|
||||
__in_ecount(nSamples) IMediaSample **pSamples,
|
||||
long nSamples,
|
||||
long *nSamplesProcessed);
|
||||
__out long *nSamplesProcessed);
|
||||
|
||||
// See if Receive() blocks
|
||||
STDMETHODIMP ReceiveCanBlock();
|
||||
@@ -898,7 +898,7 @@ public:
|
||||
// default implementation returns E_NOTIMPL. Override if you have
|
||||
// specific alignment or prefix needs, but could use an upstream
|
||||
// allocator
|
||||
STDMETHODIMP GetAllocatorRequirements(ALLOCATOR_PROPERTIES*pProps);
|
||||
STDMETHODIMP GetAllocatorRequirements(__out ALLOCATOR_PROPERTIES*pProps);
|
||||
|
||||
// Release the pin's allocator.
|
||||
HRESULT BreakConnect();
|
||||
@@ -952,25 +952,25 @@ class CDynamicOutputPin : public CBaseOutputPin,
|
||||
public:
|
||||
#ifdef UNICODE
|
||||
CDynamicOutputPin(
|
||||
CHAR *pObjectName,
|
||||
CBaseFilter *pFilter,
|
||||
CCritSec *pLock,
|
||||
HRESULT *phr,
|
||||
LPCWSTR pName);
|
||||
__in_opt LPCSTR pObjectName,
|
||||
__in CBaseFilter *pFilter,
|
||||
__in CCritSec *pLock,
|
||||
__inout HRESULT *phr,
|
||||
__in_opt LPCWSTR pName);
|
||||
#endif
|
||||
|
||||
CDynamicOutputPin(
|
||||
TCHAR *pObjectName,
|
||||
CBaseFilter *pFilter,
|
||||
CCritSec *pLock,
|
||||
HRESULT *phr,
|
||||
LPCWSTR pName);
|
||||
__in_opt LPCTSTR pObjectName,
|
||||
__in CBaseFilter *pFilter,
|
||||
__in CCritSec *pLock,
|
||||
__inout HRESULT *phr,
|
||||
__in_opt LPCWSTR pName);
|
||||
|
||||
~CDynamicOutputPin();
|
||||
|
||||
// IUnknown Methods
|
||||
DECLARE_IUNKNOWN
|
||||
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv);
|
||||
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv);
|
||||
|
||||
// IPin Methods
|
||||
STDMETHODIMP Disconnect(void);
|
||||
@@ -1083,14 +1083,14 @@ private:
|
||||
class CAutoUsingOutputPin
|
||||
{
|
||||
public:
|
||||
CAutoUsingOutputPin( CDynamicOutputPin* pOutputPin, HRESULT* phr );
|
||||
CAutoUsingOutputPin( __in CDynamicOutputPin* pOutputPin, __inout HRESULT* phr );
|
||||
~CAutoUsingOutputPin();
|
||||
|
||||
private:
|
||||
CDynamicOutputPin* m_pOutputPin;
|
||||
};
|
||||
|
||||
inline CAutoUsingOutputPin::CAutoUsingOutputPin( CDynamicOutputPin* pOutputPin, HRESULT* phr ) :
|
||||
inline CAutoUsingOutputPin::CAutoUsingOutputPin( __in CDynamicOutputPin* pOutputPin, __inout HRESULT* phr ) :
|
||||
m_pOutputPin(NULL)
|
||||
{
|
||||
// The caller should always pass in valid pointers.
|
||||
@@ -1213,7 +1213,7 @@ protected:
|
||||
into the top word
|
||||
*/
|
||||
DWORD m_dwTypeSpecificFlags; /* Media type specific flags */
|
||||
LPBYTE m_pBuffer; /* Pointer to the complete buffer */
|
||||
__field_ecount_opt(m_cbBuffer) LPBYTE m_pBuffer; /* Pointer to the complete buffer */
|
||||
LONG m_lActual; /* Length of data in this sample */
|
||||
LONG m_cbBuffer; /* Size of the buffer */
|
||||
CBaseAllocator *m_pAllocator; /* The allocator who owns us */
|
||||
@@ -1231,17 +1231,17 @@ public:
|
||||
public:
|
||||
|
||||
CMediaSample(
|
||||
TCHAR *pName,
|
||||
CBaseAllocator *pAllocator,
|
||||
HRESULT *phr,
|
||||
LPBYTE pBuffer = NULL,
|
||||
__in_opt LPCTSTR pName,
|
||||
__in_opt CBaseAllocator *pAllocator,
|
||||
__inout_opt HRESULT *phr,
|
||||
__in_bcount_opt(length) LPBYTE pBuffer = NULL,
|
||||
LONG length = 0);
|
||||
#ifdef UNICODE
|
||||
CMediaSample(
|
||||
CHAR *pName,
|
||||
CBaseAllocator *pAllocator,
|
||||
HRESULT *phr,
|
||||
LPBYTE pBuffer = NULL,
|
||||
__in_opt LPCSTR pName,
|
||||
__in_opt CBaseAllocator *pAllocator,
|
||||
__inout_opt HRESULT *phr,
|
||||
__in_bcount_opt(length) LPBYTE pBuffer = NULL,
|
||||
LONG length = 0);
|
||||
#endif
|
||||
|
||||
@@ -1249,7 +1249,7 @@ public:
|
||||
|
||||
/* Note the media sample does not delegate to its owner */
|
||||
|
||||
STDMETHODIMP QueryInterface(REFIID riid, void **ppv);
|
||||
STDMETHODIMP QueryInterface(REFIID riid, __deref_out void **ppv);
|
||||
STDMETHODIMP_(ULONG) AddRef();
|
||||
STDMETHODIMP_(ULONG) Release();
|
||||
|
||||
@@ -1257,23 +1257,23 @@ public:
|
||||
// want variable sized pointers or pointers into already-read data.
|
||||
// This is only available through a CMediaSample* not an IMediaSample*
|
||||
// and so cannot be changed by clients.
|
||||
HRESULT SetPointer(BYTE * ptr, LONG cBytes);
|
||||
HRESULT SetPointer(__in_bcount(cBytes) BYTE * ptr, LONG cBytes);
|
||||
|
||||
// Get me a read/write pointer to this buffer's memory.
|
||||
STDMETHODIMP GetPointer(BYTE ** ppBuffer);
|
||||
STDMETHODIMP GetPointer(__deref_out BYTE ** ppBuffer);
|
||||
|
||||
STDMETHODIMP_(LONG) GetSize(void);
|
||||
|
||||
// get the stream time at which this sample should start and finish.
|
||||
STDMETHODIMP GetTime(
|
||||
REFERENCE_TIME * pTimeStart, // put time here
|
||||
REFERENCE_TIME * pTimeEnd
|
||||
__out REFERENCE_TIME * pTimeStart, // put time here
|
||||
__out REFERENCE_TIME * pTimeEnd
|
||||
);
|
||||
|
||||
// Set the stream time at which this sample should start and finish.
|
||||
STDMETHODIMP SetTime(
|
||||
REFERENCE_TIME * pTimeStart, // put time here
|
||||
REFERENCE_TIME * pTimeEnd
|
||||
__in_opt REFERENCE_TIME * pTimeStart, // put time here
|
||||
__in_opt REFERENCE_TIME * pTimeEnd
|
||||
);
|
||||
STDMETHODIMP IsSyncPoint(void);
|
||||
STDMETHODIMP SetSyncPoint(BOOL bIsSyncPoint);
|
||||
@@ -1285,8 +1285,8 @@ public:
|
||||
|
||||
// these allow for limited format changes in band
|
||||
|
||||
STDMETHODIMP GetMediaType(AM_MEDIA_TYPE **ppMediaType);
|
||||
STDMETHODIMP SetMediaType(AM_MEDIA_TYPE *pMediaType);
|
||||
STDMETHODIMP GetMediaType(__deref_out AM_MEDIA_TYPE **ppMediaType);
|
||||
STDMETHODIMP SetMediaType(__in_opt AM_MEDIA_TYPE *pMediaType);
|
||||
|
||||
// returns S_OK if there is a discontinuity in the data (this same is
|
||||
// not a continuation of the previous stream of data
|
||||
@@ -1298,25 +1298,25 @@ public:
|
||||
|
||||
// get the media times for this sample
|
||||
STDMETHODIMP GetMediaTime(
|
||||
LONGLONG * pTimeStart,
|
||||
LONGLONG * pTimeEnd
|
||||
__out LONGLONG * pTimeStart,
|
||||
__out LONGLONG * pTimeEnd
|
||||
);
|
||||
|
||||
// Set the media times for this sample
|
||||
STDMETHODIMP SetMediaTime(
|
||||
LONGLONG * pTimeStart,
|
||||
LONGLONG * pTimeEnd
|
||||
__in_opt LONGLONG * pTimeStart,
|
||||
__in_opt LONGLONG * pTimeEnd
|
||||
);
|
||||
|
||||
// Set and get properties (IMediaSample2)
|
||||
STDMETHODIMP GetProperties(
|
||||
DWORD cbProperties,
|
||||
BYTE * pbProperties
|
||||
__out_bcount(cbProperties) BYTE * pbProperties
|
||||
);
|
||||
|
||||
STDMETHODIMP SetProperties(
|
||||
DWORD cbProperties,
|
||||
const BYTE * pbProperties
|
||||
__in_bcount(cbProperties) const BYTE * pbProperties
|
||||
);
|
||||
};
|
||||
|
||||
@@ -1344,7 +1344,7 @@ class AM_NOVTABLE CBaseAllocator : public CUnknown,// A non delegating IUnknown
|
||||
friend class CSampleList;
|
||||
|
||||
/* Trick to get at protected member in CMediaSample */
|
||||
static CMediaSample * &NextSample(CMediaSample *pSample)
|
||||
static CMediaSample * &NextSample(__in CMediaSample *pSample)
|
||||
{
|
||||
return pSample->m_pNext;
|
||||
};
|
||||
@@ -1361,9 +1361,9 @@ class AM_NOVTABLE CBaseAllocator : public CUnknown,// A non delegating IUnknown
|
||||
};
|
||||
#endif
|
||||
CMediaSample *Head() const { return m_List; };
|
||||
CMediaSample *Next(CMediaSample *pSample) const { return CBaseAllocator::NextSample(pSample); };
|
||||
CMediaSample *Next(__in CMediaSample *pSample) const { return CBaseAllocator::NextSample(pSample); };
|
||||
int GetCount() const { return m_nOnList; };
|
||||
void Add(CMediaSample *pSample)
|
||||
void Add(__inout CMediaSample *pSample)
|
||||
{
|
||||
ASSERT(pSample != NULL);
|
||||
CBaseAllocator::NextSample(pSample) = m_List;
|
||||
@@ -1379,7 +1379,7 @@ class AM_NOVTABLE CBaseAllocator : public CUnknown,// A non delegating IUnknown
|
||||
}
|
||||
return pSample;
|
||||
};
|
||||
void Remove(CMediaSample *pSample);
|
||||
void Remove(__inout CMediaSample *pSample);
|
||||
|
||||
public:
|
||||
CMediaSample *m_List;
|
||||
@@ -1455,11 +1455,11 @@ protected:
|
||||
public:
|
||||
|
||||
CBaseAllocator(
|
||||
TCHAR *, LPUNKNOWN, HRESULT *,
|
||||
__in_opt LPCTSTR , __inout_opt LPUNKNOWN, __inout HRESULT *,
|
||||
BOOL bEvent = TRUE, BOOL fEnableReleaseCallback = FALSE);
|
||||
#ifdef UNICODE
|
||||
CBaseAllocator(
|
||||
CHAR *, LPUNKNOWN, HRESULT *,
|
||||
__in_opt LPCSTR , __inout_opt LPUNKNOWN, __inout HRESULT *,
|
||||
BOOL bEvent = TRUE, BOOL fEnableReleaseCallback = FALSE);
|
||||
#endif
|
||||
virtual ~CBaseAllocator();
|
||||
@@ -1467,15 +1467,15 @@ public:
|
||||
DECLARE_IUNKNOWN
|
||||
|
||||
// override this to publicise our interfaces
|
||||
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv);
|
||||
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv);
|
||||
|
||||
STDMETHODIMP SetProperties(
|
||||
ALLOCATOR_PROPERTIES* pRequest,
|
||||
ALLOCATOR_PROPERTIES* pActual);
|
||||
__in ALLOCATOR_PROPERTIES* pRequest,
|
||||
__out ALLOCATOR_PROPERTIES* pActual);
|
||||
|
||||
// return the properties actually being used on this allocator
|
||||
STDMETHODIMP GetProperties(
|
||||
ALLOCATOR_PROPERTIES* pProps);
|
||||
__out ALLOCATOR_PROPERTIES* pProps);
|
||||
|
||||
// override Commit to allocate memory. We handle the GetBuffer
|
||||
//state changes
|
||||
@@ -1494,9 +1494,9 @@ public:
|
||||
// bPrevFramesSkipped is not used (used only by the video renderer's
|
||||
// allocator where it affects quality management in direct draw).
|
||||
|
||||
STDMETHODIMP GetBuffer(IMediaSample **ppBuffer,
|
||||
REFERENCE_TIME * pStartTime,
|
||||
REFERENCE_TIME * pEndTime,
|
||||
STDMETHODIMP GetBuffer(__deref_out IMediaSample **ppBuffer,
|
||||
__in_opt REFERENCE_TIME * pStartTime,
|
||||
__in_opt REFERENCE_TIME * pEndTime,
|
||||
DWORD dwFlags);
|
||||
|
||||
// final release of a CMediaSample will call this
|
||||
@@ -1505,7 +1505,7 @@ public:
|
||||
|
||||
STDMETHODIMP SetNotify(IMemAllocatorNotifyCallbackTemp *pNotify);
|
||||
|
||||
STDMETHODIMP GetFreeCount(LONG *plBuffersFree);
|
||||
STDMETHODIMP GetFreeCount(__out LONG *plBuffersFree);
|
||||
|
||||
// Notify that a sample is available
|
||||
void NotifySample();
|
||||
@@ -1532,7 +1532,7 @@ public:
|
||||
//=====================================================================
|
||||
|
||||
// Make me one from quartz.dll
|
||||
STDAPI CreateMemoryAllocator(IMemAllocator **ppAllocator);
|
||||
STDAPI CreateMemoryAllocator(__deref_out IMemAllocator **ppAllocator);
|
||||
|
||||
class CMemAllocator : public CBaseAllocator
|
||||
{
|
||||
@@ -1554,15 +1554,15 @@ protected:
|
||||
|
||||
public:
|
||||
/* This goes in the factory template table to create new instances */
|
||||
static CUnknown *CreateInstance(LPUNKNOWN, HRESULT *);
|
||||
static CUnknown *CreateInstance(__inout_opt LPUNKNOWN, __inout HRESULT *);
|
||||
|
||||
STDMETHODIMP SetProperties(
|
||||
ALLOCATOR_PROPERTIES* pRequest,
|
||||
ALLOCATOR_PROPERTIES* pActual);
|
||||
__in ALLOCATOR_PROPERTIES* pRequest,
|
||||
__out ALLOCATOR_PROPERTIES* pActual);
|
||||
|
||||
CMemAllocator(TCHAR *, LPUNKNOWN, HRESULT *);
|
||||
CMemAllocator(__in_opt LPCTSTR , __inout_opt LPUNKNOWN, __inout HRESULT *);
|
||||
#ifdef UNICODE
|
||||
CMemAllocator(CHAR *, LPUNKNOWN, HRESULT *);
|
||||
CMemAllocator(__in_opt LPCSTR , __inout_opt LPUNKNOWN, __inout HRESULT *);
|
||||
#endif
|
||||
~CMemAllocator();
|
||||
};
|
||||
@@ -4,11 +4,11 @@
|
||||
// Desc: DirectShow base classes - implements helper functions for
|
||||
// bitmap formats.
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
#include "streams.h"
|
||||
#include <streams.h>
|
||||
#include <limits.h>
|
||||
|
||||
// These are bit field masks for true colour devices
|
||||
+113
@@ -0,0 +1,113 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{27F17499-A372-4408-8AFA-4F9F4584FBD3}</ProjectGuid>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</ConfigurationType>
|
||||
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
|
||||
<CharacterSet>MultiByte</CharacterSet>
|
||||
<WholeProgramOptimization Condition="$(Configuration.Contains(Release))">true</WholeProgramOptimization>
|
||||
<UseDebugLibraries Condition="$(Configuration.Contains(Debug))">true</UseDebugLibraries>
|
||||
<UseDebugLibraries Condition="!$(Configuration.Contains(Debug))">false</UseDebugLibraries>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings" />
|
||||
<ImportGroup Label="PropertySheets">
|
||||
<Import Project="..\..\3rdparty\DefaultProjectRootDir.props" />
|
||||
<Import Project="..\..\3rdparty\3rdparty.props" />
|
||||
<Import Condition="$(Configuration.Contains(Debug))" Project="..\..\common\vsprops\CodeGen_Debug.props" />
|
||||
<Import Condition="$(Configuration.Contains(Release))" Project="..\..\common\vsprops\CodeGen_Release.props" />
|
||||
<Import Condition="!$(Configuration.Contains(Release))" Project="..\..\common\vsprops\IncrementalLinking.props" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup>
|
||||
<CodeAnalysisRuleSet>AllRules.ruleset</CodeAnalysisRuleSet>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup>
|
||||
<ClCompile>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<PrecompiledHeaderFile>streams.h</PrecompiledHeaderFile>
|
||||
</ClCompile>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="amextra.h" />
|
||||
<ClInclude Include="amfilter.h" />
|
||||
<ClInclude Include="cache.h" />
|
||||
<ClInclude Include="combase.h" />
|
||||
<ClInclude Include="ctlutil.h" />
|
||||
<ClInclude Include="ddmm.h" />
|
||||
<ClInclude Include="fourcc.h" />
|
||||
<ClInclude Include="measure.h" />
|
||||
<ClInclude Include="msgthrd.h" />
|
||||
<ClInclude Include="mtype.h" />
|
||||
<ClInclude Include="outputq.h" />
|
||||
<ClInclude Include="pstream.h" />
|
||||
<ClInclude Include="pullpin.h" />
|
||||
<ClInclude Include="refclock.h" />
|
||||
<ClInclude Include="reftime.h" />
|
||||
<ClInclude Include="renbase.h" />
|
||||
<ClInclude Include="schedule.h" />
|
||||
<ClInclude Include="seekpt.h" />
|
||||
<ClInclude Include="source.h" />
|
||||
<ClInclude Include="streams.h" />
|
||||
<ClInclude Include="strmctl.h" />
|
||||
<ClInclude Include="sysclock.h" />
|
||||
<ClInclude Include="transfrm.h" />
|
||||
<ClInclude Include="transip.h" />
|
||||
<ClInclude Include="vtrans.h" />
|
||||
<ClInclude Include="wxdebug.h" />
|
||||
<ClInclude Include="wxlist.h" />
|
||||
<ClInclude Include="wxutil.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="amextra.cpp" />
|
||||
<ClCompile Include="amfilter.cpp" />
|
||||
<ClCompile Include="amvideo.cpp" />
|
||||
<ClCompile Include="combase.cpp" />
|
||||
<ClCompile Include="ctlutil.cpp" />
|
||||
<ClCompile Include="ddmm.cpp">
|
||||
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
<ClCompile Include="mtype.cpp" />
|
||||
<ClCompile Include="outputq.cpp" />
|
||||
<ClCompile Include="pstream.cpp" />
|
||||
<ClCompile Include="pullpin.cpp" />
|
||||
<ClCompile Include="refclock.cpp" />
|
||||
<ClCompile Include="renbase.cpp" />
|
||||
<ClCompile Include="schedule.cpp" />
|
||||
<ClCompile Include="seekpt.cpp">
|
||||
<PrecompiledHeader>Create</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
<ClCompile Include="source.cpp" />
|
||||
<ClCompile Include="strmctl.cpp" />
|
||||
<ClCompile Include="sysclock.cpp" />
|
||||
<ClCompile Include="transfrm.cpp" />
|
||||
<ClCompile Include="transip.cpp" />
|
||||
<ClCompile Include="vtrans.cpp" />
|
||||
<ClCompile Include="wxdebug.cpp" />
|
||||
<ClCompile Include="wxlist.cpp" />
|
||||
<ClCompile Include="wxutil.cpp" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets" />
|
||||
</Project>
|
||||
+174
@@ -0,0 +1,174 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="Source Files">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Header Files">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Resource Files">
|
||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="amextra.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="amfilter.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="cache.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="combase.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="ctlutil.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="ddmm.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="fourcc.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="msgthrd.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="reftime.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="refclock.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="pullpin.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="pstream.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="outputq.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="mtype.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="measure.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="renbase.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="schedule.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="seekpt.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="streams.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="source.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="strmctl.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="sysclock.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="transfrm.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="transip.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="vtrans.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="wxdebug.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="wxlist.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="wxutil.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="amextra.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="amfilter.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="amvideo.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="combase.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="ctlutil.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="ddmm.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="mtype.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="outputq.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="pstream.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="pullpin.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="refclock.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="renbase.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="schedule.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="seekpt.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="source.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="strmctl.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="sysclock.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="transfrm.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="transip.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="vtrans.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="wxdebug.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="wxlist.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="wxutil.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -3,7 +3,7 @@
|
||||
//
|
||||
// Desc: DirectShow base classes - efines a non-MFC generic cache class.
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -54,11 +54,11 @@ private:
|
||||
|
||||
public:
|
||||
|
||||
CCache(TCHAR *pName,INT iItems);
|
||||
CCache(__in_opt LPCTSTR pName,INT iItems);
|
||||
virtual ~CCache();
|
||||
|
||||
/* Add an item to the cache */
|
||||
CBaseObject *AddToCache(CBaseObject *pObject);
|
||||
CBaseObject *AddToCache(__in CBaseObject *pObject);
|
||||
|
||||
/* Remove an item from the cache */
|
||||
CBaseObject *RemoveFromCache();
|
||||
@@ -4,11 +4,11 @@
|
||||
// Desc: DirectShow base classes - implements class hierarchy for creating
|
||||
// COM objects.
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
#include "streams.h"
|
||||
#include <streams.h>
|
||||
#pragma warning( disable : 4514 ) // Disable warnings re unused inline functions
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ LONG CBaseObject::m_cObjects = 0;
|
||||
|
||||
/* Constructor */
|
||||
|
||||
CBaseObject::CBaseObject(const TCHAR *pName)
|
||||
CBaseObject::CBaseObject(__in_opt LPCTSTR pName)
|
||||
{
|
||||
/* Increment the number of active objects */
|
||||
InterlockedIncrement(&m_cObjects);
|
||||
@@ -85,7 +85,7 @@ HINSTANCE LoadOLEAut32()
|
||||
|
||||
// We know we use "this" in the initialization list, we also know we don't modify *phr.
|
||||
#pragma warning( disable : 4355 4100 )
|
||||
CUnknown::CUnknown(const TCHAR *pName, LPUNKNOWN pUnk)
|
||||
CUnknown::CUnknown(__in_opt LPCTSTR pName, __in_opt LPUNKNOWN pUnk)
|
||||
: CBaseObject(pName)
|
||||
/* Start the object with a reference count of zero - when the */
|
||||
/* object is queried for it's first interface this may be */
|
||||
@@ -107,7 +107,7 @@ CUnknown::CUnknown(const TCHAR *pName, LPUNKNOWN pUnk)
|
||||
|
||||
// This does the same as above except it has a useless HRESULT argument
|
||||
// use the previous constructor, this is just left for compatibility...
|
||||
CUnknown::CUnknown(TCHAR *pName, LPUNKNOWN pUnk,HRESULT *phr) :
|
||||
CUnknown::CUnknown(__in_opt LPCTSTR pName, __in_opt LPUNKNOWN pUnk, __inout_opt HRESULT *phr) :
|
||||
CBaseObject(pName),
|
||||
m_cRef(0),
|
||||
m_pUnknown( pUnk != 0 ? pUnk : reinterpret_cast<LPUNKNOWN>( static_cast<PNDUNKNOWN>(this) ) )
|
||||
@@ -115,12 +115,12 @@ CUnknown::CUnknown(TCHAR *pName, LPUNKNOWN pUnk,HRESULT *phr) :
|
||||
}
|
||||
|
||||
#ifdef UNICODE
|
||||
CUnknown::CUnknown(const CHAR *pName, LPUNKNOWN pUnk)
|
||||
CUnknown::CUnknown(__in_opt LPCSTR pName, __in_opt LPUNKNOWN pUnk)
|
||||
: CBaseObject(pName), m_cRef(0),
|
||||
m_pUnknown( pUnk != 0 ? pUnk : reinterpret_cast<LPUNKNOWN>( static_cast<PNDUNKNOWN>(this) ) )
|
||||
{ }
|
||||
|
||||
CUnknown::CUnknown(CHAR *pName, LPUNKNOWN pUnk,HRESULT *phr) :
|
||||
CUnknown::CUnknown(__in_opt LPCSTR pName, __in_opt LPUNKNOWN pUnk, __inout_opt HRESULT *phr) :
|
||||
CBaseObject(pName), m_cRef(0),
|
||||
m_pUnknown( pUnk != 0 ? pUnk : reinterpret_cast<LPUNKNOWN>( static_cast<PNDUNKNOWN>(this) ) )
|
||||
{ }
|
||||
@@ -132,7 +132,7 @@ CUnknown::CUnknown(CHAR *pName, LPUNKNOWN pUnk,HRESULT *phr) :
|
||||
|
||||
/* QueryInterface */
|
||||
|
||||
STDMETHODIMP CUnknown::NonDelegatingQueryInterface(REFIID riid, void ** ppv)
|
||||
STDMETHODIMP CUnknown::NonDelegatingQueryInterface(REFIID riid, __deref_out void ** ppv)
|
||||
{
|
||||
CheckPointer(ppv,E_POINTER);
|
||||
ValidateReadWritePtr(ppv,sizeof(PVOID));
|
||||
@@ -200,7 +200,9 @@ STDMETHODIMP_(ULONG) CUnknown::NonDelegatingRelease()
|
||||
delete this;
|
||||
return ULONG(0);
|
||||
} else {
|
||||
return ourmax(ULONG(m_cRef), 1ul);
|
||||
// Don't touch m_cRef again even in this leg as the object
|
||||
// may have just been released on another thread too
|
||||
return ourmax(ULONG(lRef), 1ul);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -208,7 +210,7 @@ STDMETHODIMP_(ULONG) CUnknown::NonDelegatingRelease()
|
||||
/* Return an interface pointer to a requesting client
|
||||
performing a thread safe AddRef as necessary */
|
||||
|
||||
STDAPI GetInterface(LPUNKNOWN pUnk, void **ppv)
|
||||
STDAPI GetInterface(LPUNKNOWN pUnk, __out void **ppv)
|
||||
{
|
||||
CheckPointer(ppv, E_POINTER);
|
||||
*ppv = pUnk;
|
||||
@@ -240,16 +242,23 @@ BOOL WINAPI IsEqualObject(IUnknown *pFirst, IUnknown *pSecond)
|
||||
/* See if the IUnknown pointers match */
|
||||
|
||||
hr = pFirst->QueryInterface(IID_IUnknown,(void **) &pUnknown1);
|
||||
ASSERT(SUCCEEDED(hr));
|
||||
if (FAILED(hr)) {
|
||||
return FALSE;
|
||||
}
|
||||
ASSERT(pUnknown1);
|
||||
|
||||
hr = pSecond->QueryInterface(IID_IUnknown,(void **) &pUnknown2);
|
||||
ASSERT(SUCCEEDED(hr));
|
||||
ASSERT(pUnknown2);
|
||||
|
||||
/* Release the extra interfaces we hold */
|
||||
/* Release the extra interface we hold */
|
||||
|
||||
pUnknown1->Release();
|
||||
|
||||
hr = pSecond->QueryInterface(IID_IUnknown,(void **) &pUnknown2);
|
||||
if (FAILED(hr)) {
|
||||
return FALSE;
|
||||
}
|
||||
ASSERT(pUnknown2);
|
||||
|
||||
/* Release the extra interface we hold */
|
||||
|
||||
pUnknown2->Release();
|
||||
return (pUnknown1 == pUnknown2);
|
||||
}
|
||||
@@ -4,7 +4,7 @@
|
||||
// Desc: DirectShow base classes - defines a class hierarchy for creating
|
||||
// COM objects.
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -179,9 +179,9 @@ public:
|
||||
|
||||
/* These increment and decrement the number of active objects */
|
||||
|
||||
CBaseObject(const TCHAR *pName);
|
||||
CBaseObject(__in_opt LPCTSTR pName);
|
||||
#ifdef UNICODE
|
||||
CBaseObject(const char *pName);
|
||||
CBaseObject(__in_opt LPCSTR pName);
|
||||
#endif
|
||||
~CBaseObject();
|
||||
|
||||
@@ -208,15 +208,15 @@ protected: /* So we can override NonDelegatingRelease() */
|
||||
|
||||
public:
|
||||
|
||||
CUnknown(const TCHAR *pName, LPUNKNOWN pUnk);
|
||||
CUnknown(__in_opt LPCTSTR pName, __in_opt LPUNKNOWN pUnk);
|
||||
virtual ~CUnknown() {};
|
||||
|
||||
// This is redundant, just use the other constructor
|
||||
// as we never touch the HRESULT in this anyway
|
||||
CUnknown(TCHAR *pName, LPUNKNOWN pUnk,HRESULT *phr);
|
||||
CUnknown(__in_opt LPCTSTR Name, __in_opt LPUNKNOWN pUnk, __inout_opt HRESULT *phr);
|
||||
#ifdef UNICODE
|
||||
CUnknown(const char *pName, LPUNKNOWN pUnk);
|
||||
CUnknown(char *pName, LPUNKNOWN pUnk,HRESULT *phr);
|
||||
CUnknown(__in_opt LPCSTR pName, __in_opt LPUNKNOWN pUnk);
|
||||
CUnknown(__in_opt LPCSTR pName, __in_opt LPUNKNOWN pUnk,__inout_opt HRESULT *phr);
|
||||
#endif
|
||||
|
||||
/* Return the owner of this object */
|
||||
@@ -232,33 +232,19 @@ public:
|
||||
|
||||
/* Non delegating unknown implementation */
|
||||
|
||||
STDMETHODIMP NonDelegatingQueryInterface(REFIID, void **);
|
||||
STDMETHODIMP NonDelegatingQueryInterface(REFIID, __deref_out void **);
|
||||
STDMETHODIMP_(ULONG) NonDelegatingAddRef();
|
||||
STDMETHODIMP_(ULONG) NonDelegatingRelease();
|
||||
};
|
||||
|
||||
#if (_MSC_VER <= 1200)
|
||||
#pragma warning(disable:4211)
|
||||
|
||||
/* The standard InterlockedXXX functions won't take volatiles */
|
||||
static inline LONG WINAPI InterlockedIncrement( volatile LONG * plong )
|
||||
{ return InterlockedIncrement( const_cast<LONG*>( plong ) ); }
|
||||
|
||||
static inline LONG WINAPI InterlockedDecrement( volatile LONG * plong )
|
||||
{ return InterlockedDecrement( const_cast<LONG*>( plong ) ); }
|
||||
|
||||
#pragma warning(default:4211)
|
||||
#endif
|
||||
|
||||
|
||||
/* Return an interface pointer to a requesting client
|
||||
performing a thread safe AddRef as necessary */
|
||||
|
||||
STDAPI GetInterface(LPUNKNOWN pUnk, void **ppv);
|
||||
STDAPI GetInterface(LPUNKNOWN pUnk, __out void **ppv);
|
||||
|
||||
/* A function that can create a new COM object */
|
||||
|
||||
typedef CUnknown *(CALLBACK *LPFNNewCOMObject)(LPUNKNOWN pUnkOuter, HRESULT *phr);
|
||||
typedef CUnknown *(CALLBACK *LPFNNewCOMObject)(__in_opt LPUNKNOWN pUnkOuter, __inout_opt HRESULT *phr);
|
||||
|
||||
/* A function (can be NULL) which is called from the DLL entrypoint
|
||||
routine for each factory template:
|
||||
@@ -285,7 +271,7 @@ public:
|
||||
return (IsEqualCLSID(*m_ClsID,rclsid));
|
||||
};
|
||||
|
||||
CUnknown *CreateInstance(LPUNKNOWN pUnk, HRESULT *phr) const {
|
||||
CUnknown *CreateInstance(__inout_opt LPUNKNOWN pUnk, __inout_opt HRESULT *phr) const {
|
||||
CheckPointer(phr,NULL);
|
||||
return m_lpfnNew(pUnk, phr);
|
||||
};
|
||||
@@ -297,7 +283,7 @@ public:
|
||||
class supports (the default implementation only supports IUnknown) */
|
||||
|
||||
#define DECLARE_IUNKNOWN \
|
||||
STDMETHODIMP QueryInterface(REFIID riid, void **ppv) { \
|
||||
STDMETHODIMP QueryInterface(REFIID riid, __deref_out void **ppv) { \
|
||||
return GetOwner()->QueryInterface(riid,ppv); \
|
||||
}; \
|
||||
STDMETHODIMP_(ULONG) AddRef() { \
|
||||
+203
-193
File diff suppressed because it is too large
Load Diff
Vendored
+923
@@ -0,0 +1,923 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// File: CtlUtil.h
|
||||
//
|
||||
// Desc: DirectShow base classes.
|
||||
//
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
// Base classes implementing IDispatch parsing for the basic control dual
|
||||
// interfaces. Derive from these and implement just the custom method and
|
||||
// property methods. We also implement CPosPassThru that can be used by
|
||||
// renderers and transforms to pass by IMediaPosition and IMediaSeeking
|
||||
|
||||
#ifndef __CTLUTIL__
|
||||
#define __CTLUTIL__
|
||||
|
||||
// OLE Automation has different ideas of TRUE and FALSE
|
||||
|
||||
#define OATRUE (-1)
|
||||
#define OAFALSE (0)
|
||||
|
||||
|
||||
// It's possible that we could replace this class with CreateStdDispatch
|
||||
|
||||
class CBaseDispatch
|
||||
{
|
||||
ITypeInfo * m_pti;
|
||||
|
||||
public:
|
||||
|
||||
CBaseDispatch() : m_pti(NULL) {}
|
||||
~CBaseDispatch();
|
||||
|
||||
/* IDispatch methods */
|
||||
STDMETHODIMP GetTypeInfoCount(__out UINT * pctinfo);
|
||||
|
||||
STDMETHODIMP GetTypeInfo(
|
||||
REFIID riid,
|
||||
UINT itinfo,
|
||||
LCID lcid,
|
||||
__deref_out ITypeInfo ** pptinfo);
|
||||
|
||||
STDMETHODIMP GetIDsOfNames(
|
||||
REFIID riid,
|
||||
__in_ecount(cNames) LPOLESTR * rgszNames,
|
||||
UINT cNames,
|
||||
LCID lcid,
|
||||
__out_ecount(cNames) DISPID * rgdispid);
|
||||
};
|
||||
|
||||
|
||||
class AM_NOVTABLE CMediaControl :
|
||||
public IMediaControl,
|
||||
public CUnknown
|
||||
{
|
||||
CBaseDispatch m_basedisp;
|
||||
|
||||
public:
|
||||
|
||||
CMediaControl(const TCHAR *, LPUNKNOWN);
|
||||
|
||||
DECLARE_IUNKNOWN
|
||||
|
||||
// override this to publicise our interfaces
|
||||
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv);
|
||||
|
||||
/* IDispatch methods */
|
||||
STDMETHODIMP GetTypeInfoCount(__out UINT * pctinfo);
|
||||
|
||||
STDMETHODIMP GetTypeInfo(
|
||||
UINT itinfo,
|
||||
LCID lcid,
|
||||
__deref_out ITypeInfo ** pptinfo);
|
||||
|
||||
STDMETHODIMP GetIDsOfNames(
|
||||
REFIID riid,
|
||||
__in_ecount(cNames) LPOLESTR * rgszNames,
|
||||
UINT cNames,
|
||||
LCID lcid,
|
||||
__out_ecount(cNames) DISPID * rgdispid);
|
||||
|
||||
STDMETHODIMP Invoke(
|
||||
DISPID dispidMember,
|
||||
REFIID riid,
|
||||
LCID lcid,
|
||||
WORD wFlags,
|
||||
__in DISPPARAMS * pdispparams,
|
||||
__out_opt VARIANT * pvarResult,
|
||||
__out_opt EXCEPINFO * pexcepinfo,
|
||||
__out_opt UINT * puArgErr);
|
||||
};
|
||||
|
||||
|
||||
class AM_NOVTABLE CMediaEvent :
|
||||
public IMediaEventEx,
|
||||
public CUnknown
|
||||
{
|
||||
CBaseDispatch m_basedisp;
|
||||
|
||||
public:
|
||||
|
||||
CMediaEvent(__in_opt LPCTSTR, __in_opt LPUNKNOWN);
|
||||
|
||||
DECLARE_IUNKNOWN
|
||||
|
||||
// override this to publicise our interfaces
|
||||
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv);
|
||||
|
||||
/* IDispatch methods */
|
||||
STDMETHODIMP GetTypeInfoCount(__out UINT * pctinfo);
|
||||
|
||||
STDMETHODIMP GetTypeInfo(
|
||||
UINT itinfo,
|
||||
LCID lcid,
|
||||
__deref_out ITypeInfo ** pptinfo);
|
||||
|
||||
STDMETHODIMP GetIDsOfNames(
|
||||
REFIID riid,
|
||||
__in_ecount(cNames) LPOLESTR * rgszNames,
|
||||
UINT cNames,
|
||||
LCID lcid,
|
||||
__out_ecount(cNames) DISPID * rgdispid);
|
||||
|
||||
STDMETHODIMP Invoke(
|
||||
DISPID dispidMember,
|
||||
REFIID riid,
|
||||
LCID lcid,
|
||||
WORD wFlags,
|
||||
__in DISPPARAMS * pdispparams,
|
||||
__out_opt VARIANT * pvarResult,
|
||||
__out_opt EXCEPINFO * pexcepinfo,
|
||||
__out_opt UINT * puArgErr);
|
||||
};
|
||||
|
||||
|
||||
class AM_NOVTABLE CMediaPosition :
|
||||
public IMediaPosition,
|
||||
public CUnknown
|
||||
{
|
||||
CBaseDispatch m_basedisp;
|
||||
|
||||
|
||||
public:
|
||||
|
||||
CMediaPosition(__in_opt LPCTSTR, __in_opt LPUNKNOWN);
|
||||
CMediaPosition(__in_opt LPCTSTR, __in_opt LPUNKNOWN, __inout HRESULT *phr);
|
||||
|
||||
DECLARE_IUNKNOWN
|
||||
|
||||
// override this to publicise our interfaces
|
||||
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv);
|
||||
|
||||
/* IDispatch methods */
|
||||
STDMETHODIMP GetTypeInfoCount(__out UINT * pctinfo);
|
||||
|
||||
STDMETHODIMP GetTypeInfo(
|
||||
UINT itinfo,
|
||||
LCID lcid,
|
||||
__deref_out ITypeInfo ** pptinfo);
|
||||
|
||||
STDMETHODIMP GetIDsOfNames(
|
||||
REFIID riid,
|
||||
__in_ecount(cNames) LPOLESTR * rgszNames,
|
||||
UINT cNames,
|
||||
LCID lcid,
|
||||
__out_ecount(cNames) DISPID * rgdispid);
|
||||
|
||||
STDMETHODIMP Invoke(
|
||||
DISPID dispidMember,
|
||||
REFIID riid,
|
||||
LCID lcid,
|
||||
WORD wFlags,
|
||||
__in DISPPARAMS * pdispparams,
|
||||
__out_opt VARIANT * pvarResult,
|
||||
__out_opt EXCEPINFO * pexcepinfo,
|
||||
__out_opt UINT * puArgErr);
|
||||
|
||||
};
|
||||
|
||||
|
||||
// OA-compatibility means that we must use double as the RefTime value,
|
||||
// and REFERENCE_TIME (essentially a LONGLONG) within filters.
|
||||
// this class converts between the two
|
||||
|
||||
class COARefTime : public CRefTime {
|
||||
public:
|
||||
|
||||
COARefTime() {
|
||||
};
|
||||
|
||||
COARefTime(CRefTime t)
|
||||
: CRefTime(t)
|
||||
{
|
||||
};
|
||||
|
||||
COARefTime(REFERENCE_TIME t)
|
||||
: CRefTime(t)
|
||||
{
|
||||
};
|
||||
|
||||
COARefTime(double d) {
|
||||
m_time = (LONGLONG) (d * 10000000);
|
||||
};
|
||||
|
||||
operator double() {
|
||||
return double(m_time) / 10000000;
|
||||
};
|
||||
|
||||
operator REFERENCE_TIME() {
|
||||
return m_time;
|
||||
};
|
||||
|
||||
COARefTime& operator=(const double& rd) {
|
||||
m_time = (LONGLONG) (rd * 10000000);
|
||||
return *this;
|
||||
}
|
||||
|
||||
COARefTime& operator=(const REFERENCE_TIME& rt) {
|
||||
m_time = rt;
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline BOOL operator==(const COARefTime& rt)
|
||||
{
|
||||
return m_time == rt.m_time;
|
||||
};
|
||||
|
||||
inline BOOL operator!=(const COARefTime& rt)
|
||||
{
|
||||
return m_time != rt.m_time;
|
||||
};
|
||||
|
||||
inline BOOL operator < (const COARefTime& rt)
|
||||
{
|
||||
return m_time < rt.m_time;
|
||||
};
|
||||
|
||||
inline BOOL operator > (const COARefTime& rt)
|
||||
{
|
||||
return m_time > rt.m_time;
|
||||
};
|
||||
|
||||
inline BOOL operator >= (const COARefTime& rt)
|
||||
{
|
||||
return m_time >= rt.m_time;
|
||||
};
|
||||
|
||||
inline BOOL operator <= (const COARefTime& rt)
|
||||
{
|
||||
return m_time <= rt.m_time;
|
||||
};
|
||||
|
||||
inline COARefTime operator+(const COARefTime& rt)
|
||||
{
|
||||
return COARefTime(m_time + rt.m_time);
|
||||
};
|
||||
|
||||
inline COARefTime operator-(const COARefTime& rt)
|
||||
{
|
||||
return COARefTime(m_time - rt.m_time);
|
||||
};
|
||||
|
||||
inline COARefTime operator*(LONG l)
|
||||
{
|
||||
return COARefTime(m_time * l);
|
||||
};
|
||||
|
||||
inline COARefTime operator/(LONG l)
|
||||
{
|
||||
return COARefTime(m_time / l);
|
||||
};
|
||||
|
||||
private:
|
||||
// Prevent bugs from constructing from LONG (which gets
|
||||
// converted to double and then multiplied by 10000000
|
||||
COARefTime(LONG);
|
||||
LONG operator=(LONG);
|
||||
};
|
||||
|
||||
|
||||
// A utility class that handles IMediaPosition and IMediaSeeking on behalf
|
||||
// of single-input pin renderers, or transform filters.
|
||||
//
|
||||
// Renderers will expose this from the filter; transform filters will
|
||||
// expose it from the output pin and not the renderer.
|
||||
//
|
||||
// Create one of these, giving it your IPin* for your input pin, and delegate
|
||||
// all IMediaPosition methods to it. It will query the input pin for
|
||||
// IMediaPosition and respond appropriately.
|
||||
//
|
||||
// Call ForceRefresh if the pin connection changes.
|
||||
//
|
||||
// This class no longer caches the upstream IMediaPosition or IMediaSeeking
|
||||
// it acquires it on each method call. This means ForceRefresh is not needed.
|
||||
// The method is kept for source compatibility and to minimise the changes
|
||||
// if we need to put it back later for performance reasons.
|
||||
|
||||
class CPosPassThru : public IMediaSeeking, public CMediaPosition
|
||||
{
|
||||
IPin *m_pPin;
|
||||
|
||||
HRESULT GetPeer(__deref_out IMediaPosition **ppMP);
|
||||
HRESULT GetPeerSeeking(__deref_out IMediaSeeking **ppMS);
|
||||
|
||||
public:
|
||||
|
||||
CPosPassThru(__in_opt LPCTSTR, __in_opt LPUNKNOWN, __inout HRESULT*, IPin *);
|
||||
DECLARE_IUNKNOWN
|
||||
|
||||
HRESULT ForceRefresh() {
|
||||
return S_OK;
|
||||
};
|
||||
|
||||
// override to return an accurate current position
|
||||
virtual HRESULT GetMediaTime(__out LONGLONG *pStartTime, __out_opt LONGLONG *pEndTime) {
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid,__deref_out void **ppv);
|
||||
|
||||
// IMediaSeeking methods
|
||||
STDMETHODIMP GetCapabilities( __out DWORD * pCapabilities );
|
||||
STDMETHODIMP CheckCapabilities( __inout DWORD * pCapabilities );
|
||||
STDMETHODIMP SetTimeFormat(const GUID * pFormat);
|
||||
STDMETHODIMP GetTimeFormat(__out GUID *pFormat);
|
||||
STDMETHODIMP IsUsingTimeFormat(const GUID * pFormat);
|
||||
STDMETHODIMP IsFormatSupported( const GUID * pFormat);
|
||||
STDMETHODIMP QueryPreferredFormat( __out GUID *pFormat);
|
||||
STDMETHODIMP ConvertTimeFormat(__out LONGLONG * pTarget,
|
||||
__in_opt const GUID * pTargetFormat,
|
||||
LONGLONG Source,
|
||||
__in_opt const GUID * pSourceFormat );
|
||||
STDMETHODIMP SetPositions( __inout_opt LONGLONG * pCurrent, DWORD CurrentFlags
|
||||
, __inout_opt LONGLONG * pStop, DWORD StopFlags );
|
||||
|
||||
STDMETHODIMP GetPositions( __out_opt LONGLONG * pCurrent, __out_opt LONGLONG * pStop );
|
||||
STDMETHODIMP GetCurrentPosition( __out LONGLONG * pCurrent );
|
||||
STDMETHODIMP GetStopPosition( __out LONGLONG * pStop );
|
||||
STDMETHODIMP SetRate( double dRate);
|
||||
STDMETHODIMP GetRate( __out double * pdRate);
|
||||
STDMETHODIMP GetDuration( __out LONGLONG *pDuration);
|
||||
STDMETHODIMP GetAvailable( __out_opt LONGLONG *pEarliest, __out_opt LONGLONG *pLatest );
|
||||
STDMETHODIMP GetPreroll( __out LONGLONG *pllPreroll );
|
||||
|
||||
// IMediaPosition properties
|
||||
STDMETHODIMP get_Duration(__out REFTIME * plength);
|
||||
STDMETHODIMP put_CurrentPosition(REFTIME llTime);
|
||||
STDMETHODIMP get_StopTime(__out REFTIME * pllTime);
|
||||
STDMETHODIMP put_StopTime(REFTIME llTime);
|
||||
STDMETHODIMP get_PrerollTime(__out REFTIME * pllTime);
|
||||
STDMETHODIMP put_PrerollTime(REFTIME llTime);
|
||||
STDMETHODIMP get_Rate(__out double * pdRate);
|
||||
STDMETHODIMP put_Rate(double dRate);
|
||||
STDMETHODIMP get_CurrentPosition(__out REFTIME * pllTime);
|
||||
STDMETHODIMP CanSeekForward(__out LONG *pCanSeekForward);
|
||||
STDMETHODIMP CanSeekBackward(__out LONG *pCanSeekBackward);
|
||||
|
||||
private:
|
||||
HRESULT GetSeekingLongLong( HRESULT (__stdcall IMediaSeeking::*pMethod)( LONGLONG * ),
|
||||
__out LONGLONG * pll );
|
||||
};
|
||||
|
||||
|
||||
// Adds the ability to return a current position
|
||||
|
||||
class CRendererPosPassThru : public CPosPassThru
|
||||
{
|
||||
CCritSec m_PositionLock; // Locks access to our position
|
||||
LONGLONG m_StartMedia; // Start media time last seen
|
||||
LONGLONG m_EndMedia; // And likewise the end media
|
||||
BOOL m_bReset; // Have media times been set
|
||||
|
||||
public:
|
||||
|
||||
// Used to help with passing media times through graph
|
||||
|
||||
CRendererPosPassThru(__in_opt LPCTSTR, __in_opt LPUNKNOWN, __inout HRESULT*, IPin *);
|
||||
HRESULT RegisterMediaTime(IMediaSample *pMediaSample);
|
||||
HRESULT RegisterMediaTime(LONGLONG StartTime,LONGLONG EndTime);
|
||||
HRESULT GetMediaTime(__out LONGLONG *pStartTime,__out_opt LONGLONG *pEndTime);
|
||||
HRESULT ResetMediaTime();
|
||||
HRESULT EOS();
|
||||
};
|
||||
|
||||
STDAPI CreatePosPassThru(
|
||||
__in_opt LPUNKNOWN pAgg,
|
||||
BOOL bRenderer,
|
||||
IPin *pPin,
|
||||
__deref_out IUnknown **ppPassThru
|
||||
);
|
||||
|
||||
// A class that handles the IDispatch part of IBasicAudio and leaves the
|
||||
// properties and methods themselves pure virtual.
|
||||
|
||||
class AM_NOVTABLE CBasicAudio : public IBasicAudio, public CUnknown
|
||||
{
|
||||
CBaseDispatch m_basedisp;
|
||||
|
||||
public:
|
||||
|
||||
CBasicAudio(__in_opt LPCTSTR, __in_opt LPUNKNOWN);
|
||||
|
||||
DECLARE_IUNKNOWN
|
||||
|
||||
// override this to publicise our interfaces
|
||||
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv);
|
||||
|
||||
/* IDispatch methods */
|
||||
STDMETHODIMP GetTypeInfoCount(__out UINT * pctinfo);
|
||||
|
||||
STDMETHODIMP GetTypeInfo(
|
||||
UINT itinfo,
|
||||
LCID lcid,
|
||||
__deref_out ITypeInfo ** pptinfo);
|
||||
|
||||
STDMETHODIMP GetIDsOfNames(
|
||||
REFIID riid,
|
||||
__in_ecount(cNames) LPOLESTR * rgszNames,
|
||||
UINT cNames,
|
||||
LCID lcid,
|
||||
__out_ecount(cNames) DISPID * rgdispid);
|
||||
|
||||
STDMETHODIMP Invoke(
|
||||
DISPID dispidMember,
|
||||
REFIID riid,
|
||||
LCID lcid,
|
||||
WORD wFlags,
|
||||
__in DISPPARAMS * pdispparams,
|
||||
__out_opt VARIANT * pvarResult,
|
||||
__out_opt EXCEPINFO * pexcepinfo,
|
||||
__out_opt UINT * puArgErr);
|
||||
};
|
||||
|
||||
|
||||
// A class that handles the IDispatch part of IBasicVideo and leaves the
|
||||
// properties and methods themselves pure virtual.
|
||||
|
||||
class AM_NOVTABLE CBaseBasicVideo : public IBasicVideo2, public CUnknown
|
||||
{
|
||||
CBaseDispatch m_basedisp;
|
||||
|
||||
public:
|
||||
|
||||
CBaseBasicVideo(__in_opt LPCTSTR, __in_opt LPUNKNOWN);
|
||||
|
||||
DECLARE_IUNKNOWN
|
||||
|
||||
// override this to publicise our interfaces
|
||||
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv);
|
||||
|
||||
/* IDispatch methods */
|
||||
STDMETHODIMP GetTypeInfoCount(__out UINT * pctinfo);
|
||||
|
||||
STDMETHODIMP GetTypeInfo(
|
||||
UINT itinfo,
|
||||
LCID lcid,
|
||||
__deref_out ITypeInfo ** pptinfo);
|
||||
|
||||
STDMETHODIMP GetIDsOfNames(
|
||||
REFIID riid,
|
||||
__in_ecount(cNames) LPOLESTR * rgszNames,
|
||||
UINT cNames,
|
||||
LCID lcid,
|
||||
__out_ecount(cNames) DISPID * rgdispid);
|
||||
|
||||
STDMETHODIMP Invoke(
|
||||
DISPID dispidMember,
|
||||
REFIID riid,
|
||||
LCID lcid,
|
||||
WORD wFlags,
|
||||
__in DISPPARAMS * pdispparams,
|
||||
__out_opt VARIANT * pvarResult,
|
||||
__out_opt EXCEPINFO * pexcepinfo,
|
||||
__out_opt UINT * puArgErr);
|
||||
|
||||
STDMETHODIMP GetPreferredAspectRatio(
|
||||
__out long *plAspectX,
|
||||
__out long *plAspectY)
|
||||
{
|
||||
return E_NOTIMPL;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
// A class that handles the IDispatch part of IVideoWindow and leaves the
|
||||
// properties and methods themselves pure virtual.
|
||||
|
||||
class AM_NOVTABLE CBaseVideoWindow : public IVideoWindow, public CUnknown
|
||||
{
|
||||
CBaseDispatch m_basedisp;
|
||||
|
||||
public:
|
||||
|
||||
CBaseVideoWindow(__in_opt LPCTSTR, __in_opt LPUNKNOWN);
|
||||
|
||||
DECLARE_IUNKNOWN
|
||||
|
||||
// override this to publicise our interfaces
|
||||
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv);
|
||||
|
||||
/* IDispatch methods */
|
||||
STDMETHODIMP GetTypeInfoCount(__out UINT * pctinfo);
|
||||
|
||||
STDMETHODIMP GetTypeInfo(
|
||||
UINT itinfo,
|
||||
LCID lcid,
|
||||
__deref_out ITypeInfo ** pptinfo);
|
||||
|
||||
STDMETHODIMP GetIDsOfNames(
|
||||
REFIID riid,
|
||||
__in_ecount(cNames) LPOLESTR * rgszNames,
|
||||
UINT cNames,
|
||||
LCID lcid,
|
||||
__out_ecount(cNames) DISPID * rgdispid);
|
||||
|
||||
STDMETHODIMP Invoke(
|
||||
DISPID dispidMember,
|
||||
REFIID riid,
|
||||
LCID lcid,
|
||||
WORD wFlags,
|
||||
__in DISPPARAMS * pdispparams,
|
||||
__out_opt VARIANT * pvarResult,
|
||||
__out_opt EXCEPINFO * pexcepinfo,
|
||||
__out_opt UINT * puArgErr);
|
||||
};
|
||||
|
||||
|
||||
// abstract class to help source filters with their implementation
|
||||
// of IMediaPosition. Derive from this and set the duration (and stop
|
||||
// position). Also override NotifyChange to do something when the properties
|
||||
// change.
|
||||
|
||||
class AM_NOVTABLE CSourcePosition : public CMediaPosition
|
||||
{
|
||||
|
||||
public:
|
||||
CSourcePosition(__in_opt LPCTSTR, __in_opt LPUNKNOWN, __inout HRESULT*, __in CCritSec *);
|
||||
|
||||
// IMediaPosition methods
|
||||
STDMETHODIMP get_Duration(__out REFTIME * plength);
|
||||
STDMETHODIMP put_CurrentPosition(REFTIME llTime);
|
||||
STDMETHODIMP get_StopTime(__out REFTIME * pllTime);
|
||||
STDMETHODIMP put_StopTime(REFTIME llTime);
|
||||
STDMETHODIMP get_PrerollTime(__out REFTIME * pllTime);
|
||||
STDMETHODIMP put_PrerollTime(REFTIME llTime);
|
||||
STDMETHODIMP get_Rate(__out double * pdRate);
|
||||
STDMETHODIMP put_Rate(double dRate);
|
||||
STDMETHODIMP CanSeekForward(__out LONG *pCanSeekForward);
|
||||
STDMETHODIMP CanSeekBackward(__out LONG *pCanSeekBackward);
|
||||
|
||||
// override if you can return the data you are actually working on
|
||||
STDMETHODIMP get_CurrentPosition(__out REFTIME * pllTime) {
|
||||
return E_NOTIMPL;
|
||||
};
|
||||
|
||||
protected:
|
||||
|
||||
// we call this to notify changes. Override to handle them
|
||||
virtual HRESULT ChangeStart() PURE;
|
||||
virtual HRESULT ChangeStop() PURE;
|
||||
virtual HRESULT ChangeRate() PURE;
|
||||
|
||||
COARefTime m_Duration;
|
||||
COARefTime m_Start;
|
||||
COARefTime m_Stop;
|
||||
double m_Rate;
|
||||
|
||||
CCritSec * m_pLock;
|
||||
};
|
||||
|
||||
class AM_NOVTABLE CSourceSeeking :
|
||||
public IMediaSeeking,
|
||||
public CUnknown
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
DECLARE_IUNKNOWN;
|
||||
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv);
|
||||
|
||||
// IMediaSeeking methods
|
||||
|
||||
STDMETHODIMP IsFormatSupported(const GUID * pFormat);
|
||||
STDMETHODIMP QueryPreferredFormat(__out GUID *pFormat);
|
||||
STDMETHODIMP SetTimeFormat(const GUID * pFormat);
|
||||
STDMETHODIMP IsUsingTimeFormat(const GUID * pFormat);
|
||||
STDMETHODIMP GetTimeFormat(__out GUID *pFormat);
|
||||
STDMETHODIMP GetDuration(__out LONGLONG *pDuration);
|
||||
STDMETHODIMP GetStopPosition(__out LONGLONG *pStop);
|
||||
STDMETHODIMP GetCurrentPosition(__out LONGLONG *pCurrent);
|
||||
STDMETHODIMP GetCapabilities( __out DWORD * pCapabilities );
|
||||
STDMETHODIMP CheckCapabilities( __inout DWORD * pCapabilities );
|
||||
STDMETHODIMP ConvertTimeFormat( __out LONGLONG * pTarget,
|
||||
__in_opt const GUID * pTargetFormat,
|
||||
LONGLONG Source,
|
||||
__in_opt const GUID * pSourceFormat );
|
||||
|
||||
STDMETHODIMP SetPositions( __inout_opt LONGLONG * pCurrent, DWORD CurrentFlags
|
||||
, __inout_opt LONGLONG * pStop, DWORD StopFlags );
|
||||
|
||||
STDMETHODIMP GetPositions( __out_opt LONGLONG * pCurrent, __out_opt LONGLONG * pStop );
|
||||
|
||||
STDMETHODIMP GetAvailable( __out_opt LONGLONG * pEarliest, __out_opt LONGLONG * pLatest );
|
||||
STDMETHODIMP SetRate( double dRate);
|
||||
STDMETHODIMP GetRate( __out double * pdRate);
|
||||
STDMETHODIMP GetPreroll(__out LONGLONG *pPreroll);
|
||||
|
||||
|
||||
protected:
|
||||
|
||||
// ctor
|
||||
CSourceSeeking(__in_opt LPCTSTR, __in_opt LPUNKNOWN, __inout HRESULT*, __in CCritSec *);
|
||||
|
||||
// we call this to notify changes. Override to handle them
|
||||
virtual HRESULT ChangeStart() PURE;
|
||||
virtual HRESULT ChangeStop() PURE;
|
||||
virtual HRESULT ChangeRate() PURE;
|
||||
|
||||
CRefTime m_rtDuration; // length of stream
|
||||
CRefTime m_rtStart; // source will start here
|
||||
CRefTime m_rtStop; // source will stop here
|
||||
double m_dRateSeeking;
|
||||
|
||||
// seeking capabilities
|
||||
DWORD m_dwSeekingCaps;
|
||||
|
||||
CCritSec * m_pLock;
|
||||
};
|
||||
|
||||
|
||||
// Base classes supporting Deferred commands.
|
||||
|
||||
// Deferred commands are queued by calls to methods on the IQueueCommand
|
||||
// interface, exposed by the filtergraph and by some filters. A successful
|
||||
// call to one of these methods will return an IDeferredCommand interface
|
||||
// representing the queued command.
|
||||
//
|
||||
// A CDeferredCommand object represents a single deferred command, and exposes
|
||||
// the IDeferredCommand interface as well as other methods permitting time
|
||||
// checks and actual execution. It contains a reference to the CCommandQueue
|
||||
// object on which it is queued.
|
||||
//
|
||||
// CCommandQueue is a base class providing a queue of CDeferredCommand
|
||||
// objects, and methods to add, remove, check status and invoke the queued
|
||||
// commands. A CCommandQueue object would be part of an object that
|
||||
// implemented IQueueCommand.
|
||||
|
||||
class CCmdQueue;
|
||||
|
||||
// take a copy of the params and store them. Release any allocated
|
||||
// memory in destructor
|
||||
|
||||
class CDispParams : public DISPPARAMS
|
||||
{
|
||||
public:
|
||||
CDispParams(UINT nArgs, __in_ecount(nArgs) VARIANT* pArgs, __inout_opt HRESULT *phr = NULL);
|
||||
~CDispParams();
|
||||
};
|
||||
|
||||
|
||||
// CDeferredCommand lifetime is controlled by refcounts. Caller of
|
||||
// InvokeAt.. gets a refcounted interface pointer, and the CCmdQueue
|
||||
// object also holds a refcount on us. Calling Cancel or Invoke takes
|
||||
// us off the CCmdQueue and thus reduces the refcount by 1. Once taken
|
||||
// off the queue we cannot be put back on the queue.
|
||||
|
||||
class CDeferredCommand
|
||||
: public CUnknown,
|
||||
public IDeferredCommand
|
||||
{
|
||||
public:
|
||||
|
||||
CDeferredCommand(
|
||||
__inout CCmdQueue * pQ,
|
||||
__in_opt LPUNKNOWN pUnk, // aggregation outer unk
|
||||
__inout HRESULT * phr,
|
||||
__in LPUNKNOWN pUnkExecutor, // object that will execute this cmd
|
||||
REFTIME time,
|
||||
__in GUID* iid,
|
||||
long dispidMethod,
|
||||
short wFlags,
|
||||
long cArgs,
|
||||
__in_ecount(cArgs) VARIANT* pDispParams,
|
||||
__out VARIANT* pvarResult,
|
||||
__out short* puArgErr,
|
||||
BOOL bStream
|
||||
);
|
||||
|
||||
DECLARE_IUNKNOWN
|
||||
|
||||
// override this to publicise our interfaces
|
||||
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, __out void **ppv);
|
||||
|
||||
// IDeferredCommand methods
|
||||
STDMETHODIMP Cancel();
|
||||
STDMETHODIMP Confidence(
|
||||
__out LONG* pConfidence);
|
||||
STDMETHODIMP Postpone(
|
||||
REFTIME newtime);
|
||||
STDMETHODIMP GetHResult(
|
||||
__out HRESULT* phrResult);
|
||||
|
||||
// other public methods
|
||||
|
||||
HRESULT Invoke();
|
||||
|
||||
// access methods
|
||||
|
||||
// returns TRUE if streamtime, FALSE if presentation time
|
||||
BOOL IsStreamTime() {
|
||||
return m_bStream;
|
||||
};
|
||||
|
||||
CRefTime GetTime() {
|
||||
return m_time;
|
||||
};
|
||||
|
||||
REFIID GetIID() {
|
||||
return *m_iid;
|
||||
};
|
||||
|
||||
long GetMethod() {
|
||||
return m_dispidMethod;
|
||||
};
|
||||
|
||||
short GetFlags() {
|
||||
return m_wFlags;
|
||||
};
|
||||
|
||||
DISPPARAMS* GetParams() {
|
||||
return &m_DispParams;
|
||||
};
|
||||
|
||||
VARIANT* GetResult() {
|
||||
return m_pvarResult;
|
||||
};
|
||||
|
||||
protected:
|
||||
|
||||
CCmdQueue* m_pQueue;
|
||||
|
||||
// pUnk for the interface that we will execute the command on
|
||||
LPUNKNOWN m_pUnk;
|
||||
|
||||
// stored command data
|
||||
REFERENCE_TIME m_time;
|
||||
GUID* m_iid;
|
||||
long m_dispidMethod;
|
||||
short m_wFlags;
|
||||
VARIANT* m_pvarResult;
|
||||
BOOL m_bStream;
|
||||
CDispParams m_DispParams;
|
||||
DISPID m_DispId; // For get and put
|
||||
|
||||
// we use this for ITypeInfo access
|
||||
CBaseDispatch m_Dispatch;
|
||||
|
||||
// save retval here
|
||||
HRESULT m_hrResult;
|
||||
};
|
||||
|
||||
|
||||
// a list of CDeferredCommand objects. this is a base class providing
|
||||
// the basics of access to the list. If you want to use CDeferredCommand
|
||||
// objects then your queue needs to be derived from this class.
|
||||
|
||||
class AM_NOVTABLE CCmdQueue
|
||||
{
|
||||
public:
|
||||
CCmdQueue(__inout_opt HRESULT *phr = NULL);
|
||||
virtual ~CCmdQueue();
|
||||
|
||||
// returns a new CDeferredCommand object that will be initialised with
|
||||
// the parameters and will be added to the queue during construction.
|
||||
// returns S_OK if successfully created otherwise an error and
|
||||
// no object has been queued.
|
||||
virtual HRESULT New(
|
||||
__out CDeferredCommand **ppCmd,
|
||||
__in LPUNKNOWN pUnk,
|
||||
REFTIME time,
|
||||
__in GUID* iid,
|
||||
long dispidMethod,
|
||||
short wFlags,
|
||||
long cArgs,
|
||||
__in_ecount(cArgs) VARIANT* pDispParams,
|
||||
__out VARIANT* pvarResult,
|
||||
__out short* puArgErr,
|
||||
BOOL bStream
|
||||
);
|
||||
|
||||
// called by the CDeferredCommand object to add and remove itself
|
||||
// from the queue
|
||||
virtual HRESULT Insert(__in CDeferredCommand* pCmd);
|
||||
virtual HRESULT Remove(__in CDeferredCommand* pCmd);
|
||||
|
||||
// Command-Due Checking
|
||||
//
|
||||
// There are two schemes of synchronisation: coarse and accurate. In
|
||||
// coarse mode, you wait till the time arrives and then execute the cmd.
|
||||
// In accurate mode, you wait until you are processing the sample that
|
||||
// will appear at the time, and then execute the command. It's up to the
|
||||
// filter which one it will implement. The filtergraph will always
|
||||
// implement coarse mode for commands queued at the filtergraph.
|
||||
//
|
||||
// If you want coarse sync, you probably want to wait until there is a
|
||||
// command due, and then execute it. You can do this by calling
|
||||
// GetDueCommand. If you have several things to wait for, get the
|
||||
// event handle from GetDueHandle() and when this is signalled then call
|
||||
// GetDueCommand. Stream time will only advance between calls to Run and
|
||||
// EndRun. Note that to avoid an extra thread there is no guarantee that
|
||||
// if the handle is set there will be a command ready. Each time the
|
||||
// event is signalled, call GetDueCommand (probably with a 0 timeout);
|
||||
// This may return E_ABORT.
|
||||
//
|
||||
// If you want accurate sync, you must call GetCommandDueFor, passing
|
||||
// as a parameter the stream time of the samples you are about to process.
|
||||
// This will return:
|
||||
// -- a stream-time command due at or before that stream time
|
||||
// -- a presentation-time command due at or before the
|
||||
// time that stream time will be presented (only between Run
|
||||
// and EndRun calls, since outside of this, the mapping from
|
||||
// stream time to presentation time is not known.
|
||||
// -- any presentation-time command due now.
|
||||
// This means that if you want accurate synchronisation on samples that
|
||||
// might be processed during Paused mode, you need to use
|
||||
// stream-time commands.
|
||||
//
|
||||
// In all cases, commands remain queued until Invoked or Cancelled. The
|
||||
// setting and resetting of the event handle is managed entirely by this
|
||||
// queue object.
|
||||
|
||||
// set the clock used for timing
|
||||
virtual HRESULT SetSyncSource(__in_opt IReferenceClock*);
|
||||
|
||||
// switch to run mode. Streamtime to Presentation time mapping known.
|
||||
virtual HRESULT Run(REFERENCE_TIME tStreamTimeOffset);
|
||||
|
||||
// switch to Stopped or Paused mode. Time mapping not known.
|
||||
virtual HRESULT EndRun();
|
||||
|
||||
// return a pointer to the next due command. Blocks for msTimeout
|
||||
// milliseconds until there is a due command.
|
||||
// Stream-time commands will only become due between Run and Endrun calls.
|
||||
// The command remains queued until invoked or cancelled.
|
||||
// Returns E_ABORT if timeout occurs, otherwise S_OK (or other error).
|
||||
// Returns an AddRef-ed object
|
||||
virtual HRESULT GetDueCommand(__out CDeferredCommand ** ppCmd, long msTimeout);
|
||||
|
||||
// return the event handle that will be signalled whenever
|
||||
// there are deferred commands due for execution (when GetDueCommand
|
||||
// will not block).
|
||||
HANDLE GetDueHandle() {
|
||||
return HANDLE(m_evDue);
|
||||
};
|
||||
|
||||
// return a pointer to a command that will be due for a given time.
|
||||
// Pass in a stream time here. The stream time offset will be passed
|
||||
// in via the Run method.
|
||||
// Commands remain queued until invoked or cancelled.
|
||||
// This method will not block. It will report VFW_E_NOT_FOUND if there
|
||||
// are no commands due yet.
|
||||
// Returns an AddRef-ed object
|
||||
virtual HRESULT GetCommandDueFor(REFERENCE_TIME tStream, __out CDeferredCommand**ppCmd);
|
||||
|
||||
// check if a given time is due (TRUE if it is due yet)
|
||||
BOOL CheckTime(CRefTime time, BOOL bStream) {
|
||||
|
||||
// if no clock, nothing is due!
|
||||
if (!m_pClock) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// stream time
|
||||
if (bStream) {
|
||||
|
||||
// not valid if not running
|
||||
if (!m_bRunning) {
|
||||
return FALSE;
|
||||
}
|
||||
// add on known stream time offset to get presentation time
|
||||
time += m_StreamTimeOffset;
|
||||
}
|
||||
|
||||
CRefTime Now;
|
||||
m_pClock->GetTime((REFERENCE_TIME*)&Now);
|
||||
return (time <= Now);
|
||||
};
|
||||
|
||||
protected:
|
||||
|
||||
// protect access to lists etc
|
||||
CCritSec m_Lock;
|
||||
|
||||
// commands queued in presentation time are stored here
|
||||
CGenericList<CDeferredCommand> m_listPresentation;
|
||||
|
||||
// commands queued in stream time are stored here
|
||||
CGenericList<CDeferredCommand> m_listStream;
|
||||
|
||||
// set when any commands are due
|
||||
CAMEvent m_evDue;
|
||||
|
||||
// creates an advise for the earliest time required, if any
|
||||
void SetTimeAdvise(void);
|
||||
|
||||
// advise id from reference clock (0 if no outstanding advise)
|
||||
DWORD_PTR m_dwAdvise;
|
||||
|
||||
// advise time is for this presentation time
|
||||
CRefTime m_tCurrentAdvise;
|
||||
|
||||
// the reference clock we are using (addrefed)
|
||||
IReferenceClock* m_pClock;
|
||||
|
||||
// true when running
|
||||
BOOL m_bRunning;
|
||||
|
||||
// contains stream time offset when m_bRunning is true
|
||||
CRefTime m_StreamTimeOffset;
|
||||
};
|
||||
|
||||
#endif // __CTLUTIL__
|
||||
@@ -4,13 +4,12 @@
|
||||
// Desc: DirectShow base classes - implements routines for using DirectDraw
|
||||
// on a multimonitor system.
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Copyright (c) 1995-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
//#include <strsafe.h>
|
||||
#include <strmif.h>
|
||||
#include <mmsystem.h>
|
||||
#include <streams.h>
|
||||
#include <ddraw.h>
|
||||
#include "ddmm.h"
|
||||
|
||||
/*
|
||||
@@ -23,7 +22,7 @@ typedef struct {
|
||||
BOOL fFound;
|
||||
} FindDeviceData;
|
||||
|
||||
BOOL CALLBACK FindDeviceCallback(GUID* lpGUID, LPSTR szName, LPSTR szDevice, LPVOID lParam)
|
||||
BOOL CALLBACK FindDeviceCallback(__in_opt GUID* lpGUID, __in LPSTR szName, __in LPSTR szDevice, __in LPVOID lParam)
|
||||
{
|
||||
FindDeviceData *p = (FindDeviceData*)lParam;
|
||||
|
||||
@@ -41,7 +40,7 @@ BOOL CALLBACK FindDeviceCallback(GUID* lpGUID, LPSTR szName, LPSTR szDevice, LPV
|
||||
}
|
||||
|
||||
|
||||
BOOL CALLBACK FindDeviceCallbackEx(GUID* lpGUID, LPSTR szName, LPSTR szDevice, LPVOID lParam, HMONITOR hMonitor)
|
||||
BOOL CALLBACK FindDeviceCallbackEx(__in_opt GUID* lpGUID, __in LPSTR szName, __in LPSTR szDevice, __in LPVOID lParam, HMONITOR hMonitor)
|
||||
{
|
||||
FindDeviceData *p = (FindDeviceData*)lParam;
|
||||
|
||||
@@ -64,7 +63,7 @@ BOOL CALLBACK FindDeviceCallbackEx(GUID* lpGUID, LPSTR szName, LPSTR szDevice, L
|
||||
*
|
||||
* create a DirectDraw object for a particular device
|
||||
*/
|
||||
IDirectDraw * DirectDrawCreateFromDevice(LPSTR szDevice, PDRAWCREATE DirectDrawCreateP, PDRAWENUM DirectDrawEnumerateP)
|
||||
IDirectDraw * DirectDrawCreateFromDevice(__in_opt LPSTR szDevice, PDRAWCREATE DirectDrawCreateP, PDRAWENUM DirectDrawEnumerateP)
|
||||
{
|
||||
IDirectDraw* pdd = NULL;
|
||||
FindDeviceData find;
|
||||
@@ -99,7 +98,7 @@ IDirectDraw * DirectDrawCreateFromDevice(LPSTR szDevice, PDRAWCREATE DirectDrawC
|
||||
*
|
||||
* create a DirectDraw object for a particular device
|
||||
*/
|
||||
IDirectDraw * DirectDrawCreateFromDeviceEx(LPSTR szDevice, PDRAWCREATE DirectDrawCreateP, LPDIRECTDRAWENUMERATEEXA DirectDrawEnumerateExP)
|
||||
IDirectDraw * DirectDrawCreateFromDeviceEx(__in_opt LPSTR szDevice, PDRAWCREATE DirectDrawCreateP, LPDIRECTDRAWENUMERATEEXA DirectDrawEnumerateExP)
|
||||
{
|
||||
IDirectDraw* pdd = NULL;
|
||||
FindDeviceData find;
|
||||
Vendored
+28
@@ -0,0 +1,28 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// File: DDMM.h
|
||||
//
|
||||
// Desc: DirectShow base classes - efines routines for using DirectDraw
|
||||
// on a multimonitor system.
|
||||
//
|
||||
// Copyright (c) 1995-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" { /* Assume C declarations for C++ */
|
||||
#endif /* __cplusplus */
|
||||
|
||||
// DDRAW.H might not include these
|
||||
#ifndef DDENUM_ATTACHEDSECONDARYDEVICES
|
||||
#define DDENUM_ATTACHEDSECONDARYDEVICES 0x00000001L
|
||||
#endif
|
||||
|
||||
typedef HRESULT (*PDRAWCREATE)(IID *,LPDIRECTDRAW *,LPUNKNOWN);
|
||||
typedef HRESULT (*PDRAWENUM)(LPDDENUMCALLBACKA, LPVOID);
|
||||
|
||||
IDirectDraw * DirectDrawCreateFromDevice(__in_opt LPSTR, PDRAWCREATE, PDRAWENUM);
|
||||
IDirectDraw * DirectDrawCreateFromDeviceEx(__in_opt LPSTR, PDRAWCREATE, LPDIRECTDRAWENUMERATEEXA);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
@@ -3,7 +3,7 @@
|
||||
//
|
||||
// Desc: DirectShow base classes.
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
//
|
||||
// Desc: DirectShow base classes.
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -159,7 +159,7 @@ void WINAPI Msr_Terminate(void);
|
||||
// Call this to get an Id for an "incident" that you can pass to Start, Stop or Note
|
||||
// everything that's logged is called an "incident".
|
||||
|
||||
int WINAPI Msr_Register(LPTSTR Incident);
|
||||
int WINAPI Msr_Register(__in LPTSTR Incident);
|
||||
|
||||
|
||||
// Reset the statistical counts for an incident
|
||||
@@ -4,7 +4,7 @@
|
||||
// Desc: DirectShow base classes - provides support for a worker thread
|
||||
// class to which one can asynchronously post messages.
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ public:
|
||||
LPVOID lpParam;
|
||||
CAMEvent *pEvent;
|
||||
|
||||
CMsg(UINT u, DWORD dw, LPVOID lp, CAMEvent *pEvnt)
|
||||
CMsg(UINT u, DWORD dw, __inout_opt LPVOID lp, __in_opt CAMEvent *pEvnt)
|
||||
: uMsg(u), dwFlags(dw), lpParam(lp), pEvent(pEvnt) {}
|
||||
|
||||
CMsg()
|
||||
@@ -31,7 +31,7 @@ public:
|
||||
//
|
||||
class AM_NOVTABLE CMsgThread {
|
||||
private:
|
||||
static DWORD WINAPI DefaultThreadProc(LPVOID lpParam);
|
||||
static DWORD WINAPI DefaultThreadProc(__inout LPVOID lpParam);
|
||||
DWORD m_ThreadId;
|
||||
HANDLE m_hThread;
|
||||
|
||||
@@ -58,7 +58,7 @@ public:
|
||||
~CMsgThread();
|
||||
// override this if you want to block on other things as well
|
||||
// as the message loop
|
||||
void virtual GetThreadMsg(CMsg *msg);
|
||||
void virtual GetThreadMsg(__out CMsg *msg);
|
||||
|
||||
// override this if you want to do something on thread startup
|
||||
virtual void OnThreadInit() {
|
||||
@@ -66,7 +66,7 @@ public:
|
||||
|
||||
BOOL CreateThread();
|
||||
|
||||
BOOL WaitForThreadExit(LPDWORD lpdwExitCode) {
|
||||
BOOL WaitForThreadExit(__out LPDWORD lpdwExitCode) {
|
||||
if (m_hThread != NULL) {
|
||||
WaitForSingleObject(m_hThread, INFINITE);
|
||||
return GetExitCodeThread(m_hThread, lpdwExitCode);
|
||||
@@ -100,7 +100,7 @@ public:
|
||||
|
||||
|
||||
void PutThreadMsg(UINT uMsg, DWORD dwMsgFlags,
|
||||
LPVOID lpMsgParam, CAMEvent *pEvent = NULL) {
|
||||
__in_opt LPVOID lpMsgParam, __in_opt CAMEvent *pEvent = NULL) {
|
||||
CAutoLock lck(&m_Lock);
|
||||
CMsg* pMsg = new CMsg(uMsg, dwMsgFlags, lpMsgParam, pEvent);
|
||||
m_ThreadQueue.AddTail(pMsg);
|
||||
@@ -115,6 +115,6 @@ public:
|
||||
// the creator thread.
|
||||
//
|
||||
virtual LRESULT ThreadMessageProc(
|
||||
UINT uMsg, DWORD dwFlags, LPVOID lpParam, CAMEvent *pEvent) = 0;
|
||||
UINT uMsg, DWORD dwFlags, __inout_opt LPVOID lpParam, __in_opt CAMEvent *pEvent) = 0;
|
||||
};
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
// Desc: DirectShow base classes - implements a class that holds and
|
||||
// manages media type information.
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
// types etc. Has same data members as the struct AM_MEDIA_TYPE defined
|
||||
// in the streams IDL file, but also has (non-virtual) functions
|
||||
|
||||
#include "streams.h"
|
||||
#include <streams.h>
|
||||
#include <mmreg.h>
|
||||
|
||||
CMediaType::~CMediaType(){
|
||||
@@ -35,7 +35,7 @@ CMediaType::CMediaType(const GUID * type)
|
||||
|
||||
// copy constructor does a deep copy of the format block
|
||||
|
||||
CMediaType::CMediaType(const AM_MEDIA_TYPE& rt, HRESULT* phr)
|
||||
CMediaType::CMediaType(const AM_MEDIA_TYPE& rt, __out_opt HRESULT* phr)
|
||||
{
|
||||
HRESULT hr = CopyMediaType(this, &rt);
|
||||
if (FAILED(hr) && (NULL != phr)) {
|
||||
@@ -44,7 +44,7 @@ CMediaType::CMediaType(const AM_MEDIA_TYPE& rt, HRESULT* phr)
|
||||
}
|
||||
|
||||
|
||||
CMediaType::CMediaType(const CMediaType& rt, HRESULT* phr)
|
||||
CMediaType::CMediaType(const CMediaType& rt, __out_opt HRESULT* phr)
|
||||
{
|
||||
HRESULT hr = CopyMediaType(this, &rt);
|
||||
if (FAILED(hr) && (NULL != phr)) {
|
||||
@@ -87,6 +87,7 @@ CMediaType::operator == (const CMediaType& rt) const
|
||||
(IsEqualGUID(formattype,rt.formattype) == TRUE) &&
|
||||
(cbFormat == rt.cbFormat) &&
|
||||
( (cbFormat == 0) ||
|
||||
pbFormat != NULL && rt.pbFormat != NULL &&
|
||||
(memcmp(pbFormat, rt.pbFormat, cbFormat) == 0)));
|
||||
}
|
||||
|
||||
@@ -179,7 +180,7 @@ CMediaType::SetTemporalCompression(BOOL bCompressed) {
|
||||
}
|
||||
|
||||
BOOL
|
||||
CMediaType::SetFormat(BYTE * pformat, ULONG cb)
|
||||
CMediaType::SetFormat(__in_bcount(cb) BYTE * pformat, ULONG cb)
|
||||
{
|
||||
if (NULL == AllocFormatBuffer(cb))
|
||||
return(FALSE);
|
||||
@@ -349,7 +350,7 @@ CMediaType::MatchesPartial(const CMediaType* ppartial) const
|
||||
// implementation allocates the structures which you must later delete
|
||||
// the format block may also be a pointer to an interface to release
|
||||
|
||||
void WINAPI DeleteMediaType(AM_MEDIA_TYPE *pmt)
|
||||
void WINAPI DeleteMediaType(__inout_opt AM_MEDIA_TYPE *pmt)
|
||||
{
|
||||
// allow NULL pointers for coding simplicity
|
||||
|
||||
@@ -393,7 +394,7 @@ AM_MEDIA_TYPE * WINAPI CreateMediaType(AM_MEDIA_TYPE const *pSrc)
|
||||
|
||||
// Copy 1 media type to another
|
||||
|
||||
HRESULT WINAPI CopyMediaType(AM_MEDIA_TYPE *pmtTarget, const AM_MEDIA_TYPE *pmtSource)
|
||||
HRESULT WINAPI CopyMediaType(__out AM_MEDIA_TYPE *pmtTarget, const AM_MEDIA_TYPE *pmtSource)
|
||||
{
|
||||
// We'll leak if we copy onto one that already exists - there's one
|
||||
// case we can check like that - copying to itself.
|
||||
@@ -419,7 +420,7 @@ HRESULT WINAPI CopyMediaType(AM_MEDIA_TYPE *pmtTarget, const AM_MEDIA_TYPE *pmtS
|
||||
|
||||
// Free an existing media type (ie free resources it holds)
|
||||
|
||||
void WINAPI FreeMediaType(AM_MEDIA_TYPE& mt)
|
||||
void WINAPI FreeMediaType(__inout AM_MEDIA_TYPE& mt)
|
||||
{
|
||||
if (mt.cbFormat != 0) {
|
||||
CoTaskMemFree((PVOID)mt.pbFormat);
|
||||
@@ -438,7 +439,7 @@ void WINAPI FreeMediaType(AM_MEDIA_TYPE& mt)
|
||||
|
||||
STDAPI CreateAudioMediaType(
|
||||
const WAVEFORMATEX *pwfx,
|
||||
AM_MEDIA_TYPE *pmt,
|
||||
__out AM_MEDIA_TYPE *pmt,
|
||||
BOOL bSetFormat
|
||||
)
|
||||
{
|
||||
@@ -4,7 +4,7 @@
|
||||
// Desc: DirectShow base classes - defines a class that holds and manages
|
||||
// media type information.
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -22,8 +22,8 @@ public:
|
||||
~CMediaType();
|
||||
CMediaType();
|
||||
CMediaType(const GUID * majortype);
|
||||
CMediaType(const AM_MEDIA_TYPE&, HRESULT* phr = NULL);
|
||||
CMediaType(const CMediaType&, HRESULT* phr = NULL);
|
||||
CMediaType(const AM_MEDIA_TYPE&, __out_opt HRESULT* phr = NULL);
|
||||
CMediaType(const CMediaType&, __out_opt HRESULT* phr = NULL);
|
||||
|
||||
CMediaType& operator=(const CMediaType&);
|
||||
CMediaType& operator=(const AM_MEDIA_TYPE&);
|
||||
@@ -57,7 +57,7 @@ public:
|
||||
|
||||
void SetFormatType(const GUID *);
|
||||
const GUID *FormatType() const {return &formattype; };
|
||||
BOOL SetFormat(BYTE *pFormat, ULONG length);
|
||||
BOOL SetFormat(__in_bcount(length) BYTE *pFormat, ULONG length);
|
||||
void ResetFormatBuffer();
|
||||
BYTE* AllocFormatBuffer(ULONG length);
|
||||
BYTE* ReallocFormatBuffer(ULONG length);
|
||||
@@ -73,16 +73,16 @@ public:
|
||||
structure which is useful when using the IEnumMediaFormats interface as
|
||||
the implementation allocates the structures which you must later delete */
|
||||
|
||||
void WINAPI DeleteMediaType(AM_MEDIA_TYPE *pmt);
|
||||
void WINAPI DeleteMediaType(__inout_opt AM_MEDIA_TYPE *pmt);
|
||||
AM_MEDIA_TYPE * WINAPI CreateMediaType(AM_MEDIA_TYPE const *pSrc);
|
||||
HRESULT WINAPI CopyMediaType(AM_MEDIA_TYPE *pmtTarget, const AM_MEDIA_TYPE *pmtSource);
|
||||
void WINAPI FreeMediaType(AM_MEDIA_TYPE& mt);
|
||||
HRESULT WINAPI CopyMediaType(__out AM_MEDIA_TYPE *pmtTarget, const AM_MEDIA_TYPE *pmtSource);
|
||||
void WINAPI FreeMediaType(__inout AM_MEDIA_TYPE& mt);
|
||||
|
||||
// Initialize a media type from a WAVEFORMATEX
|
||||
|
||||
STDAPI CreateAudioMediaType(
|
||||
const WAVEFORMATEX *pwfx,
|
||||
AM_MEDIA_TYPE *pmt,
|
||||
__out AM_MEDIA_TYPE *pmt,
|
||||
BOOL bSetFormat);
|
||||
|
||||
#endif /* __MTYPE__ */
|
||||
@@ -6,11 +6,11 @@
|
||||
// separate thread and sometimes call Receive() directly on the input
|
||||
// pin.
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
#include "streams.h"
|
||||
#include <streams.h>
|
||||
|
||||
|
||||
//
|
||||
@@ -42,7 +42,7 @@
|
||||
//
|
||||
COutputQueue::COutputQueue(
|
||||
IPin *pInputPin, // Pin to send stuff to
|
||||
HRESULT *phr, // 'Return code'
|
||||
__inout HRESULT *phr, // 'Return code'
|
||||
BOOL bAuto, // Ask pin if queue or not
|
||||
BOOL bQueue, // Send through queue
|
||||
LONG lBatchSize, // Batch
|
||||
@@ -58,6 +58,7 @@ COutputQueue::COutputQueue(
|
||||
m_pPin(pInputPin),
|
||||
m_ppSamples(NULL),
|
||||
m_lWaiting(0),
|
||||
m_evFlushComplete(FALSE, phr),
|
||||
m_pInputPin(NULL),
|
||||
m_bSendAnyway(FALSE),
|
||||
m_nBatched(0),
|
||||
@@ -178,7 +179,7 @@ COutputQueue::~COutputQueue()
|
||||
//
|
||||
// Call the real thread proc as a member function
|
||||
//
|
||||
DWORD WINAPI COutputQueue::InitialThreadProc(LPVOID pv)
|
||||
DWORD WINAPI COutputQueue::InitialThreadProc(__in LPVOID pv)
|
||||
{
|
||||
HRESULT hrCoInit = CAMThread::CoInitializeHelper();
|
||||
|
||||
@@ -591,10 +592,14 @@ HRESULT COutputQueue::Receive(IMediaSample *pSample)
|
||||
//
|
||||
|
||||
HRESULT COutputQueue::ReceiveMultiple (
|
||||
IMediaSample **ppSamples,
|
||||
__in_ecount(nSamples) IMediaSample **ppSamples,
|
||||
long nSamples,
|
||||
long *nSamplesProcessed)
|
||||
__out long *nSamplesProcessed)
|
||||
{
|
||||
if (nSamples < 0) {
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
|
||||
CAutoLock lck(this);
|
||||
// Either call directly or queue up the samples
|
||||
|
||||
@@ -632,7 +637,7 @@ HRESULT COutputQueue::ReceiveMultiple (
|
||||
// Loop processing the samples in batches
|
||||
|
||||
LONG iLost = 0;
|
||||
long iDone;
|
||||
long iDone = 0;
|
||||
for (iDone = 0;
|
||||
iDone < nSamples || (m_nBatched != 0 && m_bSendAnyway);
|
||||
) {
|
||||
@@ -698,9 +703,11 @@ void COutputQueue::Reset()
|
||||
if (!IsQueued()) {
|
||||
m_hr = S_OK;
|
||||
} else {
|
||||
CAutoLock lck(this);
|
||||
QueueSample(RESET_PACKET);
|
||||
NotifyThread();
|
||||
{
|
||||
CAutoLock lck(this);
|
||||
QueueSample(RESET_PACKET);
|
||||
NotifyThread();
|
||||
}
|
||||
m_evFlushComplete.Wait();
|
||||
}
|
||||
}
|
||||
@@ -5,7 +5,7 @@
|
||||
// makes a queue of samples and sends them to an output pin. The
|
||||
// class will optionally send the samples to the pin directly.
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ class COutputQueue : public CCritSec
|
||||
public:
|
||||
// Constructor
|
||||
COutputQueue(IPin *pInputPin, // Pin to send stuff to
|
||||
HRESULT *phr, // 'Return code'
|
||||
__inout HRESULT *phr, // 'Return code'
|
||||
BOOL bAuto = TRUE, // Ask pin if blocks
|
||||
BOOL bQueue = TRUE, // Send through queue (ignored if
|
||||
// bAuto set)
|
||||
@@ -50,9 +50,9 @@ public:
|
||||
|
||||
// do something with these media samples
|
||||
HRESULT ReceiveMultiple (
|
||||
IMediaSample **pSamples,
|
||||
__in_ecount(nSamples) IMediaSample **pSamples,
|
||||
long nSamples,
|
||||
long *nSamplesProcessed);
|
||||
__out long *nSamplesProcessed);
|
||||
|
||||
void Reset(); // Reset m_hr ready for more data
|
||||
|
||||
@@ -63,12 +63,12 @@ public:
|
||||
void SetPopEvent(HANDLE hEvent);
|
||||
|
||||
protected:
|
||||
static DWORD WINAPI InitialThreadProc(LPVOID pv);
|
||||
static DWORD WINAPI InitialThreadProc(__in LPVOID pv);
|
||||
DWORD ThreadProc();
|
||||
BOOL IsQueued()
|
||||
{
|
||||
return m_List != NULL;
|
||||
}
|
||||
};
|
||||
|
||||
// The critical section MUST be held when this is called
|
||||
void QueueSample(IMediaSample *pSample);
|
||||
@@ -76,7 +76,7 @@ protected:
|
||||
BOOL IsSpecialSample(IMediaSample *pSample)
|
||||
{
|
||||
return (DWORD_PTR)pSample > (DWORD_PTR)(LONG_PTR)(-16);
|
||||
}
|
||||
};
|
||||
|
||||
// Remove and Release() batched and queued samples
|
||||
void FreeSamples();
|
||||
@@ -109,8 +109,8 @@ protected:
|
||||
HANDLE m_hSem;
|
||||
CAMEvent m_evFlushComplete;
|
||||
HANDLE m_hThread;
|
||||
IMediaSample ** m_ppSamples;
|
||||
LONG m_nBatched;
|
||||
__field_ecount_opt(m_lBatchSize) IMediaSample ** m_ppSamples;
|
||||
__range(0, m_lBatchSize) LONG m_nBatched;
|
||||
|
||||
// Wait optimization
|
||||
LONG m_lWaiting;
|
||||
@@ -129,7 +129,7 @@ protected:
|
||||
BOOL m_bSendAnyway;
|
||||
|
||||
// Deferred 'return code'
|
||||
BOOL volatile m_hr;
|
||||
HRESULT volatile m_hr;
|
||||
|
||||
// an event that can be fired after every deliver
|
||||
HANDLE m_hEventPop;
|
||||
@@ -3,21 +3,22 @@
|
||||
//
|
||||
// Desc: DirectShow base classes.
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
#include "streams.h"
|
||||
#include <streams.h>
|
||||
#include <strsafe.h>
|
||||
|
||||
#ifdef PERF
|
||||
#include <measure.h>
|
||||
#endif
|
||||
|
||||
// #include "pstream.h" in streams.h
|
||||
|
||||
//
|
||||
// Constructor
|
||||
//
|
||||
CPersistStream::CPersistStream(IUnknown *punk, HRESULT *phr)
|
||||
CPersistStream::CPersistStream(IUnknown *punk, __inout HRESULT *phr)
|
||||
: mPS_fDirty(FALSE)
|
||||
{
|
||||
mPS_dwFileVersion = GetSoftwareVersion();
|
||||
@@ -38,10 +39,10 @@ SAMPLE CODE TO COPY - not active at the moment
|
||||
// NonDelegatingQueryInterface
|
||||
//
|
||||
// This object supports IPersist & IPersistStream
|
||||
STDMETHODIMP CPersistStream::NonDelegatingQueryInterface(REFIID riid, void **ppv)
|
||||
STDMETHODIMP CPersistStream::NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv)
|
||||
{
|
||||
if (riid == IID_IPersist) {
|
||||
return GetInterface((IPersist *) this, ppv);
|
||||
return GetInterface((IPersist *) this, ppv); // ???
|
||||
}
|
||||
else if (riid == IID_IPersistStream) {
|
||||
return GetInterface((IPersistStream *) this, ppv);
|
||||
@@ -128,7 +129,7 @@ STDMETHODIMP CPersistStream::Save(LPSTREAM pStm, BOOL fClearDirty)
|
||||
STDAPI WriteInt(IStream *pIStream, int n)
|
||||
{
|
||||
WCHAR Buff[13]; // Allows for trailing null that we don't write
|
||||
(void)StringCchPrintfW(Buff, NUMELMS(Buff), L"%011d ",n);
|
||||
(void)StringCchPrintfW(Buff, NUMELMS(Buff),L"%011d ",n);
|
||||
return pIStream->Write(&(Buff[0]), 12*sizeof(WCHAR), NULL);
|
||||
} // WriteInt
|
||||
|
||||
@@ -140,7 +141,7 @@ STDAPI WriteInt(IStream *pIStream, int n)
|
||||
// where the value isn't actually truncated by squeezing it into 32 bits
|
||||
// Striped down subset of what sscanf can do (without dragging in the C runtime)
|
||||
|
||||
STDAPI_(int) ReadInt(IStream *pIStream, HRESULT &hr)
|
||||
STDAPI_(int) ReadInt(IStream *pIStream, __out HRESULT &hr)
|
||||
{
|
||||
|
||||
int Sign = 1;
|
||||
@@ -4,7 +4,7 @@
|
||||
// Desc: DirectShow base classes - defines a class for persistent properties
|
||||
// of filters.
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -61,13 +61,13 @@ class CPersistStream : public IPersistStream {
|
||||
{return (mPS_fDirty ? S_OK : S_FALSE);} // note FALSE means clean
|
||||
STDMETHODIMP Load(LPSTREAM pStm);
|
||||
STDMETHODIMP Save(LPSTREAM pStm, BOOL fClearDirty);
|
||||
STDMETHODIMP GetSizeMax(ULARGE_INTEGER * pcbSize)
|
||||
STDMETHODIMP GetSizeMax(__out ULARGE_INTEGER * pcbSize)
|
||||
// Allow 24 bytes for version.
|
||||
{ pcbSize->QuadPart = 12*sizeof(WCHAR)+SizeMax(); return NOERROR; }
|
||||
|
||||
// implementation
|
||||
|
||||
CPersistStream(IUnknown *punk, HRESULT *phr);
|
||||
CPersistStream(IUnknown *punk, __inout HRESULT *phr);
|
||||
~CPersistStream();
|
||||
|
||||
HRESULT SetDirty(BOOL fDirty)
|
||||
@@ -80,7 +80,7 @@ class CPersistStream : public IPersistStream {
|
||||
// --- IPersist ---
|
||||
|
||||
// You must override this to provide your own class id
|
||||
STDMETHODIMP GetClassID(CLSID *pClsid) PURE;
|
||||
STDMETHODIMP GetClassID(__out CLSID *pClsid) PURE;
|
||||
|
||||
// overrideable if you want
|
||||
// file version number. Override it if you ever change format
|
||||
@@ -109,6 +109,6 @@ class CPersistStream : public IPersistStream {
|
||||
STDAPI WriteInt(IStream *pIStream, int n);
|
||||
|
||||
// inverse of WriteInt
|
||||
STDAPI_(int) ReadInt(IStream *pIStream, HRESULT &hr);
|
||||
STDAPI_(int) ReadInt(IStream *pIStream, __out HRESULT &hr);
|
||||
|
||||
#endif // __PSTREAM__
|
||||
@@ -4,13 +4,16 @@
|
||||
// Desc: DirectShow base classes - implements CPullPin class that pulls data
|
||||
// from IAsyncReader.
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
#include "streams.h"
|
||||
#include <streams.h>
|
||||
#include "pullpin.h"
|
||||
|
||||
#ifdef DXMPERF
|
||||
#include "dxmperf.h"
|
||||
#endif // DXMPERF
|
||||
|
||||
|
||||
CPullPin::CPullPin()
|
||||
@@ -18,11 +21,20 @@ CPullPin::CPullPin()
|
||||
m_pAlloc(NULL),
|
||||
m_State(TM_Exit)
|
||||
{
|
||||
#ifdef DXMPERF
|
||||
PERFLOG_CTOR( L"CPullPin", this );
|
||||
#endif // DXMPERF
|
||||
|
||||
}
|
||||
|
||||
CPullPin::~CPullPin()
|
||||
{
|
||||
Disconnect();
|
||||
|
||||
#ifdef DXMPERF
|
||||
PERFLOG_DTOR( L"CPullPin", this );
|
||||
#endif // DXMPERF
|
||||
|
||||
}
|
||||
|
||||
// returns S_OK if successfully connected to an IAsyncReader interface
|
||||
@@ -40,12 +52,28 @@ CPullPin::Connect(IUnknown* pUnk, IMemAllocator* pAlloc, BOOL bSync)
|
||||
|
||||
HRESULT hr = pUnk->QueryInterface(IID_IAsyncReader, (void**)&m_pReader);
|
||||
if (FAILED(hr)) {
|
||||
|
||||
#ifdef DXMPERF
|
||||
{
|
||||
AM_MEDIA_TYPE * pmt = NULL;
|
||||
PERFLOG_CONNECT( this, pUnk, hr, pmt );
|
||||
}
|
||||
#endif // DXMPERF
|
||||
|
||||
return(hr);
|
||||
}
|
||||
|
||||
hr = DecideAllocator(pAlloc, NULL);
|
||||
if (FAILED(hr)) {
|
||||
Disconnect();
|
||||
|
||||
#ifdef DXMPERF
|
||||
{
|
||||
AM_MEDIA_TYPE * pmt = NULL;
|
||||
PERFLOG_CONNECT( this, pUnk, hr, pmt );
|
||||
}
|
||||
#endif // DXMPERF
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
@@ -53,6 +81,14 @@ CPullPin::Connect(IUnknown* pUnk, IMemAllocator* pAlloc, BOOL bSync)
|
||||
hr = m_pReader->Length(&llTotal, &llAvail);
|
||||
if (FAILED(hr)) {
|
||||
Disconnect();
|
||||
|
||||
#ifdef DXMPERF
|
||||
{
|
||||
AM_MEDIA_TYPE * pmt = NULL;
|
||||
PERFLOG_CONNECT( this, pUnk, hr, pmt );
|
||||
}
|
||||
#endif
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
@@ -63,6 +99,14 @@ CPullPin::Connect(IUnknown* pUnk, IMemAllocator* pAlloc, BOOL bSync)
|
||||
|
||||
m_bSync = bSync;
|
||||
|
||||
#ifdef DXMPERF
|
||||
{
|
||||
AM_MEDIA_TYPE * pmt = NULL;
|
||||
PERFLOG_CONNECT( this, pUnk, S_OK, pmt );
|
||||
}
|
||||
#endif // DXMPERF
|
||||
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
@@ -74,6 +118,12 @@ CPullPin::Disconnect()
|
||||
|
||||
StopThread();
|
||||
|
||||
|
||||
#ifdef DXMPERF
|
||||
PERFLOG_DISCONNECT( this, m_pReader, S_OK );
|
||||
#endif // DXMPERF
|
||||
|
||||
|
||||
if (m_pReader) {
|
||||
m_pReader->Release();
|
||||
m_pReader = NULL;
|
||||
@@ -95,7 +145,7 @@ CPullPin::Disconnect()
|
||||
HRESULT
|
||||
CPullPin::DecideAllocator(
|
||||
IMemAllocator * pAlloc,
|
||||
ALLOCATOR_PROPERTIES * pProps)
|
||||
__inout_opt ALLOCATOR_PROPERTIES * pProps)
|
||||
{
|
||||
ALLOCATOR_PROPERTIES *pRequest;
|
||||
ALLOCATOR_PROPERTIES Request;
|
||||
@@ -157,7 +207,7 @@ CPullPin::Seek(REFERENCE_TIME tStart, REFERENCE_TIME tStop)
|
||||
}
|
||||
|
||||
HRESULT
|
||||
CPullPin::Duration(REFERENCE_TIME* ptDuration)
|
||||
CPullPin::Duration(__out REFERENCE_TIME* ptDuration)
|
||||
{
|
||||
*ptDuration = m_tDuration;
|
||||
return S_OK;
|
||||
@@ -284,7 +334,7 @@ CPullPin::ThreadProc(void)
|
||||
|
||||
HRESULT
|
||||
CPullPin::QueueSample(
|
||||
REFERENCE_TIME& tCurrent,
|
||||
__inout REFERENCE_TIME& tCurrent,
|
||||
REFERENCE_TIME tAlignStop,
|
||||
BOOL bDiscontinuity
|
||||
)
|
||||
@@ -352,16 +402,27 @@ CPullPin::DeliverSample(
|
||||
{
|
||||
// fix up sample if past actual stop (for sector alignment)
|
||||
REFERENCE_TIME t1, t2;
|
||||
pSample->GetTime(&t1, &t2);
|
||||
if (t2 > tStop) {
|
||||
t2 = tStop;
|
||||
if (S_OK == pSample->GetTime(&t1, &t2)) {
|
||||
if (t2 > tStop) {
|
||||
t2 = tStop;
|
||||
}
|
||||
|
||||
// adjust times to be relative to (aligned) start time
|
||||
t1 -= tStart;
|
||||
t2 -= tStart;
|
||||
HRESULT hr = pSample->SetTime(&t1, &t2);
|
||||
if (FAILED(hr)) {
|
||||
return hr;
|
||||
}
|
||||
}
|
||||
|
||||
// adjust times to be relative to (aligned) start time
|
||||
t1 -= tStart;
|
||||
t2 -= tStart;
|
||||
pSample->SetTime(&t1, &t2);
|
||||
|
||||
#ifdef DXMPERF
|
||||
{
|
||||
AM_MEDIA_TYPE * pmt = NULL;
|
||||
pSample->GetMediaType( &pmt );
|
||||
PERFLOG_RECEIVE( L"CPullPin", m_pReader, this, pSample, pmt );
|
||||
}
|
||||
#endif
|
||||
|
||||
HRESULT hr = Receive(pSample);
|
||||
pSample->Release();
|
||||
@@ -3,7 +3,7 @@
|
||||
//
|
||||
// Desc: DirectShow base classes - defines CPullPin class.
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -57,7 +57,7 @@ class CPullPin : public CAMThread
|
||||
|
||||
// called from ProcessAsync to queue and collect requests
|
||||
HRESULT QueueSample(
|
||||
REFERENCE_TIME& tCurrent,
|
||||
__inout REFERENCE_TIME& tCurrent,
|
||||
REFERENCE_TIME tAlignStop,
|
||||
BOOL bDiscontinuity);
|
||||
|
||||
@@ -95,14 +95,14 @@ public:
|
||||
// but no error occurs if it can't be met.
|
||||
virtual HRESULT DecideAllocator(
|
||||
IMemAllocator* pAlloc,
|
||||
ALLOCATOR_PROPERTIES * pProps);
|
||||
__inout_opt ALLOCATOR_PROPERTIES * pProps);
|
||||
|
||||
// set start and stop position. if active, will start immediately at
|
||||
// the new position. Default is 0 to duration
|
||||
HRESULT Seek(REFERENCE_TIME tStart, REFERENCE_TIME tStop);
|
||||
|
||||
// return the total duration
|
||||
HRESULT Duration(REFERENCE_TIME* ptDuration);
|
||||
HRESULT Duration(__out REFERENCE_TIME* ptDuration);
|
||||
|
||||
// start pulling data
|
||||
HRESULT Active(void);
|
||||
Vendored
+402
@@ -0,0 +1,402 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// File: RefClock.cpp
|
||||
//
|
||||
// Desc: DirectShow base classes - implements the IReferenceClock interface.
|
||||
//
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
#include <streams.h>
|
||||
#include <limits.h>
|
||||
|
||||
#ifdef DXMPERF
|
||||
#include "dxmperf.h"
|
||||
#endif // DXMPERF
|
||||
|
||||
|
||||
// 'this' used in constructor list
|
||||
#pragma warning(disable:4355)
|
||||
|
||||
|
||||
STDMETHODIMP CBaseReferenceClock::NonDelegatingQueryInterface(
|
||||
REFIID riid,
|
||||
__deref_out void ** ppv)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
if (riid == IID_IReferenceClock)
|
||||
{
|
||||
hr = GetInterface((IReferenceClock *) this, ppv);
|
||||
}
|
||||
else if (riid == IID_IReferenceClockTimerControl)
|
||||
{
|
||||
hr = GetInterface((IReferenceClockTimerControl *) this, ppv);
|
||||
}
|
||||
else
|
||||
{
|
||||
hr = CUnknown::NonDelegatingQueryInterface(riid, ppv);
|
||||
}
|
||||
return hr;
|
||||
}
|
||||
|
||||
CBaseReferenceClock::~CBaseReferenceClock()
|
||||
{
|
||||
#ifdef DXMPERF
|
||||
PERFLOG_DTOR( L"CBaseReferenceClock", (IReferenceClock *) this );
|
||||
#endif // DXMPERF
|
||||
|
||||
if (m_TimerResolution) timeEndPeriod(m_TimerResolution);
|
||||
|
||||
if (m_pSchedule)
|
||||
{
|
||||
m_pSchedule->DumpLinkedList();
|
||||
}
|
||||
|
||||
if (m_hThread)
|
||||
{
|
||||
m_bAbort = TRUE;
|
||||
TriggerThread();
|
||||
WaitForSingleObject( m_hThread, INFINITE );
|
||||
EXECUTE_ASSERT( CloseHandle(m_hThread) );
|
||||
m_hThread = 0;
|
||||
EXECUTE_ASSERT( CloseHandle(m_pSchedule->GetEvent()) );
|
||||
delete m_pSchedule;
|
||||
}
|
||||
}
|
||||
|
||||
// A derived class may supply a hThreadEvent if it has its own thread that will take care
|
||||
// of calling the schedulers Advise method. (Refere to CBaseReferenceClock::AdviseThread()
|
||||
// to see what such a thread has to do.)
|
||||
CBaseReferenceClock::CBaseReferenceClock( __in_opt LPCTSTR pName,
|
||||
__inout_opt LPUNKNOWN pUnk,
|
||||
__inout HRESULT *phr,
|
||||
__inout_opt CAMSchedule * pShed )
|
||||
: CUnknown( pName, pUnk )
|
||||
, m_rtLastGotTime(0)
|
||||
, m_TimerResolution(0)
|
||||
, m_bAbort( FALSE )
|
||||
, m_pSchedule( pShed ? pShed : new CAMSchedule(CreateEvent(NULL, FALSE, FALSE, NULL)) )
|
||||
, m_hThread(0)
|
||||
{
|
||||
|
||||
#ifdef DXMPERF
|
||||
PERFLOG_CTOR( pName ? pName : L"CBaseReferenceClock", (IReferenceClock *) this );
|
||||
#endif // DXMPERF
|
||||
|
||||
ASSERT(m_pSchedule);
|
||||
if (!m_pSchedule)
|
||||
{
|
||||
*phr = E_OUTOFMEMORY;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Set up the highest resolution timer we can manage
|
||||
TIMECAPS tc;
|
||||
m_TimerResolution = (TIMERR_NOERROR == timeGetDevCaps(&tc, sizeof(tc)))
|
||||
? tc.wPeriodMin
|
||||
: 1;
|
||||
|
||||
timeBeginPeriod(m_TimerResolution);
|
||||
|
||||
/* Initialise our system times - the derived clock should set the right values */
|
||||
m_dwPrevSystemTime = timeGetTime();
|
||||
m_rtPrivateTime = (UNITS / MILLISECONDS) * m_dwPrevSystemTime;
|
||||
|
||||
#ifdef PERF
|
||||
m_idGetSystemTime = MSR_REGISTER(TEXT("CBaseReferenceClock::GetTime"));
|
||||
#endif
|
||||
|
||||
if ( !pShed )
|
||||
{
|
||||
DWORD ThreadID;
|
||||
m_hThread = ::CreateThread(NULL, // Security attributes
|
||||
(DWORD) 0, // Initial stack size
|
||||
AdviseThreadFunction, // Thread start address
|
||||
(LPVOID) this, // Thread parameter
|
||||
(DWORD) 0, // Creation flags
|
||||
&ThreadID); // Thread identifier
|
||||
|
||||
if (m_hThread)
|
||||
{
|
||||
SetThreadPriority( m_hThread, THREAD_PRIORITY_TIME_CRITICAL );
|
||||
}
|
||||
else
|
||||
{
|
||||
*phr = E_FAIL;
|
||||
EXECUTE_ASSERT( CloseHandle(m_pSchedule->GetEvent()) );
|
||||
delete m_pSchedule;
|
||||
m_pSchedule = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CBaseReferenceClock::Restart (IN REFERENCE_TIME rtMinTime)
|
||||
{
|
||||
Lock();
|
||||
m_rtLastGotTime = rtMinTime ;
|
||||
Unlock();
|
||||
}
|
||||
|
||||
STDMETHODIMP CBaseReferenceClock::GetTime(__out REFERENCE_TIME *pTime)
|
||||
{
|
||||
HRESULT hr;
|
||||
if (pTime)
|
||||
{
|
||||
REFERENCE_TIME rtNow;
|
||||
Lock();
|
||||
rtNow = GetPrivateTime();
|
||||
if (rtNow > m_rtLastGotTime)
|
||||
{
|
||||
m_rtLastGotTime = rtNow;
|
||||
hr = S_OK;
|
||||
}
|
||||
else
|
||||
{
|
||||
hr = S_FALSE;
|
||||
}
|
||||
*pTime = m_rtLastGotTime;
|
||||
Unlock();
|
||||
MSR_INTEGER(m_idGetSystemTime, LONG((*pTime) / (UNITS/MILLISECONDS)) );
|
||||
|
||||
#ifdef DXMPERF
|
||||
PERFLOG_GETTIME( (IReferenceClock *) this, *pTime );
|
||||
#endif // DXMPERF
|
||||
|
||||
}
|
||||
else hr = E_POINTER;
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
/* Ask for an async notification that a time has elapsed */
|
||||
|
||||
STDMETHODIMP CBaseReferenceClock::AdviseTime(
|
||||
REFERENCE_TIME baseTime, // base reference time
|
||||
REFERENCE_TIME streamTime, // stream offset time
|
||||
HEVENT hEvent, // advise via this event
|
||||
__out DWORD_PTR *pdwAdviseCookie)// where your cookie goes
|
||||
{
|
||||
CheckPointer(pdwAdviseCookie, E_POINTER);
|
||||
*pdwAdviseCookie = 0;
|
||||
|
||||
// Check that the event is not already set
|
||||
ASSERT(WAIT_TIMEOUT == WaitForSingleObject(HANDLE(hEvent),0));
|
||||
|
||||
HRESULT hr;
|
||||
|
||||
const REFERENCE_TIME lRefTime = baseTime + streamTime;
|
||||
if ( lRefTime <= 0 || lRefTime == MAX_TIME )
|
||||
{
|
||||
hr = E_INVALIDARG;
|
||||
}
|
||||
else
|
||||
{
|
||||
*pdwAdviseCookie = m_pSchedule->AddAdvisePacket( lRefTime, 0, HANDLE(hEvent), FALSE );
|
||||
hr = *pdwAdviseCookie ? NOERROR : E_OUTOFMEMORY;
|
||||
}
|
||||
return hr;
|
||||
}
|
||||
|
||||
|
||||
/* Ask for an asynchronous periodic notification that a time has elapsed */
|
||||
|
||||
STDMETHODIMP CBaseReferenceClock::AdvisePeriodic(
|
||||
REFERENCE_TIME StartTime, // starting at this time
|
||||
REFERENCE_TIME PeriodTime, // time between notifications
|
||||
HSEMAPHORE hSemaphore, // advise via a semaphore
|
||||
__out DWORD_PTR *pdwAdviseCookie) // where your cookie goes
|
||||
{
|
||||
CheckPointer(pdwAdviseCookie, E_POINTER);
|
||||
*pdwAdviseCookie = 0;
|
||||
|
||||
HRESULT hr;
|
||||
if (StartTime > 0 && PeriodTime > 0 && StartTime != MAX_TIME )
|
||||
{
|
||||
*pdwAdviseCookie = m_pSchedule->AddAdvisePacket( StartTime, PeriodTime, HANDLE(hSemaphore), TRUE );
|
||||
hr = *pdwAdviseCookie ? NOERROR : E_OUTOFMEMORY;
|
||||
}
|
||||
else hr = E_INVALIDARG;
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
|
||||
STDMETHODIMP CBaseReferenceClock::Unadvise(DWORD_PTR dwAdviseCookie)
|
||||
{
|
||||
return m_pSchedule->Unadvise(dwAdviseCookie);
|
||||
}
|
||||
|
||||
|
||||
REFERENCE_TIME CBaseReferenceClock::GetPrivateTime()
|
||||
{
|
||||
CAutoLock cObjectLock(this);
|
||||
|
||||
|
||||
/* If the clock has wrapped then the current time will be less than
|
||||
* the last time we were notified so add on the extra milliseconds
|
||||
*
|
||||
* The time period is long enough so that the likelihood of
|
||||
* successive calls spanning the clock cycle is not considered.
|
||||
*/
|
||||
|
||||
DWORD dwTime = timeGetTime();
|
||||
{
|
||||
m_rtPrivateTime += Int32x32To64(UNITS / MILLISECONDS, (DWORD)(dwTime - m_dwPrevSystemTime));
|
||||
m_dwPrevSystemTime = dwTime;
|
||||
}
|
||||
|
||||
return m_rtPrivateTime;
|
||||
}
|
||||
|
||||
|
||||
/* Adjust the current time by the input value. This allows an
|
||||
external time source to work out some of the latency of the clock
|
||||
system and adjust the "current" time accordingly. The intent is
|
||||
that the time returned to the user is synchronised to a clock
|
||||
source and allows drift to be catered for.
|
||||
|
||||
For example: if the clock source detects a drift it can pass a delta
|
||||
to the current time rather than having to set an explicit time.
|
||||
*/
|
||||
|
||||
STDMETHODIMP CBaseReferenceClock::SetTimeDelta(const REFERENCE_TIME & TimeDelta)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
|
||||
// Just break if passed an improper time delta value
|
||||
LONGLONG llDelta = TimeDelta > 0 ? TimeDelta : -TimeDelta;
|
||||
if (llDelta > UNITS * 1000) {
|
||||
DbgLog((LOG_TRACE, 0, TEXT("Bad Time Delta")));
|
||||
//DebugBreak();
|
||||
}
|
||||
|
||||
// We're going to calculate a "severity" for the time change. Max -1
|
||||
// min 8. We'll then use this as the debug logging level for a
|
||||
// debug log message.
|
||||
const LONG usDelta = LONG(TimeDelta/10); // Delta in micro-secs
|
||||
|
||||
DWORD delta = abs(usDelta); // varying delta
|
||||
// Severity == 8 - ceil(log<base 8>(abs( micro-secs delta)))
|
||||
int Severity = 8;
|
||||
while ( delta > 0 )
|
||||
{
|
||||
delta >>= 3; // div 8
|
||||
Severity--;
|
||||
}
|
||||
|
||||
// Sev == 0 => > 2 second delta!
|
||||
DbgLog((LOG_TIMING, Severity < 0 ? 0 : Severity,
|
||||
TEXT("Sev %2i: CSystemClock::SetTimeDelta(%8ld us) %lu -> %lu ms."),
|
||||
Severity, usDelta, DWORD(ConvertToMilliseconds(m_rtPrivateTime)),
|
||||
DWORD(ConvertToMilliseconds(TimeDelta+m_rtPrivateTime)) ));
|
||||
|
||||
// Don't want the DbgBreak to fire when running stress on debug-builds.
|
||||
#ifdef BREAK_ON_SEVERE_TIME_DELTA
|
||||
if (Severity < 0)
|
||||
DbgBreakPoint(TEXT("SetTimeDelta > 16 seconds!"),
|
||||
TEXT(__FILE__),__LINE__);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
CAutoLock cObjectLock(this);
|
||||
m_rtPrivateTime += TimeDelta;
|
||||
// If time goes forwards, and we have advises, then we need to
|
||||
// trigger the thread so that it can re-evaluate its wait time.
|
||||
// Since we don't want the cost of the thread switches if the change
|
||||
// is really small, only do it if clock goes forward by more than
|
||||
// 0.5 millisecond. If the time goes backwards, the thread will
|
||||
// wake up "early" (relativly speaking) and will re-evaluate at
|
||||
// that time.
|
||||
if ( TimeDelta > 5000 && m_pSchedule->GetAdviseCount() > 0 ) TriggerThread();
|
||||
return NOERROR;
|
||||
}
|
||||
|
||||
// Thread stuff
|
||||
|
||||
DWORD __stdcall CBaseReferenceClock::AdviseThreadFunction(__in LPVOID p)
|
||||
{
|
||||
return DWORD(reinterpret_cast<CBaseReferenceClock*>(p)->AdviseThread());
|
||||
}
|
||||
|
||||
HRESULT CBaseReferenceClock::AdviseThread()
|
||||
{
|
||||
DWORD dwWait = INFINITE;
|
||||
|
||||
// The first thing we do is wait until something interesting happens
|
||||
// (meaning a first advise or shutdown). This prevents us calling
|
||||
// GetPrivateTime immediately which is goodness as that is a virtual
|
||||
// routine and the derived class may not yet be constructed. (This
|
||||
// thread is created in the base class constructor.)
|
||||
|
||||
while ( !m_bAbort )
|
||||
{
|
||||
// Wait for an interesting event to happen
|
||||
DbgLog((LOG_TIMING, 3, TEXT("CBaseRefClock::AdviseThread() Delay: %lu ms"), dwWait ));
|
||||
WaitForSingleObject(m_pSchedule->GetEvent(), dwWait);
|
||||
if (m_bAbort) break;
|
||||
|
||||
// There are several reasons why we need to work from the internal
|
||||
// time, mainly to do with what happens when time goes backwards.
|
||||
// Mainly, it stop us looping madly if an event is just about to
|
||||
// expire when the clock goes backward (i.e. GetTime stop for a
|
||||
// while).
|
||||
const REFERENCE_TIME rtNow = GetPrivateTime();
|
||||
|
||||
DbgLog((LOG_TIMING, 3,
|
||||
TEXT("CBaseRefClock::AdviseThread() Woke at = %lu ms"),
|
||||
ConvertToMilliseconds(rtNow) ));
|
||||
|
||||
// We must add in a millisecond, since this is the resolution of our
|
||||
// WaitForSingleObject timer. Failure to do so will cause us to loop
|
||||
// franticly for (approx) 1 a millisecond.
|
||||
m_rtNextAdvise = m_pSchedule->Advise( 10000 + rtNow );
|
||||
LONGLONG llWait = m_rtNextAdvise - rtNow;
|
||||
|
||||
ASSERT( llWait > 0 );
|
||||
|
||||
llWait = ConvertToMilliseconds(llWait);
|
||||
// DON'T replace this with a max!! (The type's of these things is VERY important)
|
||||
dwWait = (llWait > REFERENCE_TIME(UINT_MAX)) ? UINT_MAX : DWORD(llWait);
|
||||
};
|
||||
return NOERROR;
|
||||
}
|
||||
|
||||
HRESULT CBaseReferenceClock::SetDefaultTimerResolution(
|
||||
REFERENCE_TIME timerResolution // in 100ns
|
||||
)
|
||||
{
|
||||
CAutoLock cObjectLock(this);
|
||||
if( 0 == timerResolution ) {
|
||||
if( m_TimerResolution ) {
|
||||
timeEndPeriod( m_TimerResolution );
|
||||
m_TimerResolution = 0;
|
||||
}
|
||||
} else {
|
||||
TIMECAPS tc;
|
||||
DWORD dwMinResolution = (TIMERR_NOERROR == timeGetDevCaps(&tc, sizeof(tc)))
|
||||
? tc.wPeriodMin
|
||||
: 1;
|
||||
DWORD dwResolution = max( dwMinResolution, DWORD(timerResolution / 10000) );
|
||||
if( dwResolution != m_TimerResolution ) {
|
||||
timeEndPeriod(m_TimerResolution);
|
||||
m_TimerResolution = dwResolution;
|
||||
timeBeginPeriod( m_TimerResolution );
|
||||
}
|
||||
}
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT CBaseReferenceClock::GetDefaultTimerResolution(
|
||||
__out REFERENCE_TIME* pTimerResolution // in 100ns
|
||||
)
|
||||
{
|
||||
if( !pTimerResolution ) {
|
||||
return E_POINTER;
|
||||
}
|
||||
CAutoLock cObjectLock(this);
|
||||
*pTimerResolution = m_TimerResolution * 10000;
|
||||
return S_OK;
|
||||
}
|
||||
@@ -3,14 +3,14 @@
|
||||
//
|
||||
// Desc: DirectShow base classes - defines the IReferenceClock interface.
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
#ifndef __BASEREFCLOCK__
|
||||
#define __BASEREFCLOCK__
|
||||
|
||||
#include "dsschedule.h"
|
||||
#include <Schedule.h>
|
||||
|
||||
const UINT RESOLUTION = 1; /* High resolution timer */
|
||||
const INT ADVISE_CACHE = 4; /* Default cache size */
|
||||
@@ -37,9 +37,9 @@ inline LONGLONG WINAPI ConvertToMilliseconds(const REFERENCE_TIME& RT)
|
||||
* whatever source) have to be derived from this class.
|
||||
*
|
||||
* The abstract class provides implementations for:
|
||||
* CUnknown support
|
||||
* CUnknown support
|
||||
* locking support (CCritSec)
|
||||
* client advise code (creates a thread)
|
||||
* client advise code (creates a thread)
|
||||
*
|
||||
* Question: what can we do about quality? Change the timer
|
||||
* resolution to lower the system load? Up the priority of the
|
||||
@@ -72,14 +72,17 @@ inline LONGLONG WINAPI ConvertToMilliseconds(const REFERENCE_TIME& RT)
|
||||
*/
|
||||
|
||||
class CBaseReferenceClock
|
||||
: public CUnknown, public IReferenceClock, public CCritSec
|
||||
: public CUnknown, public IReferenceClock, public CCritSec, public IReferenceClockTimerControl
|
||||
{
|
||||
protected:
|
||||
virtual ~CBaseReferenceClock(); // Don't let me be created on the stack!
|
||||
public:
|
||||
CBaseReferenceClock(TCHAR *pName, LPUNKNOWN pUnk, HRESULT *phr, CAMSchedule * pSched = 0 );
|
||||
CBaseReferenceClock(__in_opt LPCTSTR pName,
|
||||
__inout_opt LPUNKNOWN pUnk,
|
||||
__inout HRESULT *phr,
|
||||
__inout_opt CAMSchedule * pSched = 0 );
|
||||
|
||||
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid,void ** ppv);
|
||||
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, __deref_out void ** ppv);
|
||||
|
||||
DECLARE_IUNKNOWN
|
||||
|
||||
@@ -90,7 +93,7 @@ public:
|
||||
// clock has gone backwards and GetTime time has halted until internal
|
||||
// time has caught up. (Don't know if this will be much use to folk,
|
||||
// but it seems odd not to use the return code for something useful.)
|
||||
STDMETHODIMP GetTime(REFERENCE_TIME *pTime);
|
||||
STDMETHODIMP GetTime(__out REFERENCE_TIME *pTime);
|
||||
// When this is called, it sets m_rtLastGotTime to the time it returns.
|
||||
|
||||
/* Provide standard mechanisms for scheduling events */
|
||||
@@ -100,7 +103,7 @@ public:
|
||||
REFERENCE_TIME baseTime, // base reference time
|
||||
REFERENCE_TIME streamTime, // stream offset time
|
||||
HEVENT hEvent, // advise via this event
|
||||
DWORD_PTR *pdwAdviseCookie // where your cookie goes
|
||||
__out DWORD_PTR *pdwAdviseCookie// where your cookie goes
|
||||
);
|
||||
|
||||
/* Ask for an asynchronous periodic notification that a time has elapsed */
|
||||
@@ -108,7 +111,7 @@ public:
|
||||
REFERENCE_TIME StartTime, // starting at this time
|
||||
REFERENCE_TIME PeriodTime, // time between notifications
|
||||
HSEMAPHORE hSemaphore, // advise via a semaphore
|
||||
DWORD_PTR *pdwAdviseCookie // where your cookie goes
|
||||
__out DWORD_PTR *pdwAdviseCookie// where your cookie goes
|
||||
);
|
||||
|
||||
/* Cancel a request for notification(s) - if the notification was
|
||||
@@ -135,6 +138,16 @@ public:
|
||||
|
||||
CAMSchedule * GetSchedule() const { return m_pSchedule; }
|
||||
|
||||
// IReferenceClockTimerControl methods
|
||||
//
|
||||
// Setting a default of 0 disables the default of 1ms
|
||||
STDMETHODIMP SetDefaultTimerResolution(
|
||||
REFERENCE_TIME timerResolution // in 100ns
|
||||
);
|
||||
STDMETHODIMP GetDefaultTimerResolution(
|
||||
__out REFERENCE_TIME* pTimerResolution // in 100ns
|
||||
);
|
||||
|
||||
private:
|
||||
REFERENCE_TIME m_rtPrivateTime; // Current best estimate of time
|
||||
DWORD m_dwPrevSystemTime; // Last vaule we got from timeGetTime
|
||||
@@ -148,9 +161,9 @@ private:
|
||||
|
||||
// Thread stuff
|
||||
public:
|
||||
void TriggerThread() // Wakes thread up. Need to do this if
|
||||
{ // time to next advise needs reevaluating.
|
||||
EXECUTE_ASSERT(SetEvent(m_pSchedule->GetEvent()));
|
||||
void TriggerThread() // Wakes thread up. Need to do this if
|
||||
{ // time to next advise needs reevaluating.
|
||||
EXECUTE_ASSERT(SetEvent(m_pSchedule->GetEvent()));
|
||||
}
|
||||
|
||||
|
||||
@@ -159,10 +172,10 @@ private:
|
||||
HANDLE m_hThread; // Thread handle
|
||||
|
||||
HRESULT AdviseThread(); // Method in which the advise thread runs
|
||||
static DWORD __stdcall AdviseThreadFunction(LPVOID); // Function used to get there
|
||||
static DWORD __stdcall AdviseThreadFunction(__in LPVOID); // Function used to get there
|
||||
|
||||
protected:
|
||||
CAMSchedule * const m_pSchedule;
|
||||
CAMSchedule * m_pSchedule;
|
||||
|
||||
void Restart (IN REFERENCE_TIME rtMinTime = 0I64) ;
|
||||
};
|
||||
@@ -4,7 +4,7 @@
|
||||
// Desc: DirectShow base classes - defines CRefTime, a class that manages
|
||||
// reference times.
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -3,14 +3,14 @@
|
||||
//
|
||||
// Desc: DirectShow base classes.
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
#include "streams.h" // DirectShow base class definitions
|
||||
#include <streams.h> // DirectShow base class definitions
|
||||
#include <mmsystem.h> // Needed for definition of timeGetTime
|
||||
#include <limits.h> // Standard data type limit definitions
|
||||
#include "measure.h" // Used for time critical log functions
|
||||
#include <measure.h> // Used for time critical log functions
|
||||
|
||||
#pragma warning(disable:4355)
|
||||
|
||||
@@ -28,15 +28,16 @@ int inline TimeDiff(REFERENCE_TIME rt)
|
||||
// Implements the CBaseRenderer class
|
||||
|
||||
CBaseRenderer::CBaseRenderer(REFCLSID RenderClass, // CLSID for this renderer
|
||||
TCHAR *pName, // Debug ONLY description
|
||||
LPUNKNOWN pUnk, // Aggregated owner object
|
||||
HRESULT *phr) : // General OLE return code
|
||||
__in_opt LPCTSTR pName, // Debug ONLY description
|
||||
__inout_opt LPUNKNOWN pUnk, // Aggregated owner object
|
||||
__inout HRESULT *phr) : // General OLE return code
|
||||
|
||||
CBaseFilter(pName,pUnk,&m_InterfaceLock,RenderClass),
|
||||
m_evComplete(TRUE),
|
||||
m_evComplete(TRUE, phr),
|
||||
m_RenderEvent(FALSE, phr),
|
||||
m_bAbort(FALSE),
|
||||
m_pPosition(NULL),
|
||||
m_ThreadSignal(TRUE),
|
||||
m_ThreadSignal(TRUE, phr),
|
||||
m_bStreaming(FALSE),
|
||||
m_bEOS(FALSE),
|
||||
m_bEOSDelivered(FALSE),
|
||||
@@ -49,12 +50,14 @@ CBaseRenderer::CBaseRenderer(REFCLSID RenderClass, // CLSID for this renderer
|
||||
m_bInReceive(FALSE),
|
||||
m_EndOfStreamTimer(0)
|
||||
{
|
||||
Ready();
|
||||
if (SUCCEEDED(*phr)) {
|
||||
Ready();
|
||||
#ifdef PERF
|
||||
m_idBaseStamp = MSR_REGISTER(TEXT("BaseRenderer: sample time stamp"));
|
||||
m_idBaseRenderTime = MSR_REGISTER(TEXT("BaseRenderer: draw time (msec)"));
|
||||
m_idBaseAccuracy = MSR_REGISTER(TEXT("BaseRenderer: Accuracy (msec)"));
|
||||
m_idBaseStamp = MSR_REGISTER(TEXT("BaseRenderer: sample time stamp"));
|
||||
m_idBaseRenderTime = MSR_REGISTER(TEXT("BaseRenderer: draw time (msec)"));
|
||||
m_idBaseAccuracy = MSR_REGISTER(TEXT("BaseRenderer: Accuracy (msec)"));
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -93,13 +96,18 @@ CBaseRenderer::~CBaseRenderer()
|
||||
|
||||
// This returns the IMediaPosition and IMediaSeeking interfaces
|
||||
|
||||
HRESULT CBaseRenderer::GetMediaPositionInterface(REFIID riid,void **ppv)
|
||||
HRESULT CBaseRenderer::GetMediaPositionInterface(REFIID riid, __deref_out void **ppv)
|
||||
{
|
||||
CAutoLock cObjectCreationLock(&m_ObjectCreationLock);
|
||||
if (m_pPosition) {
|
||||
return m_pPosition->NonDelegatingQueryInterface(riid,ppv);
|
||||
}
|
||||
|
||||
CBasePin *pPin = GetPin(0);
|
||||
if (NULL == pPin) {
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
|
||||
HRESULT hr = NOERROR;
|
||||
|
||||
// Create implementation of this dynamically since sometimes we may
|
||||
@@ -110,7 +118,7 @@ HRESULT CBaseRenderer::GetMediaPositionInterface(REFIID riid,void **ppv)
|
||||
m_pPosition = new CRendererPosPassThru(NAME("Renderer CPosPassThru"),
|
||||
CBaseFilter::GetOwner(),
|
||||
(HRESULT *) &hr,
|
||||
GetPin(0));
|
||||
pPin);
|
||||
if (m_pPosition == NULL) {
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
@@ -126,7 +134,7 @@ HRESULT CBaseRenderer::GetMediaPositionInterface(REFIID riid,void **ppv)
|
||||
|
||||
// Overriden to say what interfaces we support and where
|
||||
|
||||
STDMETHODIMP CBaseRenderer::NonDelegatingQueryInterface(REFIID riid,void **ppv)
|
||||
STDMETHODIMP CBaseRenderer::NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv)
|
||||
{
|
||||
// Do we have this interface
|
||||
|
||||
@@ -287,7 +295,7 @@ void CBaseRenderer::WaitForReceiveToComplete()
|
||||
}
|
||||
|
||||
MSG msg;
|
||||
// Receive all interthread sendmessages
|
||||
// Receive all interthread snedmessages
|
||||
PeekMessage(&msg, NULL, WM_NULL, WM_NULL, PM_NOREMOVE);
|
||||
|
||||
Sleep(1);
|
||||
@@ -582,7 +590,11 @@ STDMETHODIMP CBaseRenderer::Run(REFERENCE_TIME StartTime)
|
||||
|
||||
int CBaseRenderer::GetPinCount()
|
||||
{
|
||||
return 1;
|
||||
if (m_pInputPin == NULL) {
|
||||
// Try to create it
|
||||
(void)GetPin(0);
|
||||
}
|
||||
return m_pInputPin != NULL ? 1 : 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -625,14 +637,17 @@ CBasePin *CBaseRenderer::GetPin(int n)
|
||||
|
||||
// If "In" then return the IPin for our input pin, otherwise NULL and error
|
||||
|
||||
STDMETHODIMP CBaseRenderer::FindPin(LPCWSTR Id, IPin **ppPin)
|
||||
STDMETHODIMP CBaseRenderer::FindPin(LPCWSTR Id, __deref_out IPin **ppPin)
|
||||
{
|
||||
CheckPointer(ppPin,E_POINTER);
|
||||
|
||||
if (0==lstrcmpW(Id,L"In")) {
|
||||
*ppPin = GetPin(0);
|
||||
ASSERT(*ppPin);
|
||||
(*ppPin)->AddRef();
|
||||
if (*ppPin) {
|
||||
(*ppPin)->AddRef();
|
||||
} else {
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
} else {
|
||||
*ppPin = NULL;
|
||||
return VFW_E_NOT_FOUND;
|
||||
@@ -814,8 +829,8 @@ HRESULT CBaseRenderer::BreakConnect()
|
||||
// which case the object should simply render the sample data immediately
|
||||
|
||||
HRESULT CBaseRenderer::GetSampleTimes(IMediaSample *pMediaSample,
|
||||
REFERENCE_TIME *pStartTime,
|
||||
REFERENCE_TIME *pEndTime)
|
||||
__out REFERENCE_TIME *pStartTime,
|
||||
__out REFERENCE_TIME *pEndTime)
|
||||
{
|
||||
ASSERT(m_dwAdvise == 0);
|
||||
ASSERT(pMediaSample);
|
||||
@@ -849,8 +864,8 @@ HRESULT CBaseRenderer::GetSampleTimes(IMediaSample *pMediaSample,
|
||||
// by the derived video renderer class in its quality management.
|
||||
|
||||
HRESULT CBaseRenderer::ShouldDrawSampleNow(IMediaSample *pMediaSample,
|
||||
REFERENCE_TIME *ptrStart,
|
||||
REFERENCE_TIME *ptrEnd)
|
||||
__out REFERENCE_TIME *ptrStart,
|
||||
__out REFERENCE_TIME *ptrEnd)
|
||||
{
|
||||
return S_FALSE;
|
||||
}
|
||||
@@ -1544,9 +1559,9 @@ void CBaseRenderer::OnRenderEnd(IMediaSample *pMediaSample)
|
||||
|
||||
// Constructor must be passed the base renderer object
|
||||
|
||||
CRendererInputPin::CRendererInputPin(CBaseRenderer *pRenderer,
|
||||
HRESULT *phr,
|
||||
LPCWSTR pPinName) :
|
||||
CRendererInputPin::CRendererInputPin(__inout CBaseRenderer *pRenderer,
|
||||
__inout HRESULT *phr,
|
||||
__in_opt LPCWSTR pPinName) :
|
||||
CBaseInputPin(NAME("Renderer pin"),
|
||||
pRenderer,
|
||||
&pRenderer->m_InterfaceLock,
|
||||
@@ -1685,16 +1700,17 @@ HRESULT CRendererInputPin::CompleteConnect(IPin *pReceivePin)
|
||||
|
||||
// Give the pin id of our one and only pin
|
||||
|
||||
STDMETHODIMP CRendererInputPin::QueryId(LPWSTR *Id)
|
||||
STDMETHODIMP CRendererInputPin::QueryId(__deref_out LPWSTR *Id)
|
||||
{
|
||||
CheckPointer(Id,E_POINTER);
|
||||
|
||||
const size_t len = 4;
|
||||
*Id = (LPWSTR)CoTaskMemAlloc(len * sizeof(WCHAR));
|
||||
const WCHAR szIn[] = L"In";
|
||||
|
||||
*Id = (LPWSTR)CoTaskMemAlloc(sizeof(szIn));
|
||||
if (*Id == NULL) {
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
(void)StringCchCopyW(*Id, len, L"In");
|
||||
CopyMemory(*Id, szIn, sizeof(szIn));
|
||||
return NOERROR;
|
||||
}
|
||||
|
||||
@@ -1753,9 +1769,9 @@ const TCHAR DRAWLATEFRAMES[] = TEXT("DrawLateFrames");
|
||||
|
||||
CBaseVideoRenderer::CBaseVideoRenderer(
|
||||
REFCLSID RenderClass, // CLSID for this renderer
|
||||
TCHAR *pName, // Debug ONLY description
|
||||
LPUNKNOWN pUnk, // Aggregated owner object
|
||||
HRESULT *phr) : // General OLE return code
|
||||
__in_opt LPCTSTR pName, // Debug ONLY description
|
||||
__inout_opt LPUNKNOWN pUnk, // Aggregated owner object
|
||||
__inout HRESULT *phr) : // General OLE return code
|
||||
|
||||
CBaseRenderer(RenderClass,pName,pUnk,phr),
|
||||
m_cFramesDropped(0),
|
||||
@@ -1834,8 +1850,8 @@ HRESULT CBaseVideoRenderer::ResetStreamingTimes()
|
||||
m_iTotAcc = 0;
|
||||
m_iSumSqAcc = 0;
|
||||
m_iSumSqFrameTime = 0;
|
||||
m_trFrame = 0; // hygiene - not really needed
|
||||
m_trLate = 0; // hygiene - not really needed
|
||||
m_trFrame = 0; // hygeine - not really needed
|
||||
m_trLate = 0; // hygeine - not really needed
|
||||
m_iSumFrameTime = 0;
|
||||
m_nNormal = 0;
|
||||
m_trEarliness = 0;
|
||||
@@ -2282,8 +2298,8 @@ HRESULT CBaseVideoRenderer::SendQuality(REFERENCE_TIME trLate,
|
||||
// to make the decision
|
||||
|
||||
HRESULT CBaseVideoRenderer::ShouldDrawSampleNow(IMediaSample *pMediaSample,
|
||||
REFERENCE_TIME *ptrStart,
|
||||
REFERENCE_TIME *ptrEnd)
|
||||
__inout REFERENCE_TIME *ptrStart,
|
||||
__inout REFERENCE_TIME *ptrEnd)
|
||||
{
|
||||
|
||||
// Don't call us unless there's a clock interface to synchronise with
|
||||
@@ -2618,7 +2634,7 @@ BOOL CBaseVideoRenderer::ScheduleSample(IMediaSample *pMediaSample)
|
||||
// our IQualProp interface. The AddRef and Release are handled automatically
|
||||
// by the base class and will be passed on to the appropriate outer object
|
||||
|
||||
STDMETHODIMP CBaseVideoRenderer::get_FramesDroppedInRenderer(int *pcFramesDropped)
|
||||
STDMETHODIMP CBaseVideoRenderer::get_FramesDroppedInRenderer(__out int *pcFramesDropped)
|
||||
{
|
||||
CheckPointer(pcFramesDropped,E_POINTER);
|
||||
CAutoLock cVideoLock(&m_InterfaceLock);
|
||||
@@ -2669,7 +2685,7 @@ STDMETHODIMP CBaseVideoRenderer::get_AvgFrameRate( int *piAvgFrameRate)
|
||||
// in mSec. The sync offset is the time in mSec between when the frame
|
||||
// should have been drawn and when the frame was actually drawn.
|
||||
|
||||
STDMETHODIMP CBaseVideoRenderer::get_AvgSyncOffset( int *piAvg)
|
||||
STDMETHODIMP CBaseVideoRenderer::get_AvgSyncOffset(__out int *piAvg)
|
||||
{
|
||||
CheckPointer(piAvg,E_POINTER);
|
||||
CAutoLock cVideoLock(&m_InterfaceLock);
|
||||
@@ -2737,7 +2753,7 @@ int isqrt(int x)
|
||||
//
|
||||
HRESULT CBaseVideoRenderer::GetStdDev(
|
||||
int nSamples,
|
||||
int *piResult,
|
||||
__out int *piResult,
|
||||
LONGLONG llSumSq,
|
||||
LONGLONG iTot
|
||||
)
|
||||
@@ -2774,7 +2790,7 @@ HRESULT CBaseVideoRenderer::GetStdDev(
|
||||
// Set *piDev to the standard deviation in mSec of the sync offset
|
||||
// of each frame since streaming started.
|
||||
|
||||
STDMETHODIMP CBaseVideoRenderer::get_DevSyncOffset( int *piDev)
|
||||
STDMETHODIMP CBaseVideoRenderer::get_DevSyncOffset(__out int *piDev)
|
||||
{
|
||||
// First frames have invalid stamps, so we get no stats for them
|
||||
// So we need 2 frames to get 1 datum, so N is cFramesDrawn-1
|
||||
@@ -2788,7 +2804,7 @@ STDMETHODIMP CBaseVideoRenderer::get_DevSyncOffset( int *piDev)
|
||||
// Set *piJitter to the standard deviation in mSec of the inter-frame time
|
||||
// of frames since streaming started.
|
||||
|
||||
STDMETHODIMP CBaseVideoRenderer::get_Jitter( int *piJitter)
|
||||
STDMETHODIMP CBaseVideoRenderer::get_Jitter(__out int *piJitter)
|
||||
{
|
||||
// First frames have invalid stamps, so we get no stats for them
|
||||
// So second frame gives invalid inter-frame time
|
||||
@@ -2803,7 +2819,7 @@ STDMETHODIMP CBaseVideoRenderer::get_Jitter( int *piJitter)
|
||||
// Overidden to return our IQualProp interface
|
||||
|
||||
STDMETHODIMP
|
||||
CBaseVideoRenderer::NonDelegatingQueryInterface(REFIID riid,VOID **ppv)
|
||||
CBaseVideoRenderer::NonDelegatingQueryInterface(REFIID riid,__deref_out VOID **ppv)
|
||||
{
|
||||
// We return IQualProp and delegate everything else
|
||||
|
||||
@@ -2820,7 +2836,7 @@ CBaseVideoRenderer::NonDelegatingQueryInterface(REFIID riid,VOID **ppv)
|
||||
// the graph we can send an EC_WINDOW_DESTROYED event
|
||||
|
||||
STDMETHODIMP
|
||||
CBaseVideoRenderer::JoinFilterGraph(IFilterGraph *pGraph,LPCWSTR pName)
|
||||
CBaseVideoRenderer::JoinFilterGraph(__inout_opt IFilterGraph *pGraph, __in_opt LPCWSTR pName)
|
||||
{
|
||||
// Since we send EC_ACTIVATE, we also need to ensure
|
||||
// we send EC_WINDOW_DESTROYED or the resource manager may be
|
||||
@@ -2829,10 +2845,8 @@ CBaseVideoRenderer::JoinFilterGraph(IFilterGraph *pGraph,LPCWSTR pName)
|
||||
|
||||
// We were in a graph and now we're not
|
||||
// Do this properly in case we are aggregated
|
||||
IBaseFilter* pFilter;
|
||||
QueryInterface(IID_IBaseFilter,(void **) &pFilter);
|
||||
IBaseFilter* pFilter = this;
|
||||
NotifyEvent(EC_WINDOW_DESTROYED, (LPARAM) pFilter, 0);
|
||||
pFilter->Release();
|
||||
}
|
||||
return CBaseFilter::JoinFilterGraph(pGraph, pName);
|
||||
}
|
||||
@@ -4,7 +4,7 @@
|
||||
// Desc: DirectShow base classes - defines a generic ActiveX base renderer
|
||||
// class.
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -27,9 +27,9 @@ protected:
|
||||
|
||||
public:
|
||||
|
||||
CRendererInputPin(CBaseRenderer *pRenderer,
|
||||
HRESULT *phr,
|
||||
LPCWSTR Name);
|
||||
CRendererInputPin(__inout CBaseRenderer *pRenderer,
|
||||
__inout HRESULT *phr,
|
||||
__in_opt LPCWSTR Name);
|
||||
|
||||
// Overriden from the base pin classes
|
||||
|
||||
@@ -42,7 +42,7 @@ public:
|
||||
|
||||
// Add rendering behaviour to interface functions
|
||||
|
||||
STDMETHODIMP QueryId(LPWSTR *Id);
|
||||
STDMETHODIMP QueryId(__deref_out LPWSTR *Id);
|
||||
STDMETHODIMP EndOfStream();
|
||||
STDMETHODIMP BeginFlush();
|
||||
STDMETHODIMP EndFlush();
|
||||
@@ -97,16 +97,16 @@ protected:
|
||||
public:
|
||||
|
||||
CBaseRenderer(REFCLSID RenderClass, // CLSID for this renderer
|
||||
TCHAR *pName, // Debug ONLY description
|
||||
LPUNKNOWN pUnk, // Aggregated owner object
|
||||
HRESULT *phr); // General OLE return code
|
||||
__in_opt LPCTSTR pName, // Debug ONLY description
|
||||
__inout_opt LPUNKNOWN pUnk, // Aggregated owner object
|
||||
__inout HRESULT *phr); // General OLE return code
|
||||
|
||||
~CBaseRenderer();
|
||||
|
||||
// Overriden to say what interfaces we support and where
|
||||
|
||||
virtual HRESULT GetMediaPositionInterface(REFIID riid,void **ppv);
|
||||
STDMETHODIMP NonDelegatingQueryInterface(REFIID, void **);
|
||||
virtual HRESULT GetMediaPositionInterface(REFIID riid, __deref_out void **ppv);
|
||||
STDMETHODIMP NonDelegatingQueryInterface(REFIID, __deref_out void **);
|
||||
|
||||
virtual HRESULT SourceThreadCanWait(BOOL bCanWait);
|
||||
|
||||
@@ -145,8 +145,8 @@ public:
|
||||
STDMETHODIMP Stop();
|
||||
STDMETHODIMP Pause();
|
||||
STDMETHODIMP Run(REFERENCE_TIME StartTime);
|
||||
STDMETHODIMP GetState(DWORD dwMSecs,FILTER_STATE *State);
|
||||
STDMETHODIMP FindPin(LPCWSTR Id, IPin **ppPin);
|
||||
STDMETHODIMP GetState(DWORD dwMSecs, __out FILTER_STATE *State);
|
||||
STDMETHODIMP FindPin(LPCWSTR Id, __deref_out IPin **ppPin);
|
||||
|
||||
// These are available for a quality management implementation
|
||||
|
||||
@@ -170,12 +170,12 @@ public:
|
||||
|
||||
virtual BOOL ScheduleSample(IMediaSample *pMediaSample);
|
||||
virtual HRESULT GetSampleTimes(IMediaSample *pMediaSample,
|
||||
REFERENCE_TIME *pStartTime,
|
||||
REFERENCE_TIME *pEndTime);
|
||||
__out REFERENCE_TIME *pStartTime,
|
||||
__out REFERENCE_TIME *pEndTime);
|
||||
|
||||
virtual HRESULT ShouldDrawSampleNow(IMediaSample *pMediaSample,
|
||||
REFERENCE_TIME *ptrStart,
|
||||
REFERENCE_TIME *ptrEnd);
|
||||
__out REFERENCE_TIME *ptrStart,
|
||||
__out REFERENCE_TIME *ptrEnd);
|
||||
|
||||
// Lots of end of stream complexities
|
||||
|
||||
@@ -408,9 +408,9 @@ public:
|
||||
|
||||
|
||||
CBaseVideoRenderer(REFCLSID RenderClass, // CLSID for this renderer
|
||||
TCHAR *pName, // Debug ONLY description
|
||||
LPUNKNOWN pUnk, // Aggregated owner object
|
||||
HRESULT *phr); // General OLE return code
|
||||
__in_opt LPCTSTR pName, // Debug ONLY description
|
||||
__inout_opt LPUNKNOWN pUnk, // Aggregated owner object
|
||||
__inout HRESULT *phr); // General OLE return code
|
||||
|
||||
~CBaseVideoRenderer();
|
||||
|
||||
@@ -437,11 +437,11 @@ public:
|
||||
virtual HRESULT ResetStreamingTimes();
|
||||
BOOL ScheduleSample(IMediaSample *pMediaSample);
|
||||
HRESULT ShouldDrawSampleNow(IMediaSample *pMediaSample,
|
||||
REFERENCE_TIME *ptrStart,
|
||||
REFERENCE_TIME *ptrEnd);
|
||||
__inout REFERENCE_TIME *ptrStart,
|
||||
__inout REFERENCE_TIME *ptrEnd);
|
||||
|
||||
virtual HRESULT SendQuality(REFERENCE_TIME trLate, REFERENCE_TIME trRealStream);
|
||||
STDMETHODIMP JoinFilterGraph(IFilterGraph * pGraph, LPCWSTR pName);
|
||||
STDMETHODIMP JoinFilterGraph(__inout_opt IFilterGraph * pGraph, __in_opt LPCWSTR pName);
|
||||
|
||||
//
|
||||
// Do estimates for standard deviations for per-frame
|
||||
@@ -453,7 +453,7 @@ public:
|
||||
//
|
||||
HRESULT GetStdDev(
|
||||
int nSamples,
|
||||
int *piResult,
|
||||
__out int *piResult,
|
||||
LONGLONG llSumSq,
|
||||
LONGLONG iTot
|
||||
);
|
||||
@@ -461,17 +461,17 @@ public:
|
||||
|
||||
// IQualProp property page support
|
||||
|
||||
STDMETHODIMP get_FramesDroppedInRenderer(int *cFramesDropped);
|
||||
STDMETHODIMP get_FramesDrawn(int *pcFramesDrawn);
|
||||
STDMETHODIMP get_AvgFrameRate(int *piAvgFrameRate);
|
||||
STDMETHODIMP get_Jitter(int *piJitter);
|
||||
STDMETHODIMP get_AvgSyncOffset(int *piAvg);
|
||||
STDMETHODIMP get_DevSyncOffset(int *piDev);
|
||||
STDMETHODIMP get_FramesDroppedInRenderer(__out int *cFramesDropped);
|
||||
STDMETHODIMP get_FramesDrawn(__out int *pcFramesDrawn);
|
||||
STDMETHODIMP get_AvgFrameRate(__out int *piAvgFrameRate);
|
||||
STDMETHODIMP get_Jitter(__out int *piJitter);
|
||||
STDMETHODIMP get_AvgSyncOffset(__out int *piAvg);
|
||||
STDMETHODIMP get_DevSyncOffset(__out int *piDev);
|
||||
|
||||
// Implement an IUnknown interface and expose IQualProp
|
||||
|
||||
DECLARE_IUNKNOWN
|
||||
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid,VOID **ppv);
|
||||
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid,__deref_out VOID **ppv);
|
||||
};
|
||||
|
||||
#endif // __RENBASE__
|
||||
@@ -3,11 +3,11 @@
|
||||
//
|
||||
// Desc: DirectShow base classes.
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Copyright (c) 1996-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
#include "streams.h"
|
||||
#include <streams.h>
|
||||
|
||||
// DbgLog values (all on LOG_TIMING):
|
||||
//
|
||||
@@ -117,11 +117,8 @@ HRESULT CAMSchedule::Unadvise(DWORD_PTR dwAdviseCookie)
|
||||
CAdvisePacket * p_prev = &head;
|
||||
CAdvisePacket * p_n;
|
||||
m_Serialize.Lock();
|
||||
while (1) // The Next() method returns NULL when it hits z
|
||||
while ( p_n = p_prev->Next() ) // The Next() method returns NULL when it hits z
|
||||
{
|
||||
p_n = p_prev->Next();
|
||||
if (!p_n) break;
|
||||
|
||||
if ( p_n->m_dwAdviseCookie == dwAdviseCookie )
|
||||
{
|
||||
Delete( p_prev->RemoveNext() );
|
||||
@@ -190,7 +187,7 @@ REFERENCE_TIME CAMSchedule::Advise( const REFERENCE_TIME & rtTime )
|
||||
|
||||
/* Private methods */
|
||||
|
||||
DWORD_PTR CAMSchedule::AddAdvisePacket( CAdvisePacket * pPacket )
|
||||
DWORD_PTR CAMSchedule::AddAdvisePacket( __inout CAdvisePacket * pPacket )
|
||||
{
|
||||
ASSERT(pPacket->m_rtEventTime >= 0 && pPacket->m_rtEventTime < MAX_TIME);
|
||||
ASSERT(CritCheckIn(&m_Serialize));
|
||||
@@ -217,7 +214,7 @@ DWORD_PTR CAMSchedule::AddAdvisePacket( CAdvisePacket * pPacket )
|
||||
return Result;
|
||||
}
|
||||
|
||||
void CAMSchedule::Delete( CAdvisePacket * pPacket )
|
||||
void CAMSchedule::Delete( __inout CAdvisePacket * pPacket )
|
||||
{
|
||||
if ( m_dwCacheCount >= dwCacheMax ) delete pPacket;
|
||||
else
|
||||
@@ -3,7 +3,7 @@
|
||||
//
|
||||
// Desc: DirectShow base classes.
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Copyright (c) 1996-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -50,10 +50,10 @@ private:
|
||||
HANDLE m_hNotify; // Handle to event or semephore
|
||||
BOOL m_bPeriodic; // TRUE => Periodic event
|
||||
|
||||
CAdvisePacket( CAdvisePacket * next, LONGLONG time ) : m_next(next), m_rtEventTime(time)
|
||||
CAdvisePacket( __inout_opt CAdvisePacket * next, LONGLONG time ) : m_next(next), m_rtEventTime(time)
|
||||
{}
|
||||
|
||||
void InsertAfter( CAdvisePacket * p )
|
||||
void InsertAfter( __inout CAdvisePacket * p )
|
||||
{
|
||||
p->m_next = m_next;
|
||||
m_next = p;
|
||||
@@ -99,7 +99,7 @@ private:
|
||||
CCritSec m_Serialize;
|
||||
|
||||
// AddAdvisePacket: adds the packet, returns the cookie (0 if failed)
|
||||
DWORD_PTR AddAdvisePacket( CAdvisePacket * pPacket );
|
||||
DWORD_PTR AddAdvisePacket( __inout CAdvisePacket * pPacket );
|
||||
// Event that we should set if the packed added above will be the next to fire.
|
||||
const HANDLE m_ev;
|
||||
|
||||
@@ -113,7 +113,7 @@ private:
|
||||
DWORD m_dwCacheCount;
|
||||
enum { dwCacheMax = 5 }; // Don't bother caching more than five
|
||||
|
||||
void Delete( CAdvisePacket * pLink );// This "Delete" will cache the Link
|
||||
void Delete( __inout CAdvisePacket * pLink );// This "Delete" will cache the Link
|
||||
|
||||
// Attributes and methods for debugging
|
||||
public:
|
||||
@@ -3,11 +3,11 @@
|
||||
//
|
||||
// Desc: DirectShow base classes.
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
#include "streams.h"
|
||||
#include <streams.h>
|
||||
#include "seekpt.h"
|
||||
|
||||
//==================================================================
|
||||
@@ -17,13 +17,13 @@
|
||||
// and save it in a static variable so that forever after we can return that.
|
||||
//==================================================================
|
||||
|
||||
CUnknown * CSeekingPassThru::CreateInstance(LPUNKNOWN pUnk, HRESULT *phr)
|
||||
CUnknown * CSeekingPassThru::CreateInstance(__inout_opt LPUNKNOWN pUnk, __inout HRESULT *phr)
|
||||
{
|
||||
return new CSeekingPassThru(NAME("Seeking PassThru"),pUnk, phr);
|
||||
}
|
||||
|
||||
|
||||
STDMETHODIMP CSeekingPassThru::NonDelegatingQueryInterface(REFIID riid, void ** ppv)
|
||||
STDMETHODIMP CSeekingPassThru::NonDelegatingQueryInterface(REFIID riid, __deref_out void ** ppv)
|
||||
{
|
||||
if (riid == IID_ISeekingPassThru) {
|
||||
return GetInterface((ISeekingPassThru *) this, ppv);
|
||||
@@ -39,7 +39,7 @@ STDMETHODIMP CSeekingPassThru::NonDelegatingQueryInterface(REFIID riid, void **
|
||||
}
|
||||
|
||||
|
||||
CSeekingPassThru::CSeekingPassThru( TCHAR *pName, LPUNKNOWN pUnk, HRESULT *phr )
|
||||
CSeekingPassThru::CSeekingPassThru( __in_opt LPCTSTR pName, __inout_opt LPUNKNOWN pUnk, __inout HRESULT *phr )
|
||||
: CUnknown(pName, pUnk, phr),
|
||||
m_pPosPassThru(NULL)
|
||||
{
|
||||
Vendored
+30
@@ -0,0 +1,30 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// File: SeekPT.h
|
||||
//
|
||||
// Desc: DirectShow base classes.
|
||||
//
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
#ifndef __seekpt_h__
|
||||
#define __seekpt_h__
|
||||
|
||||
|
||||
class CSeekingPassThru : public ISeekingPassThru, public CUnknown
|
||||
{
|
||||
public:
|
||||
static CUnknown *CreateInstance(__inout_opt LPUNKNOWN pUnk, __inout HRESULT *phr);
|
||||
CSeekingPassThru(__in_opt LPCTSTR pName, __inout_opt LPUNKNOWN pUnk, __inout HRESULT *phr);
|
||||
~CSeekingPassThru();
|
||||
|
||||
DECLARE_IUNKNOWN;
|
||||
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, __deref_out void ** ppv);
|
||||
|
||||
STDMETHODIMP Init(BOOL bSupportRendering, IPin *pPin);
|
||||
|
||||
private:
|
||||
CPosPassThru *m_pPosPassThru;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -4,7 +4,7 @@
|
||||
// Desc: DirectShow base classes - implements CSource, which is a Quartz
|
||||
// source filter 'template.'
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
// the threads processing loop, when it is safe to get the filter critical
|
||||
// section from within FillBuffer().
|
||||
|
||||
#include "streams.h"
|
||||
#include <streams.h>
|
||||
|
||||
|
||||
//
|
||||
@@ -26,14 +26,14 @@
|
||||
//
|
||||
// Initialise the pin count for the filter. The user will create the pins in
|
||||
// the derived class.
|
||||
CSource::CSource(TCHAR *pName, LPUNKNOWN lpunk, CLSID clsid)
|
||||
CSource::CSource(__in_opt LPCTSTR pName, __inout_opt LPUNKNOWN lpunk, CLSID clsid)
|
||||
: CBaseFilter(pName, lpunk, &m_cStateLock, clsid),
|
||||
m_iPins(0),
|
||||
m_paStreams(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
CSource::CSource(TCHAR *pName, LPUNKNOWN lpunk, CLSID clsid, HRESULT *phr)
|
||||
CSource::CSource(__in_opt LPCTSTR pName, __inout_opt LPUNKNOWN lpunk, CLSID clsid, __inout HRESULT *phr)
|
||||
: CBaseFilter(pName, lpunk, &m_cStateLock, clsid),
|
||||
m_iPins(0),
|
||||
m_paStreams(NULL)
|
||||
@@ -42,14 +42,14 @@ CSource::CSource(TCHAR *pName, LPUNKNOWN lpunk, CLSID clsid, HRESULT *phr)
|
||||
}
|
||||
|
||||
#ifdef UNICODE
|
||||
CSource::CSource(CHAR *pName, LPUNKNOWN lpunk, CLSID clsid)
|
||||
CSource::CSource(__in_opt LPCSTR pName, __inout_opt LPUNKNOWN lpunk, CLSID clsid)
|
||||
: CBaseFilter(pName, lpunk, &m_cStateLock, clsid),
|
||||
m_iPins(0),
|
||||
m_paStreams(NULL)
|
||||
{
|
||||
}
|
||||
|
||||
CSource::CSource(CHAR *pName, LPUNKNOWN lpunk, CLSID clsid, HRESULT *phr)
|
||||
CSource::CSource(__in_opt LPCSTR pName, __inout_opt LPUNKNOWN lpunk, CLSID clsid, __inout HRESULT *phr)
|
||||
: CBaseFilter(pName, lpunk, &m_cStateLock, clsid),
|
||||
m_iPins(0),
|
||||
m_paStreams(NULL)
|
||||
@@ -76,7 +76,7 @@ CSource::~CSource()
|
||||
//
|
||||
// Add a new pin
|
||||
//
|
||||
HRESULT CSource::AddPin(CSourceStream *pStream)
|
||||
HRESULT CSource::AddPin(__in CSourceStream *pStream)
|
||||
{
|
||||
CAutoLock lock(&m_cStateLock);
|
||||
|
||||
@@ -100,7 +100,7 @@ HRESULT CSource::AddPin(CSourceStream *pStream)
|
||||
//
|
||||
// Remove a pin - pStream is NOT deleted
|
||||
//
|
||||
HRESULT CSource::RemovePin(CSourceStream *pStream)
|
||||
HRESULT CSource::RemovePin(__in CSourceStream *pStream)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < m_iPins; i++) {
|
||||
@@ -125,7 +125,7 @@ HRESULT CSource::RemovePin(CSourceStream *pStream)
|
||||
//
|
||||
// Set *ppPin to the IPin* that has the id Id.
|
||||
// or to NULL if the Id cannot be matched.
|
||||
STDMETHODIMP CSource::FindPin(LPCWSTR Id, IPin **ppPin)
|
||||
STDMETHODIMP CSource::FindPin(LPCWSTR Id, __deref_out IPin **ppPin)
|
||||
{
|
||||
CheckPointer(ppPin,E_POINTER);
|
||||
ValidateReadWritePtr(ppPin,sizeof(IPin *));
|
||||
@@ -145,7 +145,7 @@ STDMETHODIMP CSource::FindPin(LPCWSTR Id, IPin **ppPin)
|
||||
// FindPinNumber
|
||||
//
|
||||
// return the number of the pin with this IPin* or -1 if none
|
||||
int CSource::FindPinNumber(IPin *iPin) {
|
||||
int CSource::FindPinNumber(__in IPin *iPin) {
|
||||
int i;
|
||||
for (i=0; i<m_iPins; ++i) {
|
||||
if ((IPin *)(m_paStreams[i])==iPin) {
|
||||
@@ -196,7 +196,7 @@ CBasePin *CSource::GetPin(int n) {
|
||||
|
||||
//
|
||||
// Set Id to point to a CoTaskMemAlloc'd
|
||||
STDMETHODIMP CSourceStream::QueryId(LPWSTR *Id) {
|
||||
STDMETHODIMP CSourceStream::QueryId(__deref_out LPWSTR *Id) {
|
||||
CheckPointer(Id,E_POINTER);
|
||||
ValidateReadWritePtr(Id,sizeof(LPWSTR));
|
||||
|
||||
@@ -204,11 +204,11 @@ STDMETHODIMP CSourceStream::QueryId(LPWSTR *Id) {
|
||||
// FindPinNumber returns -1 for an invalid pin
|
||||
int i = 1+ m_pFilter->FindPinNumber(this);
|
||||
if (i<1) return VFW_E_NOT_FOUND;
|
||||
*Id = (LPWSTR)CoTaskMemAlloc(4*sizeof(WCHAR));
|
||||
*Id = (LPWSTR)CoTaskMemAlloc(sizeof(WCHAR) * 12);
|
||||
if (*Id==NULL) {
|
||||
return E_OUTOFMEMORY;
|
||||
}
|
||||
IntToWstr(i, *Id, 4);
|
||||
IntToWstr(i, *Id);
|
||||
return NOERROR;
|
||||
}
|
||||
|
||||
@@ -219,10 +219,10 @@ STDMETHODIMP CSourceStream::QueryId(LPWSTR *Id) {
|
||||
//
|
||||
// increments the number of pins present on the filter
|
||||
CSourceStream::CSourceStream(
|
||||
TCHAR *pObjectName,
|
||||
HRESULT *phr,
|
||||
CSource *ps,
|
||||
LPCWSTR pPinName)
|
||||
__in_opt LPCTSTR pObjectName,
|
||||
__inout HRESULT *phr,
|
||||
__inout CSource *ps,
|
||||
__in_opt LPCWSTR pPinName)
|
||||
: CBaseOutputPin(pObjectName, ps, ps->pStateLock(), phr, pPinName),
|
||||
m_pFilter(ps) {
|
||||
|
||||
@@ -231,10 +231,10 @@ CSourceStream::CSourceStream(
|
||||
|
||||
#ifdef UNICODE
|
||||
CSourceStream::CSourceStream(
|
||||
char *pObjectName,
|
||||
HRESULT *phr,
|
||||
CSource *ps,
|
||||
LPCWSTR pPinName)
|
||||
__in_opt LPCSTR pObjectName,
|
||||
__inout HRESULT *phr,
|
||||
__inout CSource *ps,
|
||||
__in_opt LPCWSTR pPinName)
|
||||
: CBaseOutputPin(pObjectName, ps, ps->pStateLock(), phr, pPinName),
|
||||
m_pFilter(ps) {
|
||||
|
||||
@@ -275,7 +275,7 @@ HRESULT CSourceStream::CheckMediaType(const CMediaType *pMediaType) {
|
||||
//
|
||||
// By default we support only one type
|
||||
// iPosition indexes are 0-n
|
||||
HRESULT CSourceStream::GetMediaType(int iPosition, CMediaType *pMediaType) {
|
||||
HRESULT CSourceStream::GetMediaType(int iPosition, __inout CMediaType *pMediaType) {
|
||||
|
||||
CAutoLock lock(m_pFilter->pStateLock());
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
// ActiveX source filters that support continuous generation of data.
|
||||
// No support is provided for IMediaControl or IMediaPosition.
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -43,11 +43,11 @@ class CSourceStream; // The class that will handle each pin
|
||||
class CSource : public CBaseFilter {
|
||||
public:
|
||||
|
||||
CSource(TCHAR *pName, LPUNKNOWN lpunk, CLSID clsid, HRESULT *phr);
|
||||
CSource(TCHAR *pName, LPUNKNOWN lpunk, CLSID clsid);
|
||||
CSource(__in_opt LPCTSTR pName, __inout_opt LPUNKNOWN lpunk, CLSID clsid, __inout HRESULT *phr);
|
||||
CSource(__in_opt LPCTSTR pName, __inout_opt LPUNKNOWN lpunk, CLSID clsid);
|
||||
#ifdef UNICODE
|
||||
CSource(CHAR *pName, LPUNKNOWN lpunk, CLSID clsid, HRESULT *phr);
|
||||
CSource(CHAR *pName, LPUNKNOWN lpunk, CLSID clsid);
|
||||
CSource(__in_opt LPCSTR pName, __inout_opt LPUNKNOWN lpunk, CLSID clsid, __inout HRESULT *phr);
|
||||
CSource(__in_opt LPCSTR pName, __inout_opt LPUNKNOWN lpunk, CLSID clsid);
|
||||
#endif
|
||||
~CSource();
|
||||
|
||||
@@ -58,15 +58,15 @@ public:
|
||||
|
||||
CCritSec* pStateLock(void) { return &m_cStateLock; } // provide our critical section
|
||||
|
||||
HRESULT AddPin(CSourceStream *);
|
||||
HRESULT RemovePin(CSourceStream *);
|
||||
HRESULT AddPin(__in CSourceStream *);
|
||||
HRESULT RemovePin(__in CSourceStream *);
|
||||
|
||||
STDMETHODIMP FindPin(
|
||||
LPCWSTR Id,
|
||||
IPin ** ppPin
|
||||
__deref_out IPin ** ppPin
|
||||
);
|
||||
|
||||
int FindPinNumber(IPin *iPin);
|
||||
int FindPinNumber(__in IPin *iPin);
|
||||
|
||||
protected:
|
||||
|
||||
@@ -88,15 +88,15 @@ protected:
|
||||
class CSourceStream : public CAMThread, public CBaseOutputPin {
|
||||
public:
|
||||
|
||||
CSourceStream(TCHAR *pObjectName,
|
||||
HRESULT *phr,
|
||||
CSource *pms,
|
||||
LPCWSTR pName);
|
||||
CSourceStream(__in_opt LPCTSTR pObjectName,
|
||||
__inout HRESULT *phr,
|
||||
__inout CSource *pms,
|
||||
__in_opt LPCWSTR pName);
|
||||
#ifdef UNICODE
|
||||
CSourceStream(CHAR *pObjectName,
|
||||
HRESULT *phr,
|
||||
CSource *pms,
|
||||
LPCWSTR pName);
|
||||
CSourceStream(__in_opt LPCSTR pObjectName,
|
||||
__inout HRESULT *phr,
|
||||
__inout CSource *pms,
|
||||
__in_opt LPCWSTR pName);
|
||||
#endif
|
||||
virtual ~CSourceStream(void); // virtual destructor ensures derived class destructors are called too.
|
||||
|
||||
@@ -155,16 +155,16 @@ protected:
|
||||
|
||||
// If you support more than one media type then override these 2 functions
|
||||
virtual HRESULT CheckMediaType(const CMediaType *pMediaType);
|
||||
virtual HRESULT GetMediaType(int iPosition, CMediaType *pMediaType); // List pos. 0-n
|
||||
virtual HRESULT GetMediaType(int iPosition, __inout CMediaType *pMediaType); // List pos. 0-n
|
||||
|
||||
// If you support only one type then override this fn.
|
||||
// This will only be called by the default implementations
|
||||
// of CheckMediaType and GetMediaType(int, CMediaType*)
|
||||
// You must override this fn. or the above 2!
|
||||
virtual HRESULT GetMediaType(CMediaType *pMediaType) {return E_UNEXPECTED;}
|
||||
virtual HRESULT GetMediaType(__inout CMediaType *pMediaType) {return E_UNEXPECTED;}
|
||||
|
||||
STDMETHODIMP QueryId(
|
||||
LPWSTR * Id
|
||||
__deref_out LPWSTR * Id
|
||||
);
|
||||
};
|
||||
|
||||
Vendored
+197
@@ -0,0 +1,197 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// File: Streams.h
|
||||
//
|
||||
// Desc: DirectShow base classes - defines overall streams architecture.
|
||||
//
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
#ifndef __STREAMS__
|
||||
#define __STREAMS__
|
||||
|
||||
#ifdef _MSC_VER
|
||||
// disable some level-4 warnings, use #pragma warning(enable:###) to re-enable
|
||||
#pragma warning(disable:4100) // warning C4100: unreferenced formal parameter
|
||||
#pragma warning(disable:4201) // warning C4201: nonstandard extension used : nameless struct/union
|
||||
#pragma warning(disable:4511) // warning C4511: copy constructor could not be generated
|
||||
#pragma warning(disable:4512) // warning C4512: assignment operator could not be generated
|
||||
#pragma warning(disable:4514) // warning C4514: "unreferenced inline function has been removed"
|
||||
|
||||
#if _MSC_VER>=1100
|
||||
#define AM_NOVTABLE __declspec(novtable)
|
||||
#else
|
||||
#define AM_NOVTABLE
|
||||
#endif
|
||||
#endif // MSC_VER
|
||||
|
||||
|
||||
// Because of differences between Visual C++ and older Microsoft SDKs,
|
||||
// you may have defined _DEBUG without defining DEBUG. This logic
|
||||
// ensures that both will be set if Visual C++ sets _DEBUG.
|
||||
#ifdef _DEBUG
|
||||
#ifndef DEBUG
|
||||
#define DEBUG
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
#include <windows.h>
|
||||
#include <windowsx.h>
|
||||
#include <olectl.h>
|
||||
#include <ddraw.h>
|
||||
#include <mmsystem.h>
|
||||
|
||||
|
||||
#ifndef NUMELMS
|
||||
#if _WIN32_WINNT < 0x0600
|
||||
#define NUMELMS(aa) (sizeof(aa)/sizeof((aa)[0]))
|
||||
#else
|
||||
#define NUMELMS(aa) ARRAYSIZE(aa)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// The following definitions come from the Platform SDK and are required if
|
||||
// the applicaiton is being compiled with the headers from Visual C++ 6.0.
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
#ifndef InterlockedExchangePointer
|
||||
#define InterlockedExchangePointer(Target, Value) \
|
||||
(PVOID)InterlockedExchange((PLONG)(Target), (LONG)(Value))
|
||||
#endif
|
||||
|
||||
#ifndef _WAVEFORMATEXTENSIBLE_
|
||||
#define _WAVEFORMATEXTENSIBLE_
|
||||
typedef struct {
|
||||
WAVEFORMATEX Format;
|
||||
union {
|
||||
WORD wValidBitsPerSample; /* bits of precision */
|
||||
WORD wSamplesPerBlock; /* valid if wBitsPerSample==0 */
|
||||
WORD wReserved; /* If neither applies, set to zero. */
|
||||
} Samples;
|
||||
DWORD dwChannelMask; /* which channels are */
|
||||
/* present in stream */
|
||||
GUID SubFormat;
|
||||
} WAVEFORMATEXTENSIBLE, *PWAVEFORMATEXTENSIBLE;
|
||||
#endif // !_WAVEFORMATEXTENSIBLE_
|
||||
|
||||
#if !defined(WAVE_FORMAT_EXTENSIBLE)
|
||||
#define WAVE_FORMAT_EXTENSIBLE 0xFFFE
|
||||
#endif // !defined(WAVE_FORMAT_EXTENSIBLE)
|
||||
|
||||
#ifndef GetWindowLongPtr
|
||||
#define GetWindowLongPtrA GetWindowLongA
|
||||
#define GetWindowLongPtrW GetWindowLongW
|
||||
#ifdef UNICODE
|
||||
#define GetWindowLongPtr GetWindowLongPtrW
|
||||
#else
|
||||
#define GetWindowLongPtr GetWindowLongPtrA
|
||||
#endif // !UNICODE
|
||||
#endif // !GetWindowLongPtr
|
||||
|
||||
#ifndef SetWindowLongPtr
|
||||
#define SetWindowLongPtrA SetWindowLongA
|
||||
#define SetWindowLongPtrW SetWindowLongW
|
||||
#ifdef UNICODE
|
||||
#define SetWindowLongPtr SetWindowLongPtrW
|
||||
#else
|
||||
#define SetWindowLongPtr SetWindowLongPtrA
|
||||
#endif // !UNICODE
|
||||
#endif // !SetWindowLongPtr
|
||||
|
||||
#ifndef GWLP_WNDPROC
|
||||
#define GWLP_WNDPROC (-4)
|
||||
#endif
|
||||
#ifndef GWLP_HINSTANCE
|
||||
#define GWLP_HINSTANCE (-6)
|
||||
#endif
|
||||
#ifndef GWLP_HWNDPARENT
|
||||
#define GWLP_HWNDPARENT (-8)
|
||||
#endif
|
||||
#ifndef GWLP_USERDATA
|
||||
#define GWLP_USERDATA (-21)
|
||||
#endif
|
||||
#ifndef GWLP_ID
|
||||
#define GWLP_ID (-12)
|
||||
#endif
|
||||
#ifndef DWLP_MSGRESULT
|
||||
#define DWLP_MSGRESULT 0
|
||||
#endif
|
||||
#ifndef DWLP_DLGPROC
|
||||
#define DWLP_DLGPROC DWLP_MSGRESULT + sizeof(LRESULT)
|
||||
#endif
|
||||
#ifndef DWLP_USER
|
||||
#define DWLP_USER DWLP_DLGPROC + sizeof(DLGPROC)
|
||||
#endif
|
||||
|
||||
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable: 4312 4244)
|
||||
// _GetWindowLongPtr
|
||||
// Templated version of GetWindowLongPtr, to suppress spurious compiler warning.
|
||||
template <class T>
|
||||
T _GetWindowLongPtr(HWND hwnd, int nIndex)
|
||||
{
|
||||
return (T)GetWindowLongPtr(hwnd, nIndex);
|
||||
}
|
||||
|
||||
// _SetWindowLongPtr
|
||||
// Templated version of SetWindowLongPtr, to suppress spurious compiler warning.
|
||||
template <class T>
|
||||
LONG_PTR _SetWindowLongPtr(HWND hwnd, int nIndex, T p)
|
||||
{
|
||||
return SetWindowLongPtr(hwnd, nIndex, (LONG_PTR)p);
|
||||
}
|
||||
#pragma warning(pop)
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
// End Platform SDK definitions
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
#include <strmif.h> // Generated IDL header file for streams interfaces
|
||||
#include <intsafe.h> // required by amvideo.h
|
||||
|
||||
#include <reftime.h> // Helper class for REFERENCE_TIME management
|
||||
#include <wxdebug.h> // Debug support for logging and ASSERTs
|
||||
#include <amvideo.h> // ActiveMovie video interfaces and definitions
|
||||
//include amaudio.h explicitly if you need it. it requires the DX SDK.
|
||||
//#include <amaudio.h> // ActiveMovie audio interfaces and definitions
|
||||
#include <wxutil.h> // General helper classes for threads etc
|
||||
#include <combase.h> // Base COM classes to support IUnknown
|
||||
#include <measure.h> // Performance measurement
|
||||
#include <comlite.h> // Light weight com function prototypes
|
||||
|
||||
#include <cache.h> // Simple cache container class
|
||||
#include <wxlist.h> // Non MFC generic list class
|
||||
#include <msgthrd.h> // CMsgThread
|
||||
#include <mtype.h> // Helper class for managing media types
|
||||
#include <fourcc.h> // conversions between FOURCCs and GUIDs
|
||||
#include <control.h> // generated from control.odl
|
||||
#include <ctlutil.h> // control interface utility classes
|
||||
#include <evcode.h> // event code definitions
|
||||
#include <amfilter.h> // Main streams architecture class hierachy
|
||||
#include <transfrm.h> // Generic transform filter
|
||||
#include <transip.h> // Generic transform-in-place filter
|
||||
#include <uuids.h> // declaration of type GUIDs and well-known clsids
|
||||
#include <source.h> // Generic source filter
|
||||
#include <outputq.h> // Output pin queueing
|
||||
#include <errors.h> // HRESULT status and error definitions
|
||||
#include <renbase.h> // Base class for writing ActiveX renderers
|
||||
#include <refclock.h> // Base clock class
|
||||
#include <sysclock.h> // System clock
|
||||
#include <pstream.h> // IPersistStream helper class
|
||||
#include <vtrans.h> // Video Transform Filter base class
|
||||
#include <amextra.h>
|
||||
#include <strmctl.h> // IAMStreamControl support
|
||||
#include <edevdefs.h> // External device control interface defines
|
||||
#include <audevcod.h> // audio filter device error event codes
|
||||
|
||||
|
||||
|
||||
#else
|
||||
#ifdef DEBUG
|
||||
#pragma message("STREAMS.H included TWICE")
|
||||
#endif
|
||||
#endif // __STREAMS__
|
||||
|
||||
@@ -3,18 +3,19 @@
|
||||
//
|
||||
// Desc: DirectShow base classes.
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Copyright (c) 1996-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
#include "streams.h"
|
||||
#include "strmctl.h"
|
||||
#include <streams.h>
|
||||
#include <strmctl.h>
|
||||
|
||||
CBaseStreamControl::CBaseStreamControl()
|
||||
CBaseStreamControl::CBaseStreamControl(__inout HRESULT *phr)
|
||||
: m_StreamState(STREAM_FLOWING)
|
||||
, m_StreamStateOnStop(STREAM_FLOWING) // means no pending stop
|
||||
, m_tStartTime(MAX_TIME)
|
||||
, m_tStopTime(MAX_TIME)
|
||||
, m_StreamEvent(FALSE, phr)
|
||||
, m_dwStartCookie(0)
|
||||
, m_dwStopCookie(0)
|
||||
, m_pRefClock(NULL)
|
||||
@@ -120,7 +121,7 @@ STDMETHODIMP CBaseStreamControl::StartAt
|
||||
}
|
||||
|
||||
// Retrieve information about current settings
|
||||
STDMETHODIMP CBaseStreamControl::GetInfo(AM_STREAM_INFO *pInfo)
|
||||
STDMETHODIMP CBaseStreamControl::GetInfo(__out AM_STREAM_INFO *pInfo)
|
||||
{
|
||||
if (pInfo == NULL)
|
||||
return E_POINTER;
|
||||
@@ -231,7 +232,7 @@ void CBaseStreamControl::CancelStart()
|
||||
|
||||
|
||||
enum CBaseStreamControl::StreamControlState CBaseStreamControl::CheckSampleTimes
|
||||
( const REFERENCE_TIME * pSampleStart, const REFERENCE_TIME * pSampleStop )
|
||||
( __in const REFERENCE_TIME * pSampleStart, __in const REFERENCE_TIME * pSampleStop )
|
||||
{
|
||||
CAutoLock lck(&m_CritSec);
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
//
|
||||
// Desc: DirectShow base classes.
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Copyright (c) 1996-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -71,15 +71,15 @@ private:
|
||||
// expires, throw the sample away. If the event
|
||||
// fires, call me back - I've changed my mind.
|
||||
//
|
||||
enum StreamControlState CheckSampleTimes( const REFERENCE_TIME * pSampleStart,
|
||||
const REFERENCE_TIME * pSampleStop );
|
||||
enum StreamControlState CheckSampleTimes( __in const REFERENCE_TIME * pSampleStart,
|
||||
__in const REFERENCE_TIME * pSampleStop );
|
||||
|
||||
public:
|
||||
// You don't have to tell us much when we're created, but there are other
|
||||
// obligations that must be met. See SetSyncSource & NotifyFilterState
|
||||
// below.
|
||||
//
|
||||
CBaseStreamControl();
|
||||
CBaseStreamControl(__inout_opt HRESULT *phr = NULL);
|
||||
~CBaseStreamControl();
|
||||
|
||||
// If you want this class to work properly, there are thing you need to
|
||||
@@ -134,7 +134,7 @@ public:
|
||||
DWORD dwCookie = 0 );
|
||||
STDMETHODIMP StartAt( const REFERENCE_TIME * ptStart = NULL,
|
||||
DWORD dwCookie = 0 );
|
||||
STDMETHODIMP GetInfo( AM_STREAM_INFO *pInfo);
|
||||
STDMETHODIMP GetInfo( __out AM_STREAM_INFO *pInfo);
|
||||
|
||||
// Helper function for pin's receive method. Call this with
|
||||
// the sample and we'll tell you what to do with it. We'll do a
|
||||
@@ -4,11 +4,11 @@
|
||||
// Desc: DirectShow base classes - implements a system clock based on
|
||||
// IReferenceClock.
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
#include "streams.h"
|
||||
#include <streams.h>
|
||||
#include <limits.h>
|
||||
|
||||
|
||||
@@ -27,20 +27,20 @@ int g_cTemplates = sizeof(g_Templates) / sizeof(g_Templates[0]);
|
||||
#endif
|
||||
|
||||
/* This goes in the factory template table to create new instances */
|
||||
CUnknown * WINAPI CSystemClock::CreateInstance(LPUNKNOWN pUnk,HRESULT *phr)
|
||||
CUnknown * WINAPI CSystemClock::CreateInstance(__inout_opt LPUNKNOWN pUnk, __inout HRESULT *phr)
|
||||
{
|
||||
return new CSystemClock(NAME("System reference clock"),pUnk, phr);
|
||||
}
|
||||
|
||||
|
||||
CSystemClock::CSystemClock(TCHAR *pName,LPUNKNOWN pUnk,HRESULT *phr) :
|
||||
CSystemClock::CSystemClock(__in_opt LPCTSTR pName, __inout_opt LPUNKNOWN pUnk, __inout HRESULT *phr) :
|
||||
CBaseReferenceClock(pName, pUnk, phr)
|
||||
{
|
||||
}
|
||||
|
||||
STDMETHODIMP CSystemClock::NonDelegatingQueryInterface(
|
||||
REFIID riid,
|
||||
void ** ppv)
|
||||
__deref_out void ** ppv)
|
||||
{
|
||||
if (riid == IID_IPersist)
|
||||
{
|
||||
@@ -58,7 +58,7 @@ STDMETHODIMP CSystemClock::NonDelegatingQueryInterface(
|
||||
|
||||
/* Return the clock's clsid */
|
||||
STDMETHODIMP
|
||||
CSystemClock::GetClassID(CLSID *pClsID)
|
||||
CSystemClock::GetClassID(__out CLSID *pClsID)
|
||||
{
|
||||
CheckPointer(pClsID,E_POINTER);
|
||||
ValidateReadWritePtr(pClsID,sizeof(CLSID));
|
||||
Vendored
+39
@@ -0,0 +1,39 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// File: SysClock.h
|
||||
//
|
||||
// Desc: DirectShow base classes - defines a system clock implementation of
|
||||
// IReferenceClock.
|
||||
//
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
#ifndef __SYSTEMCLOCK__
|
||||
#define __SYSTEMCLOCK__
|
||||
|
||||
//
|
||||
// Base clock. Uses timeGetTime ONLY
|
||||
// Uses most of the code in the base reference clock.
|
||||
// Provides GetTime
|
||||
//
|
||||
|
||||
class CSystemClock : public CBaseReferenceClock, public IAMClockAdjust, public IPersist
|
||||
{
|
||||
public:
|
||||
// We must be able to create an instance of ourselves
|
||||
static CUnknown * WINAPI CreateInstance(__inout_opt LPUNKNOWN pUnk, __inout HRESULT *phr);
|
||||
CSystemClock(__in_opt LPCTSTR pName, __inout_opt LPUNKNOWN pUnk, __inout HRESULT *phr);
|
||||
|
||||
DECLARE_IUNKNOWN
|
||||
|
||||
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, __deref_out void ** ppv);
|
||||
|
||||
// Yield up our class id so that we can be persisted
|
||||
// Implement required Ipersist method
|
||||
STDMETHODIMP GetClassID(__out CLSID *pClsID);
|
||||
|
||||
// IAMClockAdjust methods
|
||||
STDMETHODIMP SetClockDelta(REFERENCE_TIME rtDelta);
|
||||
}; //CSystemClock
|
||||
|
||||
#endif /* __SYSTEMCLOCK__ */
|
||||
+29
-29
@@ -4,20 +4,20 @@
|
||||
// Desc: DirectShow base classes - implements class for simple transform
|
||||
// filters such as video decompressors.
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
#include "streams.h"
|
||||
#include "measure.h"
|
||||
#include <streams.h>
|
||||
#include <measure.h>
|
||||
|
||||
|
||||
// =================================================================
|
||||
// Implements the CTransformFilter class
|
||||
// =================================================================
|
||||
|
||||
CTransformFilter::CTransformFilter(TCHAR *pName,
|
||||
LPUNKNOWN pUnk,
|
||||
CTransformFilter::CTransformFilter(__in_opt LPCTSTR pName,
|
||||
__inout_opt LPUNKNOWN pUnk,
|
||||
REFCLSID clsid) :
|
||||
CBaseFilter(pName,pUnk,&m_csFilter, clsid),
|
||||
m_pInput(NULL),
|
||||
@@ -32,8 +32,8 @@ CTransformFilter::CTransformFilter(TCHAR *pName,
|
||||
}
|
||||
|
||||
#ifdef UNICODE
|
||||
CTransformFilter::CTransformFilter(char *pName,
|
||||
LPUNKNOWN pUnk,
|
||||
CTransformFilter::CTransformFilter(__in_opt LPCSTR pName,
|
||||
__inout_opt LPUNKNOWN pUnk,
|
||||
REFCLSID clsid) :
|
||||
CBaseFilter(pName,pUnk,&m_csFilter, clsid),
|
||||
m_pInput(NULL),
|
||||
@@ -140,7 +140,7 @@ CTransformFilter::GetPin(int n)
|
||||
// If Id is In or Out then return the IPin* for that pin
|
||||
// creating the pin if need be. Otherwise return NULL with an error.
|
||||
|
||||
STDMETHODIMP CTransformFilter::FindPin(LPCWSTR Id, IPin **ppPin)
|
||||
STDMETHODIMP CTransformFilter::FindPin(LPCWSTR Id, __deref_out IPin **ppPin)
|
||||
{
|
||||
CheckPointer(ppPin,E_POINTER);
|
||||
ValidateReadWritePtr(ppPin,sizeof(IPin *));
|
||||
@@ -185,7 +185,7 @@ CTransformFilter::StopStreaming()
|
||||
// override this to grab extra interfaces on connection
|
||||
|
||||
HRESULT
|
||||
CTransformFilter::CheckConnect(PIN_DIRECTION dir,IPin *pPin)
|
||||
CTransformFilter::CheckConnect(PIN_DIRECTION dir, IPin *pPin)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(dir);
|
||||
UNREFERENCED_PARAMETER(pPin);
|
||||
@@ -227,7 +227,7 @@ CTransformFilter::SetMediaType(PIN_DIRECTION direction,const CMediaType *pmt)
|
||||
|
||||
// Set up our output sample
|
||||
HRESULT
|
||||
CTransformFilter::InitializeOutputSample(IMediaSample *pSample, IMediaSample **ppOutSample)
|
||||
CTransformFilter::InitializeOutputSample(IMediaSample *pSample, __deref_out IMediaSample **ppOutSample)
|
||||
{
|
||||
IMediaSample *pOutSample;
|
||||
|
||||
@@ -578,10 +578,10 @@ CTransformInputPin::CheckStreaming()
|
||||
// constructor
|
||||
|
||||
CTransformInputPin::CTransformInputPin(
|
||||
TCHAR *pObjectName,
|
||||
CTransformFilter *pTransformFilter,
|
||||
HRESULT * phr,
|
||||
LPCWSTR pName)
|
||||
__in_opt LPCTSTR pObjectName,
|
||||
__inout CTransformFilter *pTransformFilter,
|
||||
__inout HRESULT * phr,
|
||||
__in_opt LPCWSTR pName)
|
||||
: CBaseInputPin(pObjectName, pTransformFilter, &pTransformFilter->m_csFilter, phr, pName)
|
||||
{
|
||||
DbgLog((LOG_TRACE,2,TEXT("CTransformInputPin::CTransformInputPin")));
|
||||
@@ -590,10 +590,10 @@ CTransformInputPin::CTransformInputPin(
|
||||
|
||||
#ifdef UNICODE
|
||||
CTransformInputPin::CTransformInputPin(
|
||||
CHAR *pObjectName,
|
||||
CTransformFilter *pTransformFilter,
|
||||
HRESULT * phr,
|
||||
LPCWSTR pName)
|
||||
__in_opt LPCSTR pObjectName,
|
||||
__inout CTransformFilter *pTransformFilter,
|
||||
__inout HRESULT * phr,
|
||||
__in_opt LPCWSTR pName)
|
||||
: CBaseInputPin(pObjectName, pTransformFilter, &pTransformFilter->m_csFilter, phr, pName)
|
||||
{
|
||||
DbgLog((LOG_TRACE,2,TEXT("CTransformInputPin::CTransformInputPin")));
|
||||
@@ -791,10 +791,10 @@ CTransformInputPin::NewSegment(
|
||||
// constructor
|
||||
|
||||
CTransformOutputPin::CTransformOutputPin(
|
||||
TCHAR *pObjectName,
|
||||
CTransformFilter *pTransformFilter,
|
||||
HRESULT * phr,
|
||||
LPCWSTR pPinName)
|
||||
__in_opt LPCTSTR pObjectName,
|
||||
__inout CTransformFilter *pTransformFilter,
|
||||
__inout HRESULT * phr,
|
||||
__in_opt LPCWSTR pPinName)
|
||||
: CBaseOutputPin(pObjectName, pTransformFilter, &pTransformFilter->m_csFilter, phr, pPinName),
|
||||
m_pPosition(NULL)
|
||||
{
|
||||
@@ -805,10 +805,10 @@ CTransformOutputPin::CTransformOutputPin(
|
||||
|
||||
#ifdef UNICODE
|
||||
CTransformOutputPin::CTransformOutputPin(
|
||||
CHAR *pObjectName,
|
||||
CTransformFilter *pTransformFilter,
|
||||
HRESULT * phr,
|
||||
LPCWSTR pPinName)
|
||||
__in_opt LPCSTR pObjectName,
|
||||
__inout CTransformFilter *pTransformFilter,
|
||||
__inout HRESULT * phr,
|
||||
__in_opt LPCWSTR pPinName)
|
||||
: CBaseOutputPin(pObjectName, pTransformFilter, &pTransformFilter->m_csFilter, phr, pPinName),
|
||||
m_pPosition(NULL)
|
||||
{
|
||||
@@ -831,7 +831,7 @@ CTransformOutputPin::~CTransformOutputPin()
|
||||
// overriden to expose IMediaPosition and IMediaSeeking control interfaces
|
||||
|
||||
STDMETHODIMP
|
||||
CTransformOutputPin::NonDelegatingQueryInterface(REFIID riid, void **ppv)
|
||||
CTransformOutputPin::NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv)
|
||||
{
|
||||
CheckPointer(ppv,E_POINTER);
|
||||
ValidateReadWritePtr(ppv,sizeof(PVOID));
|
||||
@@ -958,7 +958,7 @@ CTransformOutputPin::SetMediaType(const CMediaType* pmtOut)
|
||||
HRESULT
|
||||
CTransformOutputPin::DecideBufferSize(
|
||||
IMemAllocator * pAllocator,
|
||||
ALLOCATOR_PROPERTIES* pProp)
|
||||
__inout ALLOCATOR_PROPERTIES* pProp)
|
||||
{
|
||||
return m_pTransformFilter->DecideBufferSize(pAllocator, pProp);
|
||||
}
|
||||
@@ -970,7 +970,7 @@ CTransformOutputPin::DecideBufferSize(
|
||||
HRESULT
|
||||
CTransformOutputPin::GetMediaType(
|
||||
int iPosition,
|
||||
CMediaType *pMediaType)
|
||||
__inout CMediaType *pMediaType)
|
||||
{
|
||||
ASSERT(m_pTransformFilter->m_pInput != NULL);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
// Desc: DirectShow base classes - defines classes from which simple
|
||||
// transform codecs may be derived.
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -41,19 +41,19 @@ protected:
|
||||
public:
|
||||
|
||||
CTransformInputPin(
|
||||
TCHAR *pObjectName,
|
||||
CTransformFilter *pTransformFilter,
|
||||
HRESULT * phr,
|
||||
LPCWSTR pName);
|
||||
__in_opt LPCTSTR pObjectName,
|
||||
__inout CTransformFilter *pTransformFilter,
|
||||
__inout HRESULT * phr,
|
||||
__in_opt LPCWSTR pName);
|
||||
#ifdef UNICODE
|
||||
CTransformInputPin(
|
||||
char *pObjectName,
|
||||
CTransformFilter *pTransformFilter,
|
||||
HRESULT * phr,
|
||||
LPCWSTR pName);
|
||||
__in_opt LPCSTR pObjectName,
|
||||
__inout CTransformFilter *pTransformFilter,
|
||||
__inout HRESULT * phr,
|
||||
__in_opt LPCWSTR pName);
|
||||
#endif
|
||||
|
||||
STDMETHODIMP QueryId(LPWSTR * Id)
|
||||
STDMETHODIMP QueryId(__deref_out LPWSTR * Id)
|
||||
{
|
||||
return AMGetWideString(L"In", Id);
|
||||
}
|
||||
@@ -118,25 +118,25 @@ public:
|
||||
IUnknown * m_pPosition;
|
||||
|
||||
CTransformOutputPin(
|
||||
TCHAR *pObjectName,
|
||||
CTransformFilter *pTransformFilter,
|
||||
HRESULT * phr,
|
||||
LPCWSTR pName);
|
||||
__in_opt LPCTSTR pObjectName,
|
||||
__inout CTransformFilter *pTransformFilter,
|
||||
__inout HRESULT * phr,
|
||||
__in_opt LPCWSTR pName);
|
||||
#ifdef UNICODE
|
||||
CTransformOutputPin(
|
||||
CHAR *pObjectName,
|
||||
CTransformFilter *pTransformFilter,
|
||||
HRESULT * phr,
|
||||
LPCWSTR pName);
|
||||
__in_opt LPCSTR pObjectName,
|
||||
__inout CTransformFilter *pTransformFilter,
|
||||
__inout HRESULT * phr,
|
||||
__in_opt LPCWSTR pName);
|
||||
#endif
|
||||
~CTransformOutputPin();
|
||||
|
||||
// override to expose IMediaPosition
|
||||
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv);
|
||||
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, __deref_out void **ppv);
|
||||
|
||||
// --- CBaseOutputPin ------------
|
||||
|
||||
STDMETHODIMP QueryId(LPWSTR * Id)
|
||||
STDMETHODIMP QueryId(__deref_out LPWSTR * Id)
|
||||
{
|
||||
return AMGetWideString(L"Out", Id);
|
||||
}
|
||||
@@ -157,10 +157,10 @@ public:
|
||||
// the count and size of buffers we need.
|
||||
HRESULT DecideBufferSize(
|
||||
IMemAllocator * pAlloc,
|
||||
ALLOCATOR_PROPERTIES *pProp);
|
||||
__inout ALLOCATOR_PROPERTIES *pProp);
|
||||
|
||||
// returns the preferred formats for a pin
|
||||
HRESULT GetMediaType(int iPosition,CMediaType *pMediaType);
|
||||
HRESULT GetMediaType(int iPosition, __inout CMediaType *pMediaType);
|
||||
|
||||
// inherited from IQualityControl via CBasePin
|
||||
STDMETHODIMP Notify(IBaseFilter * pSender, Quality q);
|
||||
@@ -181,7 +181,7 @@ public:
|
||||
|
||||
virtual int GetPinCount();
|
||||
virtual CBasePin * GetPin(int n);
|
||||
STDMETHODIMP FindPin(LPCWSTR Id, IPin **ppPin);
|
||||
STDMETHODIMP FindPin(LPCWSTR Id, __deref_out IPin **ppPin);
|
||||
|
||||
// override state changes to allow derived transform filter
|
||||
// to control streaming start/stop
|
||||
@@ -190,9 +190,9 @@ public:
|
||||
|
||||
public:
|
||||
|
||||
CTransformFilter(TCHAR *, LPUNKNOWN, REFCLSID clsid);
|
||||
CTransformFilter(__in_opt LPCTSTR , __inout_opt LPUNKNOWN, REFCLSID clsid);
|
||||
#ifdef UNICODE
|
||||
CTransformFilter(CHAR *, LPUNKNOWN, REFCLSID clsid);
|
||||
CTransformFilter(__in_opt LPCSTR , __inout_opt LPUNKNOWN, REFCLSID clsid);
|
||||
#endif
|
||||
~CTransformFilter();
|
||||
|
||||
@@ -211,15 +211,15 @@ public:
|
||||
virtual HRESULT CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut) PURE;
|
||||
|
||||
// this goes in the factory template table to create new instances
|
||||
// static CCOMObject * CreateInstance(LPUNKNOWN, HRESULT *);
|
||||
// static CCOMObject * CreateInstance(__inout_opt LPUNKNOWN, HRESULT *);
|
||||
|
||||
// call the SetProperties function with appropriate arguments
|
||||
virtual HRESULT DecideBufferSize(
|
||||
IMemAllocator * pAllocator,
|
||||
ALLOCATOR_PROPERTIES *pprop) PURE;
|
||||
__inout ALLOCATOR_PROPERTIES *pprop) PURE;
|
||||
|
||||
// override to suggest OUTPUT pin media types
|
||||
virtual HRESULT GetMediaType(int iPosition, CMediaType *pMediaType) PURE;
|
||||
virtual HRESULT GetMediaType(int iPosition, __inout CMediaType *pMediaType) PURE;
|
||||
|
||||
|
||||
|
||||
@@ -246,7 +246,7 @@ public:
|
||||
virtual HRESULT Receive(IMediaSample *pSample);
|
||||
|
||||
// Standard setup for output sample
|
||||
HRESULT InitializeOutputSample(IMediaSample *pSample, IMediaSample **ppOutSample);
|
||||
HRESULT InitializeOutputSample(IMediaSample *pSample, __deref_out IMediaSample **ppOutSample);
|
||||
|
||||
// if you override Receive, you may need to override these three too
|
||||
virtual HRESULT EndOfStream(void);
|
||||
@@ -4,7 +4,7 @@
|
||||
// Desc: DirectShow base classes - implements class for simple Transform-
|
||||
// In-Place filters such as audio.
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -251,9 +251,9 @@
|
||||
// And that's IT!! Any further (essentially spurious) reconnects peter out
|
||||
// with no change in the chain.
|
||||
|
||||
#include "streams.h"
|
||||
#include "measure.h"
|
||||
#include "transip.h"
|
||||
#include <streams.h>
|
||||
#include <measure.h>
|
||||
#include <transip.h>
|
||||
|
||||
|
||||
// =================================================================
|
||||
@@ -261,10 +261,10 @@
|
||||
// =================================================================
|
||||
|
||||
CTransInPlaceFilter::CTransInPlaceFilter
|
||||
( TCHAR *pName,
|
||||
LPUNKNOWN pUnk,
|
||||
( __in_opt LPCTSTR pName,
|
||||
__inout_opt LPUNKNOWN pUnk,
|
||||
REFCLSID clsid,
|
||||
HRESULT *phr,
|
||||
__inout HRESULT *phr,
|
||||
bool bModifiesData
|
||||
)
|
||||
: CTransformFilter(pName, pUnk, clsid),
|
||||
@@ -278,10 +278,10 @@ CTransInPlaceFilter::CTransInPlaceFilter
|
||||
|
||||
#ifdef UNICODE
|
||||
CTransInPlaceFilter::CTransInPlaceFilter
|
||||
( CHAR *pName,
|
||||
LPUNKNOWN pUnk,
|
||||
( __in_opt LPCSTR pName,
|
||||
__inout_opt LPUNKNOWN pUnk,
|
||||
REFCLSID clsid,
|
||||
HRESULT *phr,
|
||||
__inout HRESULT *phr,
|
||||
bool bModifiesData
|
||||
)
|
||||
: CTransformFilter(pName, pUnk, clsid),
|
||||
@@ -359,7 +359,7 @@ CTransInPlaceFilter::GetPin(int n)
|
||||
|
||||
// dir is the direction of our pin.
|
||||
// pReceivePin is the pin we are connecting to.
|
||||
HRESULT CTransInPlaceFilter::CompleteConnect(PIN_DIRECTION dir,IPin *pReceivePin)
|
||||
HRESULT CTransInPlaceFilter::CompleteConnect(PIN_DIRECTION dir, IPin *pReceivePin)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(pReceivePin);
|
||||
ASSERT(m_pInput);
|
||||
@@ -414,7 +414,7 @@ HRESULT CTransInPlaceFilter::CompleteConnect(PIN_DIRECTION dir,IPin *pReceivePin
|
||||
|
||||
HRESULT CTransInPlaceFilter::DecideBufferSize
|
||||
( IMemAllocator *pAlloc
|
||||
, ALLOCATOR_PROPERTIES *pProperties
|
||||
, __inout ALLOCATOR_PROPERTIES *pProperties
|
||||
)
|
||||
{
|
||||
ALLOCATOR_PROPERTIES Request, Actual;
|
||||
@@ -431,8 +431,8 @@ HRESULT CTransInPlaceFilter::DecideBufferSize
|
||||
return hr;
|
||||
}
|
||||
} else {
|
||||
// We're reduced to blind guessing. Let's guess one byte and if
|
||||
// this isn't enough then when the other pin does get connected
|
||||
// Propose one byte
|
||||
// If this isn't enough then when the other pin does get connected
|
||||
// we can revise it.
|
||||
ZeroMemory(&Request, sizeof(Request));
|
||||
Request.cBuffers = 1;
|
||||
@@ -479,7 +479,7 @@ HRESULT CTransInPlaceFilter::DecideBufferSize
|
||||
// Copy
|
||||
//
|
||||
// return a pointer to an identical copy of pSample
|
||||
IMediaSample * CTransInPlaceFilter::Copy(IMediaSample *pSource)
|
||||
__out_opt IMediaSample * CTransInPlaceFilter::Copy(IMediaSample *pSource)
|
||||
{
|
||||
IMediaSample * pDest;
|
||||
|
||||
@@ -502,11 +502,11 @@ IMediaSample * CTransInPlaceFilter::Copy(IMediaSample *pSource)
|
||||
ASSERT(pDest);
|
||||
IMediaSample2 *pSample2;
|
||||
if (SUCCEEDED(pDest->QueryInterface(IID_IMediaSample2, (void **)&pSample2))) {
|
||||
HRESULT hr = pSample2->SetProperties(
|
||||
HRESULT hrProps = pSample2->SetProperties(
|
||||
FIELD_OFFSET(AM_SAMPLE2_PROPERTIES, pbBuffer),
|
||||
(PBYTE)m_pInput->SampleProps());
|
||||
pSample2->Release();
|
||||
if (FAILED(hr)) {
|
||||
if (FAILED(hrProps)) {
|
||||
pDest->Release();
|
||||
return NULL;
|
||||
}
|
||||
@@ -545,7 +545,10 @@ IMediaSample * CTransInPlaceFilter::Copy(IMediaSample *pSource)
|
||||
// Copy the actual data length and the actual data.
|
||||
{
|
||||
const long lDataLength = pSource->GetActualDataLength();
|
||||
pDest->SetActualDataLength(lDataLength);
|
||||
if (FAILED(pDest->SetActualDataLength(lDataLength))) {
|
||||
pDest->Release();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// Copy the sample data
|
||||
{
|
||||
@@ -555,8 +558,13 @@ IMediaSample * CTransInPlaceFilter::Copy(IMediaSample *pSource)
|
||||
|
||||
ASSERT(lDestSize >= lSourceSize && lDestSize >= lDataLength);
|
||||
|
||||
pSource->GetPointer(&pSourceBuffer);
|
||||
pDest->GetPointer(&pDestBuffer);
|
||||
if (FAILED(pSource->GetPointer(&pSourceBuffer)) ||
|
||||
FAILED(pDest->GetPointer(&pDestBuffer)) ||
|
||||
lDestSize < lDataLength ||
|
||||
lDataLength < 0) {
|
||||
pDest->Release();
|
||||
return NULL;
|
||||
}
|
||||
ASSERT(lDestSize == 0 || pSourceBuffer != NULL && pDestBuffer != NULL);
|
||||
|
||||
CopyMemory( (PVOID) pDestBuffer, (PVOID) pSourceBuffer, lDataLength );
|
||||
@@ -651,10 +659,10 @@ CTransInPlaceFilter::Receive(IMediaSample *pSample)
|
||||
// constructor
|
||||
|
||||
CTransInPlaceInputPin::CTransInPlaceInputPin
|
||||
( TCHAR *pObjectName
|
||||
, CTransInPlaceFilter *pFilter
|
||||
, HRESULT *phr
|
||||
, LPCWSTR pName
|
||||
( __in_opt LPCTSTR pObjectName
|
||||
, __inout CTransInPlaceFilter *pFilter
|
||||
, __inout HRESULT *phr
|
||||
, __in_opt LPCWSTR pName
|
||||
)
|
||||
: CTransformInputPin(pObjectName,
|
||||
pFilter,
|
||||
@@ -683,7 +691,7 @@ CTransInPlaceInputPin::CTransInPlaceInputPin
|
||||
// ) or it could mean offering the one from downstream
|
||||
// Else fail to offer any allocator at all.
|
||||
|
||||
STDMETHODIMP CTransInPlaceInputPin::GetAllocator(IMemAllocator ** ppAllocator)
|
||||
STDMETHODIMP CTransInPlaceInputPin::GetAllocator(__deref_out IMemAllocator ** ppAllocator)
|
||||
{
|
||||
CheckPointer(ppAllocator,E_POINTER);
|
||||
ValidateReadWritePtr(ppAllocator,sizeof(IMemAllocator *));
|
||||
@@ -807,7 +815,7 @@ CTransInPlaceInputPin::NotifyAllocator(
|
||||
|
||||
// EnumMediaTypes
|
||||
// - pass through to our downstream filter
|
||||
STDMETHODIMP CTransInPlaceInputPin::EnumMediaTypes( IEnumMediaTypes **ppEnum )
|
||||
STDMETHODIMP CTransInPlaceInputPin::EnumMediaTypes( __deref_out IEnumMediaTypes **ppEnum )
|
||||
{
|
||||
// Can only pass through if connected
|
||||
if( !m_pTIPFilter->m_pOutput->IsConnected() )
|
||||
@@ -839,7 +847,7 @@ HRESULT CTransInPlaceInputPin::CheckMediaType(const CMediaType *pmt )
|
||||
// If upstream asks us what our requirements are, we will try to ask downstream
|
||||
// if that doesn't work, we'll just take the defaults.
|
||||
STDMETHODIMP
|
||||
CTransInPlaceInputPin::GetAllocatorRequirements(ALLOCATOR_PROPERTIES *pProps)
|
||||
CTransInPlaceInputPin::GetAllocatorRequirements(__out ALLOCATOR_PROPERTIES *pProps)
|
||||
{
|
||||
|
||||
if( m_pTIPFilter->m_pOutput->IsConnected() )
|
||||
@@ -875,10 +883,10 @@ CTransInPlaceInputPin::CompleteConnect(IPin *pReceivePin)
|
||||
// constructor
|
||||
|
||||
CTransInPlaceOutputPin::CTransInPlaceOutputPin(
|
||||
TCHAR *pObjectName,
|
||||
CTransInPlaceFilter *pFilter,
|
||||
HRESULT * phr,
|
||||
LPCWSTR pPinName)
|
||||
__in_opt LPCTSTR pObjectName,
|
||||
__inout CTransInPlaceFilter *pFilter,
|
||||
__inout HRESULT * phr,
|
||||
__in_opt LPCWSTR pPinName)
|
||||
: CTransformOutputPin( pObjectName
|
||||
, pFilter
|
||||
, phr
|
||||
@@ -893,7 +901,7 @@ CTransInPlaceOutputPin::CTransInPlaceOutputPin(
|
||||
|
||||
// EnumMediaTypes
|
||||
// - pass through to our upstream filter
|
||||
STDMETHODIMP CTransInPlaceOutputPin::EnumMediaTypes( IEnumMediaTypes **ppEnum )
|
||||
STDMETHODIMP CTransInPlaceOutputPin::EnumMediaTypes( __deref_out IEnumMediaTypes **ppEnum )
|
||||
{
|
||||
// Can only pass through if connected.
|
||||
if( ! m_pTIPFilter->m_pInput->IsConnected() )
|
||||
@@ -4,7 +4,7 @@
|
||||
// Desc: DirectShow base classes - defines classes from which simple
|
||||
// Transform-In-Place filters may be derived.
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -49,21 +49,21 @@ protected:
|
||||
public:
|
||||
|
||||
CTransInPlaceInputPin(
|
||||
TCHAR *pObjectName,
|
||||
CTransInPlaceFilter *pFilter,
|
||||
HRESULT *phr,
|
||||
LPCWSTR pName);
|
||||
__in_opt LPCTSTR pObjectName,
|
||||
__inout CTransInPlaceFilter *pFilter,
|
||||
__inout HRESULT *phr,
|
||||
__in_opt LPCWSTR pName);
|
||||
|
||||
// --- IMemInputPin -----
|
||||
|
||||
// Provide an enumerator for media types by getting one from downstream
|
||||
STDMETHODIMP EnumMediaTypes( IEnumMediaTypes **ppEnum );
|
||||
STDMETHODIMP EnumMediaTypes( __deref_out IEnumMediaTypes **ppEnum );
|
||||
|
||||
// Say whether media type is acceptable.
|
||||
HRESULT CheckMediaType(const CMediaType* pmt);
|
||||
|
||||
// Return our upstream allocator
|
||||
STDMETHODIMP GetAllocator(IMemAllocator ** ppAllocator);
|
||||
STDMETHODIMP GetAllocator(__deref_out IMemAllocator ** ppAllocator);
|
||||
|
||||
// get told which allocator the upstream output pin is actually
|
||||
// going to use.
|
||||
@@ -72,11 +72,11 @@ public:
|
||||
|
||||
// Allow the filter to see what allocator we have
|
||||
// N.B. This does NOT AddRef
|
||||
IMemAllocator * PeekAllocator() const
|
||||
__out IMemAllocator * PeekAllocator() const
|
||||
{ return m_pAllocator; }
|
||||
|
||||
// Pass this on downstream if it ever gets called.
|
||||
STDMETHODIMP GetAllocatorRequirements(ALLOCATOR_PROPERTIES *pProps);
|
||||
STDMETHODIMP GetAllocatorRequirements(__out ALLOCATOR_PROPERTIES *pProps);
|
||||
|
||||
HRESULT CompleteConnect(IPin *pReceivePin);
|
||||
|
||||
@@ -98,10 +98,10 @@ protected:
|
||||
public:
|
||||
|
||||
CTransInPlaceOutputPin(
|
||||
TCHAR *pObjectName,
|
||||
CTransInPlaceFilter *pFilter,
|
||||
HRESULT *phr,
|
||||
LPCWSTR pName);
|
||||
__in_opt LPCTSTR pObjectName,
|
||||
__inout CTransInPlaceFilter *pFilter,
|
||||
__inout HRESULT *phr,
|
||||
__in_opt LPCWSTR pName);
|
||||
|
||||
|
||||
// --- CBaseOutputPin ------------
|
||||
@@ -113,7 +113,7 @@ public:
|
||||
// virtual HRESULT DecideAllocator(IMemInputPin * pPin, IMemAllocator ** pAlloc);
|
||||
|
||||
// Provide a media type enumerator. Get it from upstream.
|
||||
STDMETHODIMP EnumMediaTypes( IEnumMediaTypes **ppEnum );
|
||||
STDMETHODIMP EnumMediaTypes( __deref_out IEnumMediaTypes **ppEnum );
|
||||
|
||||
// Say whether media type is acceptable.
|
||||
HRESULT CheckMediaType(const CMediaType* pmt);
|
||||
@@ -122,12 +122,12 @@ public:
|
||||
// Also called by input pin's GetAllocator()
|
||||
void SetAllocator(IMemAllocator * pAllocator);
|
||||
|
||||
IMemInputPin * ConnectedIMemInputPin()
|
||||
__out_opt IMemInputPin * ConnectedIMemInputPin()
|
||||
{ return m_pInputPin; }
|
||||
|
||||
// Allow the filter to see what allocator we have
|
||||
// N.B. This does NOT AddRef
|
||||
IMemAllocator * PeekAllocator() const
|
||||
__out IMemAllocator * PeekAllocator() const
|
||||
{ return m_pAllocator; }
|
||||
|
||||
HRESULT CompleteConnect(IPin *pReceivePin);
|
||||
@@ -151,10 +151,10 @@ public:
|
||||
// not modify the data samples (for instance it's just copying
|
||||
// them somewhere else or looking at the timestamps).
|
||||
|
||||
CTransInPlaceFilter(TCHAR *, LPUNKNOWN, REFCLSID clsid, HRESULT *,
|
||||
CTransInPlaceFilter(__in_opt LPCTSTR, __inout_opt LPUNKNOWN, REFCLSID clsid, __inout HRESULT *,
|
||||
bool bModifiesData = true);
|
||||
#ifdef UNICODE
|
||||
CTransInPlaceFilter(CHAR *, LPUNKNOWN, REFCLSID clsid, HRESULT *,
|
||||
CTransInPlaceFilter(__in_opt LPCSTR, __inout_opt LPUNKNOWN, REFCLSID clsid, __inout HRESULT *,
|
||||
bool bModifiesData = true);
|
||||
#endif
|
||||
// The following are defined to avoid undefined pure virtuals.
|
||||
@@ -162,13 +162,13 @@ public:
|
||||
|
||||
// We override EnumMediaTypes to bypass the transform class enumerator
|
||||
// which would otherwise call this.
|
||||
HRESULT GetMediaType(int iPosition, CMediaType *pMediaType)
|
||||
HRESULT GetMediaType(int iPosition, __inout CMediaType *pMediaType)
|
||||
{ DbgBreak("CTransInPlaceFilter::GetMediaType should never be called");
|
||||
return E_UNEXPECTED;
|
||||
}
|
||||
|
||||
// This is called when we actually have to provide out own allocator.
|
||||
HRESULT DecideBufferSize(IMemAllocator*, ALLOCATOR_PROPERTIES *);
|
||||
// This is called when we actually have to provide our own allocator.
|
||||
HRESULT DecideBufferSize(IMemAllocator*, __inout ALLOCATOR_PROPERTIES *);
|
||||
|
||||
// The functions which call this in CTransform are overridden in this
|
||||
// class to call CheckInputType with the assumption that the type
|
||||
@@ -211,7 +211,7 @@ public:
|
||||
|
||||
protected:
|
||||
|
||||
IMediaSample * CTransInPlaceFilter::Copy(IMediaSample *pSource);
|
||||
__out_opt IMediaSample * CTransInPlaceFilter::Copy(IMediaSample *pSource);
|
||||
|
||||
#ifdef PERF
|
||||
int m_idTransInPlace; // performance measuring id
|
||||
@@ -223,11 +223,11 @@ protected:
|
||||
friend class CTransInPlaceInputPin;
|
||||
friend class CTransInPlaceOutputPin;
|
||||
|
||||
CTransInPlaceInputPin *InputPin() const
|
||||
__out CTransInPlaceInputPin *InputPin() const
|
||||
{
|
||||
return (CTransInPlaceInputPin *)m_pInput;
|
||||
};
|
||||
CTransInPlaceOutputPin *OutputPin() const
|
||||
__out CTransInPlaceOutputPin *OutputPin() const
|
||||
{
|
||||
return (CTransInPlaceOutputPin *)m_pOutput;
|
||||
};
|
||||
@@ -3,16 +3,16 @@
|
||||
//
|
||||
// Desc: DirectShow base classes.
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
#include "streams.h"
|
||||
#include "measure.h"
|
||||
#include <streams.h>
|
||||
#include <measure.h>
|
||||
// #include <vtransfr.h> // now in precomp file streams.h
|
||||
|
||||
CVideoTransformFilter::CVideoTransformFilter
|
||||
( TCHAR *pName, LPUNKNOWN pUnk, REFCLSID clsid)
|
||||
( __in_opt LPCTSTR pName, __inout_opt LPUNKNOWN pUnk, REFCLSID clsid)
|
||||
: CTransformFilter(pName, pUnk, clsid)
|
||||
, m_itrLate(0)
|
||||
, m_nKeyFramePeriod(0) // No QM until we see at least 2 key frames
|
||||
@@ -3,7 +3,7 @@
|
||||
//
|
||||
// Desc: DirectShow base classes - defines a video transform class.
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ class CVideoTransformFilter : public CTransformFilter
|
||||
{
|
||||
public:
|
||||
|
||||
CVideoTransformFilter(TCHAR *, LPUNKNOWN, REFCLSID clsid);
|
||||
CVideoTransformFilter(__in_opt LPCTSTR, __inout_opt LPUNKNOWN, REFCLSID clsid);
|
||||
~CVideoTransformFilter();
|
||||
HRESULT EndFlush();
|
||||
|
||||
Vendored
+1473
File diff suppressed because it is too large
Load Diff
@@ -3,7 +3,7 @@
|
||||
//
|
||||
// Desc: DirectShow base classes - provides debugging facilities.
|
||||
//
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// Copyright (c) 1992-2001 Microsoft Corporation. All rights reserved.
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -64,8 +64,8 @@ enum { CDISP_HEX = 0x01,
|
||||
// we have registered so that we can dump a list of remaining objects
|
||||
|
||||
typedef struct tag_ObjectDesc {
|
||||
const CHAR *m_szName;
|
||||
const WCHAR *m_wszName;
|
||||
LPCSTR m_szName;
|
||||
LPCWSTR m_wszName;
|
||||
DWORD m_dwCookie;
|
||||
tag_ObjectDesc *m_pNext;
|
||||
} ObjectDesc;
|
||||
@@ -84,7 +84,7 @@ typedef struct tag_ObjectDesc {
|
||||
void WINAPI DbgInitModuleSettings(bool fTakeMax);
|
||||
void WINAPI DbgInitModuleName();
|
||||
DWORD WINAPI DbgRegisterObjectCreation(
|
||||
const CHAR *szObjectName, const WCHAR *wszObjectName);
|
||||
LPCSTR szObjectName, LPCWSTR wszObjectName);
|
||||
|
||||
BOOL WINAPI DbgRegisterObjectDestruction(DWORD dwCookie);
|
||||
|
||||
@@ -103,30 +103,30 @@ typedef struct tag_ObjectDesc {
|
||||
|
||||
// Display error and logging to the user
|
||||
|
||||
void WINAPI DbgAssert(const TCHAR *pCondition,const TCHAR *pFileName,INT iLine);
|
||||
void WINAPI DbgBreakPoint(const TCHAR *pCondition,const TCHAR *pFileName,INT iLine);
|
||||
void WINAPI DbgBreakPoint(const TCHAR *pFileName,INT iLine,const TCHAR* szFormatString,...);
|
||||
void WINAPI DbgAssert(LPCTSTR pCondition,LPCTSTR pFileName,INT iLine);
|
||||
void WINAPI DbgBreakPoint(LPCTSTR pCondition,LPCTSTR pFileName,INT iLine);
|
||||
void WINAPI DbgBreakPoint(LPCTSTR pFileName,INT iLine,__format_string LPCTSTR szFormatString,...);
|
||||
|
||||
void WINAPI DbgKernelAssert(const TCHAR *pCondition,const TCHAR *pFileName,INT iLine);
|
||||
void WINAPI DbgLogInfo(DWORD Type,DWORD Level,const TCHAR *pFormat,...);
|
||||
void WINAPI DbgKernelAssert(LPCTSTR pCondition,LPCTSTR pFileName,INT iLine);
|
||||
void WINAPI DbgLogInfo(DWORD Type,DWORD Level,__format_string LPCTSTR pFormat,...);
|
||||
#ifdef UNICODE
|
||||
void WINAPI DbgLogInfo(DWORD Type,DWORD Level,const CHAR *pFormat,...);
|
||||
void WINAPI DbgAssert(const CHAR *pCondition,const CHAR *pFileName,INT iLine);
|
||||
void WINAPI DbgBreakPoint(const CHAR *pCondition,const CHAR *pFileName,INT iLine);
|
||||
void WINAPI DbgKernelAssert(const CHAR *pCondition,const CHAR *pFileName,INT iLine);
|
||||
void WINAPI DbgLogInfo(DWORD Type,DWORD Level,__format_string LPCSTR pFormat,...);
|
||||
void WINAPI DbgAssert(LPCSTR pCondition,LPCSTR pFileName,INT iLine);
|
||||
void WINAPI DbgBreakPoint(LPCSTR pCondition,LPCSTR pFileName,INT iLine);
|
||||
void WINAPI DbgKernelAssert(LPCSTR pCondition,LPCSTR pFileName,INT iLine);
|
||||
#endif
|
||||
void WINAPI DbgOutString(LPCTSTR psz);
|
||||
|
||||
// Debug infinite wait stuff
|
||||
DWORD WINAPI DbgWaitForSingleObject(HANDLE h);
|
||||
DWORD WINAPI DbgWaitForMultipleObjects(DWORD nCount,
|
||||
CONST HANDLE *lpHandles,
|
||||
__in_ecount(nCount) CONST HANDLE *lpHandles,
|
||||
BOOL bWaitAll);
|
||||
void WINAPI DbgSetWaitTimeout(DWORD dwTimeout);
|
||||
|
||||
#ifdef __strmif_h__
|
||||
// Display a media type: Terse at level 2, verbose at level 5
|
||||
void WINAPI DisplayType(LPTSTR label, const AM_MEDIA_TYPE *pmtIn, DWORD dwLevel = 5);
|
||||
void WINAPI DisplayType(LPCTSTR label, const AM_MEDIA_TYPE *pmtIn);
|
||||
|
||||
// Dump lots of information about a filter graph
|
||||
void WINAPI DumpGraph(IFilterGraph *pGraph, DWORD dwLevel);
|
||||
@@ -176,7 +176,7 @@ typedef struct tag_ObjectDesc {
|
||||
// (public entry points compile to nothing) so if you go trying to call
|
||||
// any of the private entry points in your source they won't compile
|
||||
|
||||
#define NAME(_x_) ((TCHAR *) NULL)
|
||||
#define NAME(_x_) ((LPTSTR) NULL)
|
||||
|
||||
#define DbgInitialise(hInst)
|
||||
#define DbgTerminate()
|
||||
@@ -236,46 +236,12 @@ typedef struct tag_ObjectDesc {
|
||||
// CheckPointer(pBar,FALSE)
|
||||
// }
|
||||
|
||||
// These validate pointers when symbol VFWROBUST is defined
|
||||
// This will normally be defined in debug not retail builds
|
||||
|
||||
#ifdef DEBUG
|
||||
#define VFWROBUST
|
||||
#endif
|
||||
|
||||
#ifdef VFWROBUST
|
||||
|
||||
#define ValidateReadPtr(p,cb) \
|
||||
{if(IsBadReadPtr((PVOID)p,cb) == TRUE) \
|
||||
DbgBreak("Invalid read pointer");}
|
||||
|
||||
#define ValidateWritePtr(p,cb) \
|
||||
{if(IsBadWritePtr((PVOID)p,cb) == TRUE) \
|
||||
DbgBreak("Invalid write pointer");}
|
||||
|
||||
#define ValidateReadWritePtr(p,cb) \
|
||||
{ValidateReadPtr(p,cb) ValidateWritePtr(p,cb)}
|
||||
|
||||
#define ValidateStringPtr(p) \
|
||||
{if(IsBadStringPtr((LPCTSTR)p,INFINITE) == TRUE) \
|
||||
DbgBreak("Invalid string pointer");}
|
||||
|
||||
#define ValidateStringPtrA(p) \
|
||||
{if(IsBadStringPtrA((LPCSTR)p,INFINITE) == TRUE) \
|
||||
DbgBreak("Invalid ANSI string pointer");}
|
||||
|
||||
#define ValidateStringPtrW(p) \
|
||||
{if(IsBadStringPtrW((LPCWSTR)p,INFINITE) == TRUE) \
|
||||
DbgBreak("Invalid UNICODE string pointer");}
|
||||
|
||||
#else
|
||||
#define ValidateReadPtr(p,cb) 0
|
||||
#define ValidateWritePtr(p,cb) 0
|
||||
#define ValidateReadWritePtr(p,cb) 0
|
||||
#define ValidateStringPtr(p) 0
|
||||
#define ValidateStringPtrA(p) 0
|
||||
#define ValidateStringPtrW(p) 0
|
||||
#endif
|
||||
#define ValidateReadPtr(p,cb) 0
|
||||
#define ValidateWritePtr(p,cb) 0
|
||||
#define ValidateReadWritePtr(p,cb) 0
|
||||
#define ValidateStringPtr(p) 0
|
||||
#define ValidateStringPtrA(p) 0
|
||||
#define ValidateStringPtrW(p) 0
|
||||
|
||||
|
||||
#ifdef _OBJBASE_H_
|
||||
@@ -326,7 +292,7 @@ public:
|
||||
CDispBasic() { m_pString = m_String; };
|
||||
~CDispBasic();
|
||||
protected:
|
||||
TCHAR* m_pString; // normally points to m_String... unless too much data
|
||||
PTCHAR m_pString; // normally points to m_String... unless too much data
|
||||
TCHAR m_String[50];
|
||||
};
|
||||
class CDisp : public CDispBasic
|
||||
@@ -356,12 +322,12 @@ public:
|
||||
class CAutoTrace
|
||||
{
|
||||
private:
|
||||
const TCHAR* _szBlkName;
|
||||
LPCTSTR _szBlkName;
|
||||
const int _level;
|
||||
static const TCHAR _szEntering[];
|
||||
static const TCHAR _szLeaving[];
|
||||
public:
|
||||
CAutoTrace(const TCHAR* szBlkName, const int level = 15)
|
||||
CAutoTrace(LPCTSTR szBlkName, const int level = 15)
|
||||
: _szBlkName(szBlkName), _level(level)
|
||||
{DbgLog((LOG_TRACE, _level, _szEntering, _szBlkName));}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user