MartinsV 0 Denunciar post Postado Dezembro 11, 2008 Estou fazendo um pequeno player de música em C#, com um listview multi-coluna (mainlist) que carrega dados de um arquivo xml. Está praticamente pronto, ele toca, insere novas músicas na biblioteca, deleta músicas, etc. Mas eu resolvi tentar criar uma lógica que tocasse o próximo item da listview, e tecnicamente consegui, mas não sei por que, a música acaba nao tocando, como se começasse e, de repente, parasse. Eu acredito que seja alguma coisa na instrução foreach do meu código... Será que tem alguma coisa errada? ... else if (media.playState == WMPLib.WMPPlayState.wmppsMediaEnded) { foreach (ListViewItem item in mainlist.Items) { if (item.SubItems[3].Text == media.URL) { item.ForeColor = Color.Black; foreach (ListViewItem otheritem in mainlist.Items) { if (otheritem.Index == item.Index + 1) { media.URL = otheritem.SubItems[3].Text; otheritem.ForeColor = Color.SteelBlue; media.Ctlcontrols.play(); break; } else if (otheritem == item) { continue; } else { break; } } } else { break; } } } ... Eu estou usando o componente WindowsMediaPlayer para tocar as músicas (com o nome "media"), e este código se encontra no evento StatusChanges do mesmo. O SubItem[3] é a coluna onde se encontra os diretórios dos arquivos mp3. Abraços Compartilhar este post Link para o post Compartilhar em outros sites
quintelab 91 Denunciar post Postado Dezembro 12, 2008 Cara só debugando pra ver o que esta acontecendo. Ele esta entrando no play normalmente? Abraços... Compartilhar este post Link para o post Compartilhar em outros sites
MartinsV 0 Denunciar post Postado Dezembro 12, 2008 Então quintelab, Eu achei meio estranho, pq primeiro ele nao tocava nada. Quando a música acabava, ele simplesmente parava o MediaPLayer, normalmente, como se tivesse acabado a música e nada tivesse acontecido. Mas quando eu aperto play, ele toca a música seguinte! É como se a instrução media.Ctlcontrols.play(); não estivesse funcionanado. Eu fiz um teste, coloquei um MessageBox após esta instrução, e o resultado foi: a música q estava tocando acabava, o evento Status Changed era acionado e o MediaEnded executado, a MessageBox aparecia e, enquanto estivesse aberta, a próxima música tocava. Mas se eu fecho a MessageBox, a música para. Por isso eu acho q é problema no foreach, pq ele chega a executar e por alguma razão o foreach continua (mesmo com os breaks que eu dei) e a música pára. Estranho... Abraços Compartilhar este post Link para o post Compartilhar em outros sites
quintelab 91 Denunciar post Postado Dezembro 13, 2008 Se você continuar seguindo o debugando, sabe em qual linha ele para de tocar a música? Abraços... Compartilhar este post Link para o post Compartilhar em outros sites
MartinsV 0 Denunciar post Postado Dezembro 14, 2008 (Que saco, escrevi uma resposta meio grande, postei, mas deu erro na hora e o post nao saiu ¬¬ vou tentar de novo: ) Então, eu nao sei bem em que linha ele pára de tocar. Mas eu tentei entender o que acontece, colocando umas menssagens, assim: ... else if (media.playState == WMPLib.WMPPlayState.wmppsMediaEnded) { foreach (ListViewItem item in mainlist.Items) { if (item.SubItems[3].Text == media.URL) { MessageBox.Show("achou a música que estava tocando"); item.ForeColor = Color.Black; foreach (ListViewItem otheritem in mainlist.Items) { if (otheritem.Index == item.Index + 1) { MessageBox.Show("achou a próxima música da que estava tocando"); media.URL = otheritem.SubItems[3].Text; otheritem.ForeColor = Color.SteelBlue; media.Ctlcontrols.play(); break; } else if (otheritem == item) { MessageBox.Show("a música é a mesma que estava tocando"); continue; } else { break; } } break; } else { MessageBox.Show("a música não é nem a próxima música nem a mesma"); break; } } } ... eu executo, vou na primeira música, coloco no final da mesma e, quando acaba, aparecem as menssagens, na ordem: 1. "achou a música que estava tocando" (a primeira, ou seja, entrou no primeiro loop). Aperto OK: 2. "a música é a mesma que estava tocando" (entrou no segundo loop, onde otheritem == item). Aperto OK: 3. "achou a próxima música da que estava tocando" (é a proxima musica, a segunda, então otheritem.Index == item.Index + 1). Aperto OK: Aí o item correspondente a próxima música (neste caso, o segundo), muda de cor, e o MediaPlayer pára. Mas, se eu aperto o play, ele toca a segudna música, que deveria tocar sozinha com o media.Ctlcontrols.play(). É como se algum break parásse o MediaPlayer, ou alguma coisa assim. To quebrando a cabeça aqui ma snao consigo descobrir! O que será?? Abraços Compartilhar este post Link para o post Compartilhar em outros sites
MartinsV 0 Denunciar post Postado Dezembro 17, 2008 Descobri o problema! Depois de algumas horas no google, descobri que é um bug do controle WindowsMediaPlayer mesmo, no qual certas coisas não funcionam no evento StatusChanged. A resolução foi até fácil: eu criei um timer, e no evento StatusChanged, no status MediaEnded, acionei o timer. No evento deste timer eu coloquei o media.CtlControls.play(), que não funcionava no evento do WMP, mas funcionou neste. Bem, tópico resolvido, Abraços Compartilhar este post Link para o post Compartilhar em outros sites