WP7 BackgroundAudioPlayer воспроизводится только при подключении к отладчику

Я работаю над музыкальным приложением для WP7. Он загружает музыку с наших серверов в виде небольших сегментов (каждый трек разделен на 128 тысяч зашифрованных фрагментов). Я использую AudioPlayerAgent и AudioStreamingAgent для загрузки, расшифровки и воспроизведения музыки.

Все работает нормально, пока запускаю приложение из visual studio по F5. Когда я запускаю приложение из меню на эмуляторе или устройстве, все работает нормально, за исключением того, что музыка не воспроизводится. BackgroundAudioPlayer никогда не запускается. Не имеет значения, пытаюсь ли я отлаживать или выпускать сборку, а также пробую ли я это на эмуляторе или реальном устройстве (Nokia Lumia 710 и HTC HD7 Pro).

Я думаю, что у меня все правильно настроено в AppManifest:

<Capabilities>
  <Capability Name="ID_CAP_GAMERSERVICES" />
  <Capability Name="ID_CAP_IDENTITY_DEVICE" />
  <Capability Name="ID_CAP_IDENTITY_USER" />
  <Capability Name="ID_CAP_LOCATION" />
  <Capability Name="ID_CAP_MEDIALIB" />
  <Capability Name="ID_CAP_MICROPHONE" />
  <Capability Name="ID_CAP_NETWORKING" />
  <Capability Name="ID_CAP_PHONEDIALER" />
  <Capability Name="ID_CAP_PUSH_NOTIFICATION" />
  <Capability Name="ID_CAP_SENSORS" />
  <Capability Name="ID_CAP_WEBBROWSERCOMPONENT" />
</Capabilities>
<Tasks>     
  <DefaultTask Name="_default" NavigationPage="Panorama.xaml" />
  <ExtendedTask Name="BackgroundTask">
    <BackgroundServiceAgent Specifier="AudioPlayerAgent" Name="AudioPlaybackAgent1" Source="AudioPlaybackAgent1" Type="AudioPlaybackAgent1.AudioPlayer" />
    <BackgroundServiceAgent Specifier="AudioStreamingAgent" Name="AudioStreamAgent1" Source="AudioStreamAgent1" Type="AudioStreamAgent1.AudioTrackStreamer" />
  </ExtendedTask>
</Tasks>

После некоторых исследований я обнаружил, что могу включить скрытую консоль для эмулятора, чтобы видеть журнал отладки. Я попытался отследить, что происходит, когда я запускаю приложение из меню эмулятора. В точке, где BackgroundAudioPlayer должен начать воспроизведение трека, появляется следующее сообщение:

PID:0E8500C6 TID:0EEE006A Sentinels are Disabled for all processes.PID:0E8500C6 TID:0EC500DE Exception 'Raised Exception' (0xc0008005): Thread-Id=0ec500de(pth=c0654930), Proc-Id=0e8500c6(pprc=c05f3160) 'HeadlessHost.exe', VM-active=0e8500c6(pprc=c05f3160) 'HeadlessHost.exe'
PID:0E8500C6 TID:0EC500DE PC=42a629f7(mscoree3_7.dll+0x000529f7) RA=42ac3ae5(mscoree3_7.dll+0x000b3ae5) SP=0634f6b8, BVA=00000000

Я также пытался протестировать приложение в MarketplaceTestKit, если его вызывает какой-либо неподдерживаемый API, но приложение прошло все тесты нормально.

Итак, мой вопрос: кто-нибудь знает, пока приложение воспроизводится только при подключении к отладчику?

Спасибо,

Ян.


person jano    schedule 15.03.2012    source источник
comment
Я думаю, что нашел решение. Здесь: goo.gl/baiCN написано, что: - Оба типа агентов фонового звука размещены в одном обрабатывать и совместно использовать максимальный предел памяти 15 МБ. - При работе под отладчиком ограничения памяти и времени выполнения игнорируются операционной системой Windows Phone. В моем приложении я использовал циклический буфер для хранения расшифрованных и декодированных данных PCM для воспроизведения, но этот буфер имел более 10 МБ. Поэтому, когда я уменьшил этот буфер, приложение начало воспроизводить звук, когда отладчик не был подключен. Надеюсь, что это поможет кому-то, Рагардс, Ян...   -  person jano    schedule 15.03.2012


Ответы (1)


В вашем приложении должен быть только один тип фонового аудиоагента.
Судя по вашему описанию того, как вы получаете треки, использование потокового агента кажется более подходящим.
Если вы играете каждый сегмент напрямую (рассматривая его как отдельную дорожку), и нет проблем с промежутками при переключении между сегментами (дорожками), тогда вы можете использовать агент воспроизведения.

Наличие нескольких агентов фонового звука может привести к сбою приложения. Примечание. Вам придется отредактировать файл WMAppManifest напрямую, чтобы удалить тот, который вам не нужен.

person Matt Lacey    schedule 15.03.2012
comment
Привет, спасибо за ответ. Я следил за примером фонового аудиостримера из примеров кода MSDN и goo.gl/bX4nm. AudioStreamer загружает и декодирует сегменты и передает декодированные данные PCM для BackgroundAudioPlayer. Я еще раз проверил образец Microsoft Background Audio Streamer, и у них также есть эти две задачи BackgroundServiceAgent в манифесте. Как я упоминал в своем комментарии к моему вопросу, проблема заключалась в том, что буфер декодированных данных PCM в стримере был слишком большим. Фоновые звуковые агенты (стример+проигрыватель) не могут превышать 15 МБ памяти. - person jano; 15.03.2012