1 use std::convert::From; 2 use std::default::Default; 3 use std; 4 5 #[derive(Copy, Clone, Debug, PartialEq)] 6 pub enum Error { 7 FileError, 8 NotMP3, 9 NoHeader, 10 DuplicatedIDV3, 11 InvalidData, 12 } 13 14 impl std::fmt::Display for Error { fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error>15 fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> { 16 (self as &std::error::Error).description().fmt(f) 17 } 18 } 19 20 impl std::error::Error for Error { description(&self) -> &str21 fn description(&self) -> &str { 22 match *self { 23 Error::FileError => "An I/O error occurred", 24 Error::NotMP3 => "The file is not a valid MP3 file", 25 Error::NoHeader => "The file is missing an MP3 header", 26 Error::DuplicatedIDV3 => "The MP3 file contains a duplicate IDv3 frame", 27 Error::InvalidData => "The MP3 metadata is invalid", 28 } 29 } 30 } 31 32 #[allow(non_camel_case_types)] 33 #[derive(Copy, Clone, Debug, PartialEq)] 34 pub enum Version { 35 Reserved, 36 MPEG1, 37 MPEG2, 38 MPEG2_5, 39 Unknown, 40 } 41 42 impl Default for Version { default() -> Version43 fn default() -> Version { 44 Version::Unknown 45 } 46 } 47 48 impl From<u32> for Version { from(c: u32) -> Version49 fn from(c: u32) -> Version { 50 match c { 51 0x00 => Version::MPEG2_5, 52 0x01 => Version::Reserved, 53 0x02 => Version::MPEG2, 54 0x03 => Version::MPEG1, 55 _ => unreachable!(), 56 } 57 } 58 } 59 60 #[derive(Copy, Clone, Debug, PartialEq)] 61 pub enum Layer { 62 Reserved, 63 Layer1, 64 Layer2, 65 Layer3, 66 Unknown, 67 } 68 69 impl Default for Layer { default() -> Layer70 fn default() -> Layer { 71 Layer::Unknown 72 } 73 } 74 75 impl From<u32> for Layer { from(c: u32) -> Layer76 fn from(c: u32) -> Layer { 77 match c { 78 0x0 => Layer::Reserved, 79 0x1 => Layer::Layer3, 80 0x2 => Layer::Layer2, 81 0x3 => Layer::Layer1, 82 _ => unreachable!(), 83 } 84 } 85 } 86 87 #[derive(Copy, Clone, Debug, PartialEq)] 88 pub enum CRC { 89 /// Redundancy added. 90 Added, 91 /// Redundancy not added. 92 NotAdded, 93 } 94 95 impl Default for CRC { default() -> CRC96 fn default() -> CRC { 97 CRC::NotAdded 98 } 99 } 100 101 impl From<u32> for CRC { from(c: u32) -> CRC102 fn from(c: u32) -> CRC { 103 match c { 104 0x00 => CRC::Added, 105 0x01 => CRC::NotAdded, 106 _ => unreachable!(), 107 } 108 } 109 } 110 111 #[derive(Copy, Clone, Debug, PartialEq)] 112 pub enum ChannelType { 113 Stereo, 114 JointStereo, 115 DualChannel, 116 SingleChannel, 117 Unknown, 118 } 119 120 impl Default for ChannelType { default() -> ChannelType121 fn default() -> ChannelType { 122 ChannelType::Unknown 123 } 124 } 125 126 impl From<u32> for ChannelType { from(c: u32) -> ChannelType127 fn from(c: u32) -> ChannelType { 128 match c { 129 0x0 => ChannelType::Stereo, 130 0x1 => ChannelType::JointStereo, 131 0x2 => ChannelType::DualChannel, 132 0x3 => ChannelType::SingleChannel, 133 _ => unreachable!(), 134 } 135 } 136 } 137 138 #[derive(Copy, Clone, Debug, PartialEq)] 139 pub enum Copyright { 140 None, 141 Some, 142 } 143 144 impl Default for Copyright { default() -> Copyright145 fn default() -> Copyright { 146 Copyright::Some 147 } 148 } 149 150 impl From<u32> for Copyright { from(c: u32) -> Copyright151 fn from(c: u32) -> Copyright { 152 match c { 153 0x0 => Copyright::None, 154 0x1 => Copyright::Some, 155 _ => unreachable!(), 156 } 157 } 158 } 159 160 #[derive(Copy, Clone, Debug, PartialEq)] 161 pub enum Status { 162 Copy, 163 Original, 164 Unknown, 165 } 166 167 impl Default for Status { default() -> Status168 fn default() -> Status { 169 Status::Unknown 170 } 171 } 172 173 impl From<u32> for Status { from(c: u32) -> Status174 fn from(c: u32) -> Status { 175 match c { 176 0x0 => Status::Copy, 177 0x1 => Status::Original, 178 _ => unreachable!(), 179 } 180 } 181 } 182 183 #[derive(Copy, Clone, Debug, PartialEq)] 184 pub enum Emphasis { 185 /// No emphasis 186 None, 187 /// 50/15 Micro seconds 188 MicroSeconds, 189 /// Reserved 190 Reserved, 191 /// CCIT J.17 192 CCITT, 193 Unknown, 194 } 195 196 impl Default for Emphasis { default() -> Emphasis197 fn default() -> Emphasis { 198 Emphasis::Unknown 199 } 200 } 201 202 impl From<u32> for Emphasis { from(c: u32) -> Emphasis203 fn from(c: u32) -> Emphasis { 204 match c { 205 0x0 => Emphasis::None, 206 0x1 => Emphasis::MicroSeconds, 207 0x2 => Emphasis::Reserved, 208 0x3 => Emphasis::CCITT, 209 _ => unreachable!(), 210 } 211 } 212 } 213 214 #[derive(Clone, Debug, PartialEq)] 215 pub enum Genre { 216 Blues, 217 ClassicRock, 218 Country, 219 Dance, 220 Disco, 221 Funk, 222 Grunge, 223 HipHop, 224 Jazz, 225 Metal, 226 NewAge, 227 Oldies, 228 Other, 229 Pop, 230 RAndB, 231 Rap, 232 Reggae, 233 Rock, 234 Techno, 235 Industrial, 236 Alternative, 237 Ska, 238 DeathMetal, 239 Pranks, 240 Soundtrack, 241 EuroTechno, 242 Ambient, 243 TripHop, 244 Vocal, 245 JazzFunk, 246 Fusion, 247 Trance, 248 Classical, 249 Instrumental, 250 Acid, 251 House, 252 Game, 253 SoundClip, 254 Gospel, 255 Noise, 256 AlternRock, 257 Bass, 258 Soul, 259 Punk, 260 Space, 261 Meditative, 262 InstrumentalPop, 263 InstrumentalRock, 264 Ethnic, 265 Gothic, 266 Darkwave, 267 TechnoIndustrial, 268 Electronic, 269 PopFolk, 270 Eurodance, 271 Dream, 272 SouthernRock, 273 Comedy, 274 Cult, 275 Gangsta, 276 Top40, 277 ChristianRap, 278 PopFunk, 279 Jungle, 280 NativeAmerican, 281 Cabaret, 282 NewWave, 283 Psychadelic, 284 Rave, 285 Showtunes, 286 Trailer, 287 LoFi, 288 Tribal, 289 AcidPunk, 290 AcidJazz, 291 Polka, 292 Retro, 293 Musical, 294 RockAndRoll, 295 HardRock, 296 // Extension from here 297 Folk, 298 FolkRock, 299 NationalFolk, 300 Swing, 301 FastFusion, 302 Bebob, 303 Latin, 304 Revival, 305 Celtic, 306 Bluegrass, 307 Avantgarde, 308 GothicRock, 309 ProgressiveRock, 310 PsychedelicRock, 311 SymphonicRock, 312 SlowRock, 313 BigBand, 314 Chorus, 315 EasyListening, 316 Acoustic, 317 Humour, 318 Speech, 319 Chanson, 320 Opera, 321 ChamberMusic, 322 Sonata, 323 Symphony, 324 BootyBrass, 325 Primus, 326 PornGroove, 327 Satire, 328 SlowJam, 329 Club, 330 Tango, 331 Samba, 332 Folklore, 333 Ballad, 334 PowerBallad, 335 RhytmicSoul, 336 Freestyle, 337 Duet, 338 PunkRock, 339 DrumSolo, 340 ACapela, 341 EuroHouse, 342 DanceHall, 343 Something(String), 344 Unknown, 345 } 346 347 impl Default for Genre { default() -> Genre348 fn default() -> Genre { 349 Genre::Unknown 350 } 351 } 352 353 impl<'a> From<&'a str> for Genre { from(c: &'a str) -> Genre354 fn from(c: &'a str) -> Genre { 355 match c.parse::<u8>() { 356 Ok(nb) => Genre::from(nb), 357 Err(_) => Genre::Something(c.to_owned()), 358 } 359 } 360 } 361 362 impl From<u8> for Genre { from(c: u8) -> Genre363 fn from(c: u8) -> Genre { 364 match c { 365 0 => Genre::Blues, 366 1 => Genre::ClassicRock, 367 2 => Genre::Country, 368 3 => Genre::Dance, 369 4 => Genre::Disco, 370 5 => Genre::Funk, 371 6 => Genre::Grunge, 372 7 => Genre::HipHop, 373 8 => Genre::Jazz, 374 9 => Genre::Metal, 375 10 => Genre::NewAge, 376 11 => Genre::Oldies, 377 12 => Genre::Other, 378 13 => Genre::Pop, 379 14 => Genre::RAndB, 380 15 => Genre::Rap, 381 16 => Genre::Reggae, 382 17 => Genre::Rock, 383 18 => Genre::Techno, 384 19 => Genre::Industrial, 385 20 => Genre::Alternative, 386 21 => Genre::Ska, 387 22 => Genre::DeathMetal, 388 23 => Genre::Pranks, 389 24 => Genre::Soundtrack, 390 25 => Genre::EuroTechno, 391 26 => Genre::Ambient, 392 27 => Genre::TripHop, 393 28 => Genre::Vocal, 394 29 => Genre::JazzFunk, 395 30 => Genre::Fusion, 396 31 => Genre::Trance, 397 32 => Genre::Classical, 398 33 => Genre::Instrumental, 399 34 => Genre::Acid, 400 35 => Genre::House, 401 36 => Genre::Game, 402 37 => Genre::SoundClip, 403 38 => Genre::Gospel, 404 39 => Genre::Noise, 405 40 => Genre::AlternRock, 406 41 => Genre::Bass, 407 42 => Genre::Soul, 408 43 => Genre::Punk, 409 44 => Genre::Space, 410 45 => Genre::Meditative, 411 46 => Genre::InstrumentalPop, 412 47 => Genre::InstrumentalRock, 413 48 => Genre::Ethnic, 414 49 => Genre::Gothic, 415 50 => Genre::Darkwave, 416 51 => Genre::TechnoIndustrial, 417 52 => Genre::Electronic, 418 53 => Genre::PopFolk, 419 54 => Genre::Eurodance, 420 55 => Genre::Dream, 421 56 => Genre::SouthernRock, 422 57 => Genre::Comedy, 423 58 => Genre::Cult, 424 59 => Genre::Gangsta, 425 60 => Genre::Top40, 426 61 => Genre::ChristianRap, 427 62 => Genre::PopFunk, 428 63 => Genre::Jungle, 429 64 => Genre::NativeAmerican, 430 65 => Genre::Cabaret, 431 66 => Genre::NewWave, 432 67 => Genre::Psychadelic, 433 68 => Genre::Rave, 434 69 => Genre::Showtunes, 435 70 => Genre::Trailer, 436 71 => Genre::LoFi, 437 72 => Genre::Tribal, 438 73 => Genre::AcidPunk, 439 74 => Genre::AcidJazz, 440 75 => Genre::Polka, 441 76 => Genre::Retro, 442 77 => Genre::Musical, 443 78 => Genre::RockAndRoll, 444 79 => Genre::HardRock, 445 80 => Genre::Folk, 446 81 => Genre::FolkRock, 447 82 => Genre::NationalFolk, 448 83 => Genre::Swing, 449 84 => Genre::FastFusion, 450 85 => Genre::Bebob, 451 86 => Genre::Latin, 452 87 => Genre::Revival, 453 88 => Genre::Celtic, 454 89 => Genre::Bluegrass, 455 90 => Genre::Avantgarde, 456 91 => Genre::GothicRock, 457 92 => Genre::ProgressiveRock, 458 93 => Genre::PsychedelicRock, 459 94 => Genre::SymphonicRock, 460 95 => Genre::SlowRock, 461 96 => Genre::BigBand, 462 97 => Genre::Chorus, 463 98 => Genre::EasyListening, 464 99 => Genre::Acoustic, 465 100 => Genre::Humour, 466 101 => Genre::Speech, 467 102 => Genre::Chanson, 468 103 => Genre::Opera, 469 104 => Genre::ChamberMusic, 470 105 => Genre::Sonata, 471 106 => Genre::Symphony, 472 107 => Genre::BootyBrass, 473 108 => Genre::Primus, 474 109 => Genre::PornGroove, 475 110 => Genre::Satire, 476 111 => Genre::SlowJam, 477 112 => Genre::Club, 478 113 => Genre::Tango, 479 114 => Genre::Samba, 480 115 => Genre::Folklore, 481 116 => Genre::Ballad, 482 117 => Genre::PowerBallad, 483 118 => Genre::RhytmicSoul, 484 119 => Genre::Freestyle, 485 120 => Genre::Duet, 486 121 => Genre::PunkRock, 487 122 => Genre::DrumSolo, 488 123 => Genre::ACapela, 489 124 => Genre::EuroHouse, 490 125 => Genre::DanceHall, 491 _ => Genre::Unknown, 492 } 493 } 494 } 495