Whether you plan to change career, travel the world, follow your passion or do charitable work, good financial planning can help you make the most of the best years of your life.
By ignoring pensions, a lot of high earners are missing out on benefits that could mount up significantly in the long term.
While many people will have pension contributions included as a benefit from employment, this isn't true for everyone. A lot of high earners working in professional services – partners in a law firm, for example – or entrepreneurs running their own business, aren't currently investing through a pension.
While the tax reliefs offered on pension savings have been reduced by the government in recent years, it's still one of the most efficient ways to make long-term investments for later in life.
Aside from a small number of workplace schemes, most pensions are 'defined contribution' schemes. These operate along similar lines to most other investments – you make contributions into a fund which is invested with the aim of adding investment returns to your own contributions.
Unlike a lot of other investments, pension contributions attract tax relief – this is one of the key attractions of saving through a pension scheme. Currently, in the 2018/19 tax year, most people can get tax relief on annual contributions equivalent to their total annual earnings – up to a maximum of £40,000 each year, known as the 'annual allowance'.
But high earners need to be aware that they may be subject to a lower annual allowance if they earn more than £150,000. Broadly speaking, the annual allowance currently tapers at a rate of £1 for every £2 above the threshold, to a minimum of £10,000.
What level of pension contributions attract tax relief?
Even at the minimum tapered annual allowance, you could be entitled to £4,500 of tax relief each year. Given the long-term horizon of pension investing, where you could be making contributions and seeing your investments grow for 20 or 30 years or more, this could represent a substantial addition to your investments.
And in addition to tax relief on contributions, investments in pension funds aren't subject to income or Capital Gains Tax. This means that they should in theory grow more quickly than other types of investment.
High earners need to be aware of the lifetime allowance. If the value of your pension benefits exceeds the allowance when you start taking your money out – and in some other circumstances, such as when you turn 75 – then you may be liable to an additional lifetime allowance tax charge.
This has also been sharply reduced by the government over the last decade. It's currently £1,030,000 for the 2018/19 tax year and will rise each year in line with inflation as measured by the Consumer Prices Index (CPI). This includes not just the contributions you make but also any investment growth.
If you've previously contributed to a pension – for example through a workplace scheme from previous employment – you may already be near to, or even in breach of, the current limit. If this is true of your pension pot, then you should speak to your wealth manager or financial adviser to help you think about the right steps for you.
For many high earners, their pension pot will be just one aspect of how they intend to fund their later life. Income from property, Individual Savings Accounts (ISAs) and other tax-efficient savings will also play their part. Our article Time to Take Your Pension outlines some of the key questions to consider as you reach the age when you start thinking about taking your pension benefits.
The above commentary is based on our understanding of current tax law, which is subject to change in the future. The availability and value of any tax reliefs will depend on your individual circumstances and you should obtain tax advice before making any decisions.
Saving through a pension scheme remains one of the most efficient ways to put money aside for later in life. Even the highest earners could be getting £4,500 a year of tax relief, which can add up to a substantial sum over the long term.


A comprehensive literature study on road durability has indicated that the aging susceptibility of bituminous binders in surface layer is a key parameter determining the life time of an asphalt pavement. To simulate bitumen aging in laboratory, several test methods are currently used, including RTFOT, PAV, and RCAT (Rotating Cylinder Aging Test). In this paper, the aging of bituminous binders (unmodified and SBS polymer modified) were studied using (i) RTFOT, followed by PAV at 100°C for 8 to 48h; (ii) RTFOT, followed by PAV at 75°C for 48 to 220h; and (iii) RCAT at 163°C for 4h, then continued at 90°C for 17 to 140h. For field core sampling, several roads of different ages were selected from the Swedish LTPP (Long Term Pavement Performance) database.
The study showed that RCAT at 163°C/4h, proposed as a short-term aging test, was similar to RTFOT. The long-term aging tests PAV (100°C, 20h), PAV (75°C, 120h) and RCAT (90°C, 140h) were also more or less equivalent when applied to unmodified bitumens. However, for polymer modified bitumen, these tests were significantly different with respect to the resulted aging kinetics. As regards aging in the field, it was found that after 10 – 30 years service on the road, the extracted bitumens displayed a relatively low degree of age-hardening, to which equivalent laboratory aging durations were much shorter than that being standardized or proposed. The low degree of field aging may be attributed to low air voids in the asphalt mixtures and/or prevention of bitumen oxidation by surface sealing or overlaying. Field aging also considerably differed from laboratory aging in terms of the formation of sulfoxides and carbonyl functionalities in bitumen.
Compared to the laboratory aging, much higher level of sulfoxides but lower level of carbonyls was found for the binders aged in the field. This suggests that oxidation mechanisms in the field may not be the same as in the laboratory aging tests.


Ticketmaster have warned music and sporting fans to be on the lookout.
IF YOU'RE ON the way to a major musical or sporting event on these shores in the near future you'll need to be vigilant – there's a lot of dodgy tickets doing the rounds according to wholesaler Ticketmaster.
Tickets are big business at present, with the re-sale market on sites like Gumtree particularly popular when it comes to events of all shapes and sizes.
Now, with the likes of a sold-out All Ireland semi final and Electric Picnic (for which tickets are like gold dust) on the way in the near future, scam artists are using the opportunity to take advantage and make hay.
"We have seen a number of people very disappointed when they were turned away from recent shows because their tickets were fake," said Keith English, managing director of Ticketmaster Ireland.
For Electric Picnic in particular, fans are reminded that the event is completely sold-out and that no 'Print at Home' delivery option was given when tickets were originally on sale.
"We would urge fans to only buy tickets from official sources otherwise they cannot be sure whether the tickets are genuine or not," says English.
They could end up having their day ruined when they are refused entry to the event and be at the loss of their money as well.
English added that Ticketmaster are working closely with gardaí to combat the problem of fake tickets.
A Garda spokesman would not be drawn on the issue in detail, but told TheJournal.ie "as always we would recommend that people buy their tickets from recommended retail outlets".
Email "Keep your wits about you - there are a LOT of counterfeit tickets to big events doing the rounds".
Feedback on "Keep your wits about you - there are a LOT of counterfeit tickets to big events doing the rounds".


text:
Sit down to lunch in Los Angeles with two of Hollywood's funniest actors-Angela Kinsey and Oscar Nunez
Angela Kinsey is best known for playing 'Angela Martin' on NBC's Emmy-winning comedy The Office. She currently stars in the Hulu Original Hotwives franchise and finished an arc on the TBS Comedy Your Family or Mine earlier this year
Oscar Nunez is best known for playing accountant Oscar Martinez on NBC's "The Office." He has won an Emmy, two SAG Awards, an ALMA Award and a TV Land Award for the role, and last year, the National Hispanic Media Coalition honored him with an Impact Award. Nunez is also recognized for his large supporting role in the hit movie "The Proposal" and "The Italian Job" and for creating and starring in his own Comedy Central series, "Halfway Home."
Generously Donated by Angela Kinsey and Oscar Nunez
Valid for 2 people.
Participant must be at least 18.
This is a private meet and greet.
Subject to Angela Kinsey and Oscar Nunez availability and schedule.
Winner is responsible for the cost of lunch.
Cannot be resold or re-auctioned.
Cannot be transferred.
To be scheduled at a mutually agreed upon date.
Travel and accommodations are not included.
We expect all winning bidders and their guests to conduct themselves appropriately when attending this experience.
Polite manners and respect for the generous donor and adherence to any rules or parameters are a must.
Category: Experiences
Wine Lovers Flight & Fabulous Table Books
Kendra Scott Color Bar Party!
French Aristocratic VIP Experience in the Loire Valley
Four (4) tickets to a live audience taping of the hit CBS show "Two Broke Girls" and a private meet and greet with the Beth Behrs

redpajama_set_name: RedPajamaCommonCrawl


text:
Q: Get variable data from a Stateful widget in another Stateful widget.. Flutter Get variable data from a Stateful widget in another Stateful widget and they have no relation to one another (They are not children nor parents to each other)
I want to be able to access an array (posts) that is located in another file... You can see the comments in the code for more information
I have this stateful widget

    import 'package:flutter/material.dart';

    import 'package:saviortv/modules/fetchPosts.dart';
    import 'package:saviortv/ui/BuildPost.dart';

    class Home extends StatefulWidget {
      @override
      _HomeState createState() => _HomeState();
    }

    class _HomeState extends State<Home> {
      @override
      Widget build(BuildContext context) {
        return ListView.builder(
          itemCount: posts == null ? 0 : posts.length, // <== here posts is undefined because it doesn't exist as I want to get it from the other file (See below)
          itemBuilder: (BuildContext context, int index) {
            return buildPost(context, posts, index); //Building the posts list view
          },
        );
      }
    }

The other Stateful widget

class FetchPosts extends StatefulWidget {
  FetchPosts({Key key, this.pageNumber = 1}) : super(key: key);
  final int pageNumber;

  @override
  _FetchPostsState createState() => _FetchPostsState(pageNumber);
}

class _FetchPostsState extends State<FetchPosts> {
  _FetchPostsState(this.pageNumber);
  int pageNumber;
  List<wp.Post> posts = []; //<== I want this to be useable in the other file;

  Future<String> getPosts() async {
    var res = await fetchPosts(pageNumber);
    print(pageNumber);
    setState(() {
      posts = res;
    });
    return "Success!";
  }

  // Get _ when app loads;
  @override
  void initState() {
    super.initState();
    this.getPosts();
  }

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

How can I achieve that?

redpajama_set_name: RedPajamaStackExchange


text:
US Amateur Team West
by admin on February 18, 2014
President's Day weekend can only mean one thing in U.S. chess — it's time for the U.S. Amateur Team championship! I didn't play this year, but I went to the tournament site on Sunday afternoon to spectate. It was another great success for tournament organizer Salman Azhar, with 52 teams entered. That's an improvement over two years ago, when I played on the winning team, and there were 40 teams in the competition. The West region still has a long way to go to compete with the East region, which typically has more than 200 teams, but it would be cool if we could at least be the #2 region in the country.
The defending champions, NorCal House of Chess, won the tournament again with a 5-1 record. I would like to point out that they would have won three years in a row if my team, Forfeit by Disconnection, hadn't beaten them in 2012. With Ricardo de Guzman on first board and Ron Cusi on second board, they were darn near invincible. But this year, they pulled out another secret weapon — Grandmaster Enrico Sevillano on board one! That moved International Master de Guzman down to board two and FIDE Master Cusi down to board three. That's just sick! How can you beat that?
As expected, NorCal House of Chess raced out to a 5-0 start, but then Bay Area Berkeley United did the impossible and brought them down. Here's how it happened:
Sevillano (2539) drew Cameron Wheeler (2300)
De Guzman (2502) lost to Albert Lu (2240)
Cusi (2296) beat Teemu Virtanen (2105). Cusi was a stud, as always. He was one of two players to go 6-0 in the tournament.
Shafieen Ibrahim (1403) lost to Josiah Stearman (2071).
This upset created a five-way tie at 5-1, but the tiebreakers went to NorCal House of Chess.
One of the beauties of the amateur team format is the eternal debate over which is better: a "stacked team," like NorCal House of Chess, or a "balanced team," like Bay Area Berkeley United. The stacked team has two or three super-strong players, but the average rating has to be below 2200, so they are forced to play a relatively weak player on board four. To win the match, the balanced team has to win the "gift" game on board four (which isn't always so easy) and then somehow hold even on the other three boards. You need someone to be a hero, like Albert Lu beating Ricardo de Guzman. I wish I'd seen that game, because de Guzman almost never loses to lower-rated players.
I'd say that the bottom line is that the stacked team is more reliable. NorCal House of Chess will always be a favorite to win the tournament, as long as they have de Guzman and Cusi (and now Sevillano!). However, in any given year a balanced team could get hot. You need the right team chemistry and you need heroes to step up at the right times. That was what happened two years ago, and I was thrilled to be a part of it. It happened again for Bay Area Berkeley United, but the tiebreaks didn't go their way.
By the way, I noticed one other interesting thing in the crosstable: none of the top five teams lost or even drew a match against anybody outside the top five. So it was almost like two tournaments — the top five and everybody else. The other three teams that tied for first were "Undercover Llamas" (the UCLA team), "Abusement Park" (a team of young masters and experts), and "Nohunterhere" (the Liu Chess Club team).
I was invited to play two rounds as a sub for Mike Splane on Monday (he had classes to teach) but I had other commitments and had to decline. Mike's team, "Mikoko," had a somewhat disappointing tournament, going 4-2.
Another team with a performance worth mentioning was "Sentestrat," which was very happy with a 4-2 score because it gave them the top under-2000 prize. One of their players was Simon Rubinstein-salzedo, an occasional reader of this blog, who also came up with the name. It was surely the most obscure name of any team at the tournament. I asked Simon to explain it to me, and about ten minutes and several blackboards later (just kidding) I somewhat had the idea. Bottom line: Look it up on Google.
Congratulations to NorCal House of Chess and good luck to them in the playoff against the East, South, and North champions! Last NorCal won the playoff and became national champions. Can they turn themselves into a dynasty?
Tagged as: Albert Lu, balanced, Cameron Wheeler, dynasty, Enrico Sevillano, NorCal House of Chess, Ricardo de Guzman, Ronald Cusi, Simon Rubinstein-Salzedo, stacked
Ashish February 20, 2014 at 6:38 pm
Some great "chess celebrity" sightings at this tournament – Rochelle Ballantyne, USCF President Ruth Haring, Luke Harmon-Vellotti, Sam Sloan(!). And of course a ton of rising stars and future GMs, perhaps including Simon.
Simon February 21, 2014 at 8:42 am
You definitely do wish you had seen the De Guzman vs. Lu game, as it was quite the spectacle. It was the last game in the tournament to finish, and it predictably drew a large crowd. De Guzman sacrificed two pawns to get a dangerous attacking formation: his queen on h6 and bishop on e5 were tying down the black king on g8, pawns on f7, g6, h5, knight on g7, and bishop on f8. The knight can't move because of mate on h8, and the bishop can't move because of mate on g7. Furthermore, there was always the idea of getting a rook to the eighth rank, pinning the bishop and allowing Qxg7#.
But Lu was able to get his own attack going, with a queen and a rook. It didn't lead to mate, but it tied down enough of De Guzman's pieces that Lu was able to create further counterplay with his passed pawn on the queenside. (I think it was a b-pawn.) Eventually, that was enough to force De Guzman to abandon his attacking formation. Most of the pieces were traded, and Lu ended up with two extra pawns in a bishop (same color) endgame, which he won convincingly in the blitz finale.
Also, thanks for the mention! Perhaps I'll try to come up with a slightly less obscure team name next time around, as the team name failed to attract any collaborators for my idea of a CGT/chess research project. We were indeed delighted to win Top U2000, as that was our goal for the tournament.
Daily Chess News Links February 19, 2014 – ChessCafe.com
Previous post: Accidental Endgame Study
Next post: Spam woes continue


Our story - Hamwells - The search for sustainable shower comfort.
Rob Chömpff is thinking about making showering sustainable. In 2015 the moment was there to actually build this innovative sustainable shower. Therefore, in 2015 Hamwells was founded by Rob Chömpff together with co-founders Eric van Duin en Wout Chömpff. Wout has great knowledge about marketing and Eric has both a technical background and also a team of smart engineers. Together they started Hamwells to make this dream come true.
Hamwells receives many national and international awards. There is much international interest since water scarcity is a major topic. Treehugger writes a nice article about us.
Hamwells launches the HomeSpa at the TechCrunch Disrupt event in London. We are showing our product to the world audience.
Hamwells presents the HomeSpa at a large fair. Not only in our own booth but also in Remeha's.
The first HomeSpa shower systems are shipped and installed.
Many pioneers have joined us. The Homespas are produced by VDL in Eindhoven in close coorporation with Hamwells.
We will develop the Blue for a large audience. Designed to be used as any other shower, but still saving greatly on energy costs.
The Blue is our new energy saving shower with integrated heat exchanger. This shower is no less then 2,4x more efficient compared to a normal shower.
Are you searching for the sustainable shower experience? Do you want to change showering, together with thousands of others?
Join us on our journey! We would love to hear from you.


New phase of homesites just opened! Act Fast to get in on this amazing new Spring Hill neighborhood!
Transport yourself to a peaceful community in the country, without ever leaving the conveniences of city life. Welcome to Harvest Point, a value oriented master-planned development featuring miles of walking trails, a resort-style swimming pool, community gardens, dog parks, and more. Located next to highly-rated Spring Hill Middle School and 15 minutes from Cool Springs, you will want to come home to the tranquility of this high quality, affordable community.
Request an appointment NOW to get started on your new dream home in Harvest Point!


Wake up rested and fresh, regardless of the season and outside temperature. The peaceful and deep sleep is essential for health and mood during the day. But to be the sleep undisturbed it is necessary to secure an appropriate environment. Often you are not sure what kind of comforter set to choose in order not to feel very hot or cold at night. Forget the heavy blankets in the winter. How much warm the comforter keeps is not confused with its weight. A light blanket full of fluff silicone has excellent insulating qualities. We can offer such duvets and comforters. Silicone fluff is an environmentally friendly product, hypoallergenic and antibacterial. Silicone fibers are characterized by softness, elasticity, and ability for maximum filling of forms. Quilt filled with silicon do not deform and wrinkle, they are washable, do not keep dust and retain their shape even after prolonged use. The warmth of the blanket is determined by the weight of silicon down per square meter. Summer blanket is with weight 60-150 grams per square meter, spring and autumn coverlet is with weight 200 grams per square meter and winter quilt is with weight 300 grams per square meter. With its fine fiber they easily pass the air, do not brew and do not overheat the body. They provide the perfect temperature for sleep. To protect the coverlet of dirt is better to use a duvet cover set. Duvet cover protects the quilt and so it rarely needs to be cleaned. We also offer a wide selection of bedding sets to complement and facilitate your choice. Besides filling important for the quilt is the material from which it is produced. Coverlet sets made from sateen are soft, tight and very beautiful. Sateen fabric is made of 100% pure cotton with 200 TC (thread counts) per square inch and special weaving – four over / one under threads. Design varies in different colors and effects, giving a huge choice of the most appropriate range corresponding to the interior of your bedroom.


Dave Zirin, author of Jim Brown: Last Man Standing, joined Andy and Jeff to discuss his book. He talked about how intimidating Brown can still be and how complicated his public life has been. The book details both sides of Brown's masculinity in a very honest appraisal. They also discussed Brown's views on racial injustice in the United States.


I am so excited to begin my second year teaching first grade at OPS! I graduated with a bachelor's in English from Sacred Heart University in 2013 and received my Master's degree in Elementary Education in 2014. I welcome any opportunity to foster independence, confidence, and a love of learning in each of my students. I feel so lucky to be a part of such a wonderful, warm Oradell community!


Looking for a way to take boring rice and turn it into a full meal?
My Greek Rice Pilaf is the perfect dish!
I used Thai Jasmine rice but you can use any type of rice you prefer. I love making this with basmati or even long grain rice.
Just make sure you cook the rice according to package directions.
I added finely grated carrots, then finished off the dish with fresh squeezed lemon juice and zest, minced Italian parsley and lots of crumbled feta cheese.
Don't forget the drizzle of extra virgin olive oil.
This is a wonderful, flavorful, meal.
You could eat this as a side dish, but I love having it for a nice lunch with a side salad.
Bring broth, pepper, salt, and 1/2 of the grated carrot to boil. Stir in rice, cover and cook over simmer for 15 minutes. Remove from fire and allow to steam covered 10 minutes.
Flake rice with a fork, add remaining ingredients, stir well. Drizzle with olive oil and serve warm.


text:
Welcome back, {{ userEmail }}

		{{ list.title }}

	create a new list!

redpajama_set_name: RedPajamaGithub


The economical usage of primary energy today is one of the most emphatically discussed subjects and will in the future more than ever impact development of new technologies. The Smart Home Energy Assistant (SHEA) is an accomplishment of the SerCHo-Project to give direction to the reduction of in-house energy consumption. Contrary to attempting to improve the energy related physics of buildings and appliances, the core idea of SHEA is to make energy consumption more transparent to the user and to enhance energy relevant in-house processes in an integrated, intelligent and – as far as desirable – automated way, with respect to interdependencies between the various electrical appliances, heating and airing.
The SHEA provides numerous metering capabilities and a freely configurable rule base for the automatic optimization of energy usage. Within the Smart Metering functionality, the SHEA monitors all appliances connected to the home server where the service is installed and records consumption data. The Metering supports already accepted protocols, such as Universal Plug and Play (UPnP), ZigBee, and DigitalSTROM that have been enhanced by profiles to communication energy consumptions. As one part of the project a prototype of a smart energy monitoring plug has been developed that can communicate the energy consumption in real-time as well as switch appliances or dim lights.
The metering data can be visualized in consumption graphs over a user-defined period of time. In a clear fashion, the user can comprehend and trace energy usage of each appliance or appliance group, which may e.g. be all electrical devices in a specific room. This data can well be used as a basis for future decisions concerning for example replacement of old or energy-hungry devices, modification of personal behavior or configuration of SHEA automation rules.
The powerful SHEA rule engine facilitates automation of in-house processes with any degree of complexity. Basic rules that are composed of a "if/when-component" or precondition and a "then-component" the result as in "If no one is in the living room-turn off all lights in the living room!" can be implemented by the user via the SHEA user interface as quick and simple as complex, context sensitive automations. The latter may simultaneously refer to various preconditions from e.g. the time- and localization-domain and may furthermore include identification of inhabitants, the actual overall energy-consumption and third party information.
The SHEA is capable of learning from the past and proactive advise the user of where energy saving potentials in his household are at hand. Like all SerCHo Services, the SHEA provides a multi-modal user interface granting a high degree of front end ergonomics. Energy saving potentials are conveniently and with respect to the many energy relevant interdependencies, pooled together and formerly lost energy is economized.


text:
commonplacebook.com
The online journal, notebook and playground of Hawthorn Mineart
The Longest Joke in the World
by Hawthorn Mineart, under Jokes
You'll never have to go farther for a cheesy punchline than in this joke… but it's worth it.
Bob Hill and his new wife Betty were vacationing in Europe, as it happens, near Transylvania. They were driving in a rental car along a rather deserted highway. It was late, and raining very hard. Bob could barely see 20 feet in front of the car.
Suddenly the car skids out of control! Bob attempts to control the car, but to no avail! The car swerves and smashes into a tree.
Moments later, Bob shakes his head to clear the fog. Dazed, he looks over at the passenger seat and sees his wife unconscious, with her head bleeding! Despite the rain and unfamiliar countryside, Bob knows he has to carry her to the nearest phone.
Bob carefully picks his wife up and begins trudging down the road. After a short while, he sees a light. He heads towards the light, which is coming from an old, large house. He approaches the door and knocks.
A minute passes. A small, hunched man opens the door. Bob immediately blurts, "Hello, my name is Bob Hill, and this is my wife Betty. We've been in a terrible accident, and my wife has been seriously hurt. Can I please use your phone??"
"I'm sorry," replied the hunchback, "but we don't have a phone. My master is a doctor; come in and I will get him!"
Bob brings his wife in. An elegant man comes down the stairs. "I'm afraid my assistant may have misled you. I am not a medical doctor; I am a scientist. However, it is many miles to the nearest clinic, and I have had a basic medical training. I will see what I can do. Igor, bring them down to the laboratory."
With that, Igor picks up Betty and carries her downstairs, with Bob following closely. Igor places Betty on a table in the lab. Bob collapses from exhaustion and his own injuries, so Igor places Bob on an adjoining table.
After a brief examination, Igor's master looks worried. "Things are serious, Igor. Prepare a transfusion." Igor and his master work feverishly, but to no avail. Bob and Betty Hill are no more.
The Hills' deaths upset Igor's master greatly. Wearily, he climbs the steps to his conservatory, which houses his grand piano. For it is here that he has always found solace. He begins to play, and a stirring, almost haunting, melody fills the house.
Meanwhile, Igor is still in the lab tidying up. His eyes catch movement, and he notices the fingers on Betty's hand twitch, keeping time to the haunting piano music. Stunned, he watches as Bob's arm begins to rise, marking the beat! He is further amazed as Betty sits straight up!
Unable to contain himself, he dashes up the stairs to the conservatory.
He bursts in and shouts to his master:
"Master, Master! … The Hills are alive with the sound of music!
Tags: jokes, longest joke, Sound of Music
Josh June 10th, 2008
lol i liked the ending but it is not the longest loke i know much longer jokes 😛
Archives Select Month October 2019 (1) May 2019 (1) April 2019 (3) March 2019 (1) December 2016 (1) October 2016 (1) May 2016 (1) February 2016 (1) December 2015 (1) October 2015 (4) September 2015 (1) August 2015 (1) July 2015 (1) May 2015 (1) March 2015 (1) February 2015 (2) January 2015 (10) December 2014 (3) November 2014 (5) October 2014 (6) September 2014 (1) August 2014 (1) July 2014 (2) June 2014 (5) May 2014 (6) March 2014 (2) February 2014 (5) January 2014 (6) December 2013 (7) November 2013 (7) October 2013 (17) September 2013 (8) August 2013 (7) July 2013 (6) June 2013 (13) May 2013 (12) April 2013 (24) March 2013 (14) February 2013 (8) January 2013 (9) December 2012 (8) November 2012 (7) October 2012 (9) September 2012 (12) August 2012 (9) July 2012 (3) June 2012 (7) May 2012 (13) April 2012 (12) March 2012 (20) February 2012 (11) January 2012 (16) December 2011 (5) November 2011 (16) October 2011 (18) September 2011 (15) August 2011 (25) July 2011 (26) June 2011 (29) May 2011 (27) April 2011 (34) March 2011 (37) February 2011 (43) January 2011 (25) December 2010 (29) November 2010 (21) October 2010 (49) September 2010 (40) August 2010 (57) July 2010 (33) June 2010 (23) May 2010 (25) April 2010 (40) March 2010 (45) February 2010 (31) January 2010 (41) December 2009 (22) November 2009 (22) October 2009 (29) September 2009 (29) August 2009 (37) July 2009 (31) June 2009 (34) May 2009 (28) April 2009 (35) March 2009 (38) February 2009 (37) January 2009 (46) December 2008 (56) November 2008 (42) October 2008 (52) September 2008 (54) August 2008 (34) July 2008 (38) June 2008 (51) May 2008 (32) April 2008 (38) March 2008 (41) February 2008 (36) January 2008 (52) December 2007 (49) November 2007 (42) October 2007 (48) September 2007 (55) August 2007 (60) July 2007 (78) June 2007 (69) May 2007 (57) April 2007 (82) March 2007 (97) February 2007 (114) January 2007 (72) December 2006 (44) November 2006 (52) October 2006 (79) September 2006 (96) August 2006 (58) July 2006 (45) June 2006 (53) May 2006 (52) April 2006 (48) March 2006 (65) February 2006 (82) January 2006 (87) December 2005 (94) November 2005 (38) October 2005 (52) September 2005 (125) August 2005 (61) July 2005 (42) June 2005 (45) May 2005 (49) April 2005 (46) March 2005 (74) February 2005 (43) January 2005 (45) December 2004 (37) November 2004 (79) October 2004 (54) September 2004 (42) August 2004 (26) July 2004 (37) June 2004 (47) May 2004 (45) April 2004 (39) March 2004 (56) February 2004 (56) January 2004 (57) December 2003 (46) November 2003 (50) October 2003 (58) September 2003 (65) August 2003 (51) July 2003 (42) June 2003 (40) May 2003 (45) April 2003 (36) March 2003 (51) February 2003 (46) January 2003 (18) December 2002 (70) November 2002 (26) October 2002 (24) September 2002 (22) August 2002 (27) July 2002 (20) June 2002 (26) May 2002 (16) April 2002 (16) March 2002 (14) February 2002 (32) January 2002 (107) December 2001 (12) November 2001 (16) October 2001 (17) September 2001 (11) August 2001 (9) July 2001 (15) June 2001 (16) May 2001 (12) April 2001 (8) March 2001 (7) February 2001 (26) January 2001 (6) December 2000 (21) November 2000 (4) October 2000 (2) September 2000 (3) August 2000 (5) July 2000 (2) June 2000 (9) May 2000 (1) April 2000 (4) February 2000 (85) January 2000 (11) December 1999 (23) November 1999 (1) October 1999 (3) September 1999 (66) August 1999 (1) July 1999 (1) June 1999 (2) May 1999 (2) March 1999 (21) February 1999 (31) December 1998 (11) November 1998 (2) October 1998 (1) August 1998 (3) July 1998 (3) June 1998 (1) April 1998 (1) March 1998 (4) February 1998 (25) January 1998 (4) December 1997 (17) September 1997 (4) May 1997 (3) April 1997 (1) March 1997 (6) February 1997 (24) December 1996 (14) July 1996 (1) May 1996 (1) February 1996 (15) December 1995 (1) June 1995 (1) February 1995 (5) January 1995 (1)
books (144) Christmas (52) cooking (81) current events (85) election 2008 (108) feminism (65) food (84) funny (118) funny lists (225) funny video (69) games (58) George W. Bush (108) health (51) holidays (48) homophobia (117) humor (179) Indiana (73) Indianapolis (107) inspiration (50) jokes (348) journal (204) knitting (48) lgbt issues (106) lists (60) literature (98) marriage equality (81) movies (88) music (103) photos (317) poetry (50) politics (199) quotes (60) reading lists (57) Recently Read (148) recipes (108) religion (104) republicans (50) same-sex marriage (83) songs (64) television (123) traveling (88) True Stories (55) video (58) weekend update (92) writing (80)
My Design Work
Big Things Photos
"Big Things" In Indianapolis
Lost "Big Things" in Indianapolis
Inflated "Big Things" In Indianapolis
"Big Things" in Indiana
"Big Things" in Muncie, Indiana
"Big Things" Midwest Road Trip, part 1
"Big Things" Daytrip to Louisville, Kentucky
"Big Things" Road Trip to Kansas
"Big Things" Route 66 Road Trip 2007
Dinosaurland in Winchester, Virginia
"Big Things" Around the United States
My Art Projects
My Knitting Projects
Odd Holidays
Low Carb Dishes
Big Things
Feminism & Women's Issues
Funny Websites
Light Bulb Jokes
Crushable
© 2020 commonplacebook.com. theme: Serena, by Kay Belardinelli


text:
/*
 * Jitsi, the OpenSource Java VoIP and Instant Messaging client.
 *
 * Distributable under LGPL license.
 * See terms of license at gnu.org.
 */
package org.jitsi.impl.neomedia;

import java.beans.*;
import java.util.*;

import javax.media.*;
import javax.media.control.*;
import javax.media.format.*;

import org.jitsi.impl.neomedia.device.*;
import org.jitsi.impl.neomedia.rtp.*;
import org.jitsi.impl.neomedia.transform.csrc.*;
import org.jitsi.impl.neomedia.transform.dtmf.*;
import org.jitsi.service.configuration.*;
import org.jitsi.service.libjitsi.*;
import org.jitsi.service.neomedia.*;
import org.jitsi.service.neomedia.codec.*;
import org.jitsi.service.neomedia.device.*;
import org.jitsi.service.neomedia.event.*;
import org.jitsi.util.*;
import org.jitsi.util.event.*;

/**
 * Extends <tt>MediaStreamImpl</tt> in order to provide an implementation of
 * <tt>AudioMediaStream</tt>.
 *
 * @author Lyubomir Marinov
 * @author Emil Ivov
 */
public class AudioMediaStreamImpl
    extends MediaStreamImpl
    implements AudioMediaStream,
               PropertyChangeListener
{
    /**
     * List of RTP format strings which are supported by SIP Communicator in
     * addition to the JMF standard formats.
     *
     * @see #registerCustomCodecFormats(StreamRTPManager)
     */
    private static final AudioFormat[] CUSTOM_CODEC_FORMATS
        = new AudioFormat[]
                {
                    /*
                     * these formats are specific, since RTP uses format numbers
                     * with no parameters.
                     */
                    new AudioFormat(
                            Constants.ALAW_RTP,
                            8000,
                            8,
                            1,
                            Format.NOT_SPECIFIED,
                            AudioFormat.SIGNED),
                    new AudioFormat(
                            Constants.G722_RTP,
                            8000,
                            Format.NOT_SPECIFIED /* sampleSizeInBits */,
                            1)
                };

    /**
     * The <tt>Logger</tt> used by the <tt>AudioMediaStreamImpl</tt> class and
     * its instances for logging output.
     */
    private static final Logger logger
        = Logger.getLogger(AudioMediaStreamImpl.class);

    /**
     * A <tt>PropertyChangeNotifier<tt> which will inform this
     * <tt>AudioStream</tt> if a selected audio device (capture, playback or
     * notification device) has changed. We want to listen to these events,
     * especially for those generated after the <tt>AudioSystem</tt> has
     * changed.
     */
    private final PropertyChangeNotifier audioSystemChangeNotifier;

    /**
     * The listener that gets notified of changes in the audio level of
     * remote conference participants.
     */
    private CsrcAudioLevelListener csrcAudioLevelListener;

    /**
     * The list of DTMF listeners.
     */
    private final List<DTMFListener> dtmfListeners
        = new ArrayList<DTMFListener>();

    /**
     * The transformer that we use for sending and receiving DTMF packets.
     */
    private DtmfTransformEngine dtmfTransformEngine;

    /**
     * The listener which has been set on this instance to get notified of
     * changes in the levels of the audio that the local peer/user is sending to
     * the remote peer(s).
     */
    private SimpleAudioLevelListener localUserAudioLevelListener;

    /**
     * The <tt>VolumeControl</tt> implementation which is to control the volume
     * (level) of the audio received in/by this <tt>AudioMediaStream</tt> and
     * played back.
     */
    private VolumeControl outputVolumeControl;

    /**
     * The listener which has been set on this instance to get notified of
     * changes in the levels of the audios that the local peer/user is receiving
     * from the remote peer(s).
     */
    private SimpleAudioLevelListener streamAudioLevelListener;

    private SsrcTransformEngine ssrcTransformEngine;

    /**
     * Initializes a new <tt>AudioMediaStreamImpl</tt> instance which will use
     * the specified <tt>MediaDevice</tt> for both capture and playback of audio
     * exchanged via the specified <tt>StreamConnector</tt>.
     *
     * @param connector the <tt>StreamConnector</tt> the new instance is to use
     * for sending and receiving audio
     * @param device the <tt>MediaDevice</tt> the new instance is to use for
     * both capture and playback of audio exchanged via the specified
     * <tt>StreamConnector</tt>
     * @param srtpControl a control which is already created, used to control
     * the srtp operations.
     */
    public AudioMediaStreamImpl(
            StreamConnector connector,
            MediaDevice device,
            SrtpControl srtpControl)
    {
        super(connector, device, srtpControl);

        MediaService mediaService = LibJitsi.getMediaService();

        if (mediaService instanceof PropertyChangeNotifier)
        {
            audioSystemChangeNotifier = (PropertyChangeNotifier) mediaService;
            audioSystemChangeNotifier.addPropertyChangeListener(this);
        }
        else
            audioSystemChangeNotifier = null;
    }

    /**
     * Adds a <tt>DTMFListener</tt> to this <tt>AudioMediaStream</tt> which is
     * to receive notifications when the remote party starts sending DTMF tones
     * to us.
     *
     * @param listener the <tt>DTMFListener</tt> to register for notifications
     * about the remote party starting sending of DTM tones to this
     * <tt>AudioMediaStream</tt>
     * @see AudioMediaStream#addDTMFListener(DTMFListener)
     */
    public void addDTMFListener(DTMFListener listener)
    {
        if((listener != null) && !dtmfListeners.contains(listener))
            dtmfListeners.add(listener);
    }

    /**
     * In addition to calling
     * {@link MediaStreamImpl#addRTPExtension(byte, RTPExtension)}
     * this method enables sending of CSRC audio levels. The reason we are
     * doing this here rather than in the super class is that CSRC levels only
     * make sense for audio streams so we don't want them enabled in any other
     * type.
     *
     * @param extensionID the ID assigned to <tt>rtpExtension</tt> for the
     * lifetime of this stream.
     * @param rtpExtension the RTPExtension that is being added to this stream.
     */
    @Override
    public void addRTPExtension(byte extensionID, RTPExtension rtpExtension)
    {
        if (rtpExtension != null)
            super.addRTPExtension(extensionID, rtpExtension);

        // Do go on even if the extension is null, to make sure that the
        // currently active extensions are configured.

         // The method invocation may add, remove, or replace the value
         // associated with extensionID. Consequently, we have to update
         // csrcEngine with whatever is in activeRTPExtensions eventually.
        CsrcTransformEngine csrcEngine = getCsrcEngine();
        SsrcTransformEngine ssrcEngine = this.ssrcTransformEngine;

        if ((csrcEngine != null) || (ssrcEngine != null))
        {
            Map<Byte,RTPExtension> activeRTPExtensions
                = getActiveRTPExtensions();
            Byte csrcExtID = null;
            MediaDirection csrcDir = MediaDirection.INACTIVE;
            Byte ssrcExtID = null;
            MediaDirection ssrcDir = MediaDirection.INACTIVE;

            if ((activeRTPExtensions != null)
                    && !activeRTPExtensions.isEmpty())
            {
                for (Map.Entry<Byte,RTPExtension> e
                        : activeRTPExtensions.entrySet())
                {
                    RTPExtension ext = e.getValue();
                    String uri = ext.getURI().toString();

                    if (RTPExtension.CSRC_AUDIO_LEVEL_URN.equals(uri))
                    {
                        csrcExtID = e.getKey();
                        csrcDir = ext.getDirection();
                    }
                    else if (RTPExtension.SSRC_AUDIO_LEVEL_URN.equals(uri))
                    {
                        ssrcExtID = e.getKey();
                        ssrcDir = ext.getDirection();
                    }
                }
            }

            if (csrcEngine != null)
            {
                csrcEngine.setCsrcAudioLevelExtensionID(
                        (csrcExtID == null) ? -1 : csrcExtID.byteValue(),
                        csrcDir);
            }
            if (ssrcEngine != null)
            {
                ssrcEngine.setSsrcAudioLevelExtensionID(
                        (ssrcExtID == null) ? -1 : ssrcExtID.byteValue(),
                        ssrcDir);

                if (ssrcDir.allowsSending())
                {
                    AudioMediaDeviceSession deviceSession = getDeviceSession();
                    if (deviceSession != null)
                    {
                        deviceSession.enableOutputSSRCAudioLevels(
                                true,
                                ssrcExtID == null ? -1 : ssrcExtID);
                    }
                }
            }
        }
    }

    /**
     * Delivers the <tt>audioLevels</tt> map to whoever is interested. This
     * method is meant for use primarily by the transform engine handling
     * incoming RTP packets (currently <tt>CsrcTransformEngine</tt>).
     *
     * @param audioLevels an array mapping CSRC IDs to audio levels in
     * consecutive elements.
     */
    public void audioLevelsReceived(long[] audioLevels)
    {
        CsrcAudioLevelListener csrcAudioLevelListener
            = this.csrcAudioLevelListener;

        if (csrcAudioLevelListener != null)
            csrcAudioLevelListener.audioLevelsReceived(audioLevels);
    }

    /**
     * Releases the resources allocated by this instance in the course of its
     * execution and prepares it to be garbage collected.
     *
     * @see MediaStream#close()
     */
    @Override
    public void close()
    {
        super.close();

        if (dtmfTransformEngine != null)
        {
            dtmfTransformEngine.close();
            dtmfTransformEngine = null;
        }
        if (ssrcTransformEngine != null)
        {
            ssrcTransformEngine.close();
            ssrcTransformEngine = null;
        }

        if (audioSystemChangeNotifier != null)
            audioSystemChangeNotifier.removePropertyChangeListener(this);
    }

    /**
     * Performs any optional configuration on the <tt>BufferControl</tt> of the
     * specified <tt>RTPManager</tt> which is to be used as the
     * <tt>RTPManager</tt> of this <tt>MediaStreamImpl</tt>.
     *
     * @param rtpManager the <tt>RTPManager</tt> which is to be used by this
     * <tt>MediaStreamImpl</tt>
     * @param bufferControl the <tt>BufferControl</tt> of <tt>rtpManager</tt> on
     * which any optional configuration is to be performed
     */
    @Override
    protected void configureRTPManagerBufferControl(
            StreamRTPManager rtpManager,
            BufferControl bufferControl)
    {
        /*
         * It appears that, if we don't do the following, the RTPManager won't
         * play.
         */
        ConfigurationService cfg = LibJitsi.getConfigurationService();
        /*
         * There isn't a particular reason why we'd choose 100 or 120. It may be
         * that 120 is divided by 30 (which is used by iLBC, for example) and
         * 100 isn't. Anyway, what matters most is that it's proportional to the
         * latency of the playback.
         */
        long bufferLength = 120;

        if (cfg != null)
        {
            String bufferLengthStr
                = cfg.getString(PROPERTY_NAME_RECEIVE_BUFFER_LENGTH);

            try
            {
                if ((bufferLengthStr != null) && (bufferLengthStr.length() > 0))
                    bufferLength = Long.parseLong(bufferLengthStr);
            }
            catch (NumberFormatException nfe)
            {
                logger.warn(
                        bufferLengthStr
                            + " is not a valid receive buffer length/long value",
                        nfe);
            }
        }

        bufferLength = bufferControl.setBufferLength(bufferLength);
        if (logger.isTraceEnabled())
            logger.trace("Set receiver buffer length to " + bufferLength);

        /*
         * The threshold should better be half of the bufferLength rather than
         * equal to it (as it used to be before). Whatever it is, FMJ/JMF
         * doesn't take it into account anyway.
         */
        long minimumThreshold = bufferLength / 2;

        bufferControl.setEnabledThreshold(minimumThreshold > 0);
        bufferControl.setMinimumThreshold(minimumThreshold);
    }

    /**
     * A stub that allows audio oriented streams to create and keep a reference
     * to a <tt>DtmfTransformEngine</tt>.
     *
     * @return a <tt>DtmfTransformEngine</tt> if this is an audio oriented
     * stream and <tt>null</tt> otherwise.
     */
    @Override
    protected DtmfTransformEngine createDtmfTransformEngine()
    {
        if (dtmfTransformEngine == null)
        {
            ConfigurationService cfg = LibJitsi.getConfigurationService();
            if (cfg == null || !cfg.getBoolean(
                    AudioMediaStream.DISABLE_DTMF_HANDLING_PNAME, false))
            {
                dtmfTransformEngine = new DtmfTransformEngine(this);
            }
        }
        return dtmfTransformEngine;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    protected SsrcTransformEngine createSsrcTransformEngine()
    {
        if (ssrcTransformEngine == null)
            ssrcTransformEngine = new SsrcTransformEngine(this);
        return ssrcTransformEngine;
    }

    /**
     * {@inheritDoc}
     *
     * Makes sure that {@link #localUserAudioLevelListener} and
     * {@link #streamAudioLevelListener} which have been set on this
     * <tt>AudioMediaStream</tt> will be automatically updated when a new
     * <tt>MediaDevice</tt> is set on this instance.
     */
    @Override
    protected void deviceSessionChanged(
            MediaDeviceSession oldValue,
            MediaDeviceSession newValue)
    {
        try
        {
            if (oldValue != null)
            {
                AudioMediaDeviceSession deviceSession
                    = (AudioMediaDeviceSession) oldValue;

                if (localUserAudioLevelListener != null)
                    deviceSession.setLocalUserAudioLevelListener(null);
                if (streamAudioLevelListener != null)
                    deviceSession.setStreamAudioLevelListener(null);
            }
            if (newValue != null)
            {
                AudioMediaDeviceSession deviceSession
                    = (AudioMediaDeviceSession) newValue;

                if (localUserAudioLevelListener != null)
                {
                    deviceSession.setLocalUserAudioLevelListener(
                            localUserAudioLevelListener);
                }
                if (streamAudioLevelListener != null)
                {
                    deviceSession.setStreamAudioLevelListener(
                            streamAudioLevelListener);
                }

                /*
                 * The output volume (level) of the newValue will begin to be
                 * controlled by the outputVolumeControl of this instance (of
                 * course). The output volume (level) of the oldValue will
                 * continue to be controlled by the outputVolumeControl of this
                 * instance (as well). The latter behaviour should not present a
                 * problem and keeps the design and implementation as simple as
                 * possible.
                 */
                if (outputVolumeControl != null)
                    deviceSession.setOutputVolumeControl(outputVolumeControl);
            }
        }
        finally
        {
            super.deviceSessionChanged(oldValue, newValue);
        }
    }

    /**
     * Delivers the <tt>DTMF</tt> tones. The method is meant for use primarily
     * by the transform engine handling incoming RTP packets (currently
     * <tt>DtmfTransformEngine</tt>).
     *
     * @param tone the new tone
     * @param end <tt>true</tt> if the tone is to be ended or <tt>false</tt> to
     * be started
     */
    public void fireDTMFEvent(DTMFRtpTone tone, boolean end)
    {
        DTMFToneEvent ev = new DTMFToneEvent(this, tone);

        for (DTMFListener listener : dtmfListeners)
        {
            if(end)
                listener.dtmfToneReceptionEnded(ev);
            else
                listener.dtmfToneReceptionStarted(ev);
        }
    }

    /**
     * Returns the <tt>MediaDeviceSession</tt> associated with this stream
     * after first casting it to <tt>AudioMediaDeviceSession</tt> since this is,
     * after all, an <tt>AudioMediaStreamImpl</tt>.
     *
     * @return the <tt>AudioMediaDeviceSession</tt> associated with this stream.
     */
    @Override
    public AudioMediaDeviceSession getDeviceSession()
    {
        return (AudioMediaDeviceSession) super.getDeviceSession();
    }

    /**
     * Returns the last audio level that was measured by the underlying device
     * session for the specified <tt>ssrc</tt> (where <tt>ssrc</tt> could also
     * correspond to our local sync source identifier).
     *
     * @param ssrc the SSRC ID whose last measured audio level we'd like to
     * retrieve.
     *
     * @return the audio level that was last measured for the specified
     * <tt>ssrc</tt> or <tt>-1</tt> if no level has been cached for that ID.
     */
    public int getLastMeasuredAudioLevel(long ssrc)
    {
        AudioMediaDeviceSession devSession = getDeviceSession();

        if (devSession == null)
            return -1;
        else if (ssrc == getLocalSourceID())
            return devSession.getLastMeasuredLocalUserAudioLevel();
        else
            return devSession.getLastMeasuredAudioLevel(ssrc);
    }

    /**
     * The priority of the audio is 3, which is meant to be higher than
     * other threads and higher than the video one.
     * @return audio priority.
     */
    @Override
    protected int getPriority()
    {
        return 3;
    }

    /**
     * Receives and reacts to property change events: if the selected device
     * (for capture, playback or notifications) has changed, then create or
     * recreate the streams in order to use it. We want to listen to these
     * events, especially for those generated after the audio system has
     * changed.
     *
     * @param ev The event which may contain a audio system change event.
     */
    public void propertyChange(PropertyChangeEvent ev)
    {
        /*
         * FIXME It is very wrong to do the following upon every
         * PropertyChangeEvent fired by MediaServiceImpl. Moreover, it does not
         * seem right that we'd want to start this MediaStream upon a
         * PropertyChangeEvent (regardless of its specifics).
         */
        if (sendStreamsAreCreated)
            recreateSendStreams();
        else
            start();
    }

    /**
     * Registers {@link #CUSTOM_CODEC_FORMATS} with a specific
     * <tt>RTPManager</tt>.
     *
     * @param rtpManager the <tt>RTPManager</tt> to register
     * {@link #CUSTOM_CODEC_FORMATS} with
     * @see MediaStreamImpl#registerCustomCodecFormats(StreamRTPManager)
     */
    @Override
    protected void registerCustomCodecFormats(StreamRTPManager rtpManager)
    {
        super.registerCustomCodecFormats(rtpManager);

        for (AudioFormat format : CUSTOM_CODEC_FORMATS)
        {
            if (logger.isDebugEnabled())
            {
                logger.debug(
                        "registering format " + format + " with RTPManager");
            }
            /*
             * NOTE (mkoch@rowa.de): com.sun.media.rtp.RtpSessionMgr.addFormat
             * leaks memory, since it stores the Format in a static Vector.
             * AFAIK there is no easy way around it, but the memory impact
             * should not be too bad.
             */
            rtpManager.addFormat(
                    format,
                    MediaUtils.getRTPPayloadType(
                            format.getEncoding(),
                            format.getSampleRate()));
        }
    }

    /**
     * Removes <tt>listener</tt> from the list of <tt>DTMFListener</tt>s
     * registered with this <tt>AudioMediaStream</tt> to receive notifications
     * about incoming DTMF tones.
     *
     * @param listener the <tt>DTMFListener</tt> to no longer be notified by
     * this <tt>AudioMediaStream</tt> about incoming DTMF tones
     * @see AudioMediaStream#removeDTMFListener(DTMFListener)
     */
    public void removeDTMFListener(DTMFListener listener)
    {
        dtmfListeners.remove(listener);
    }

    /**
     * Registers <tt>listener</tt> as the <tt>CsrcAudioLevelListener</tt> that
     * will receive notifications for changes in the levels of conference
     * participants that the remote party could be mixing.
     *
     * @param listener the <tt>CsrcAudioLevelListener</tt> that we'd like to
     * register or <tt>null</tt> if we'd like to stop receiving notifications.
     */
    public void setCsrcAudioLevelListener(CsrcAudioLevelListener listener)
    {
        csrcAudioLevelListener = listener;
    }

    /**
     * Sets <tt>listener</tt> as the <tt>SimpleAudioLevelListener</tt>
     * registered to receive notifications from our device session for changes
     * in the levels of the audio that this stream is sending out.
     *
     * @param listener the <tt>SimpleAudioLevelListener</tt> that we'd like to
     * register or <tt>null</tt> if we want to stop local audio level
     * measurements.
     */
    public void setLocalUserAudioLevelListener(
            SimpleAudioLevelListener listener)
    {
        if (localUserAudioLevelListener != listener)
        {
            localUserAudioLevelListener = listener;

            AudioMediaDeviceSession deviceSession = getDeviceSession();

            if (deviceSession != null)
            {
                deviceSession.setLocalUserAudioLevelListener(
                        localUserAudioLevelListener);
            }
        }
    }

    /**
     * {@inheritDoc}
     */
    public void setOutputVolumeControl(VolumeControl outputVolumeControl)
    {
        if (this.outputVolumeControl != outputVolumeControl)
        {
            this.outputVolumeControl = outputVolumeControl;

            AudioMediaDeviceSession deviceSession = getDeviceSession();

            if (deviceSession != null)
                deviceSession.setOutputVolumeControl(this.outputVolumeControl);
        }
    }

    /**
     * Sets <tt>listener</tt> as the <tt>SimpleAudioLevelListener</tt>
     * registered to receive notifications from our device session for changes
     * in the levels of the party that's at the other end of this stream.
     *
     * @param listener the <tt>SimpleAudioLevelListener</tt> that we'd like to
     * register or <tt>null</tt> if we want to stop stream audio level
     * measurements.
     */
    public void setStreamAudioLevelListener(SimpleAudioLevelListener listener)
    {
        if (streamAudioLevelListener != listener)
        {
            streamAudioLevelListener = listener;

            AudioMediaDeviceSession deviceSession = getDeviceSession();

            if (deviceSession != null)
            {
                deviceSession.setStreamAudioLevelListener(
                        streamAudioLevelListener);
            }
        }
    }

    /**
     * Starts sending the specified <tt>DTMFTone</tt> until the
     * <tt>stopSendingDTMF()</tt> method is called (Excepts for INBAND DTMF,
     * which stops by itself this is why where there is no need to call the
     * stopSendingDTMF). Callers should keep in mind the fact that calling this
     * method would most likely interrupt all audio transmission until the
     * corresponding stop method is called. Also, calling this method
     * successively without invoking the corresponding stop method between the
     * calls will simply replace the <tt>DTMFTone</tt> from the first call with
     * that from the second.
     *
     * @param tone the <tt>DTMFTone</tt> to start sending.
     * @param dtmfMethod The kind of DTMF used (RTP, SIP-INOF or INBAND).
     * @param minimalToneDuration The minimal DTMF tone duration.
     * @param maximalToneDuration The maximal DTMF tone duration.
     * @param volume The DTMF tone volume.
     *
     * @throws IllegalArgumentException if <tt>dtmfMethod</tt> is not one of
     * {@link DTMFMethod#INBAND_DTMF}, {@link DTMFMethod#RTP_DTMF}, and
     * {@link DTMFMethod#SIP_INFO_DTMF}
     * @see AudioMediaStream#startSendingDTMF(
     *                          DTMFTone, DTMFMethod, int, int, int)
     */
    public void startSendingDTMF(
            DTMFTone tone,
            DTMFMethod dtmfMethod,
            int minimalToneDuration,
            int maximalToneDuration,
            int volume)
    {
        switch (dtmfMethod)
        {
        case INBAND_DTMF:
            MediaDeviceSession deviceSession = getDeviceSession();

            if (deviceSession != null)
                deviceSession.addDTMF(DTMFInbandTone.mapTone(tone));
            break;

        case RTP_DTMF:
            if (dtmfTransformEngine != null)
            {
                DTMFRtpTone t = DTMFRtpTone.mapTone(tone);

                if (t != null)
                    dtmfTransformEngine.startSending(
                            t,
                            minimalToneDuration,
                            maximalToneDuration,
                            volume);
            }
            break;

        case SIP_INFO_DTMF:
            // This kind of DTMF is not managed directly by the
            // OperationSetDTMFSipImpl.
            break;

        default:
            throw new IllegalArgumentException("dtmfMethod");
        }
    }

    /**
     * Interrupts transmission of a <tt>DTMFTone</tt> started with the
     * <tt>startSendingDTMF()</tt> method. Has no effect if no tone is currently
     * being sent.
     *
     * @param dtmfMethod The kind of DTMF used (RTP, SIP-INOF or INBAND).
     * @throws IllegalArgumentException if <tt>dtmfMethod</tt> is not one of
     * {@link DTMFMethod#INBAND_DTMF}, {@link DTMFMethod#RTP_DTMF}, and
     * {@link DTMFMethod#SIP_INFO_DTMF}
     * @see AudioMediaStream#stopSendingDTMF(DTMFMethod)
     */
    public void stopSendingDTMF(DTMFMethod dtmfMethod)
    {
        switch (dtmfMethod)
        {
        case INBAND_DTMF:
            // The INBAND DTMF is sent by impluse of constant duration and does
            // not need to be stopped explicitly.
            break;

        case RTP_DTMF:
            if (dtmfTransformEngine != null)
                dtmfTransformEngine.stopSendingDTMF();
            break;

        case SIP_INFO_DTMF:
            // The SIP-INFO DTMF is managed directly by the
            // OperationSetDTMFSipImpl.
            break;

        default:
            throw new IllegalArgumentException("dtmfMethod");
        }
    }
}


Home > Get Help > Need advice?
If you rent your home and you are having a problem, in a lot of cases you can resolve the issue yourself when you understand more about it. We provide many fact sheets that outline various aspects of renting, what can go wrong, who is responsible, what the correct process is, and how to fix problems. We also offer information on common problems that may be useful for you.
If you have a tenancy problem that is not covered by one of our fact sheets or you've read them and still need more information, you are welcome to contact us for advice.
And don't forget that if you need information rather than legal advice, you can call the free Consumer Protection information line on 1300 304 054.
When you contact us for advice we will gather some information about you and your situation. We require your landlord's name before we can provide you with legal advice. You should be able to find their name on your lease document. If you rent through a Real Estate Agency, they can provide your landlord's name. If you are having difficulty finding out your landlord's name, you can contact the Bond Administrator at the WA Department of Commerce on 1300 853 829 and they will be able to help.
Sometimes your information is gathered by one of our student volunteers who help us with administration duties, freeing up time that can be used to help more people. Legal advice is only given to you by one of our Legal Practitioners or Tenant Advocates. Most advice is given to you over the telephone. It is always best to have all your documentation on your rental in front of you.
When you book a telephone advice session with our online booking system, you will be able to choose a call back in the morning, between 9am – 12pm, or the afternoon, between 1pm – 5pm. Your call will take less time and will concentrate on the rental issue you are experiencing because we will already have all the information you provide on the online form. Some fixed time appointments are available each day, and these are reserved for people who have little flexibility in their workday. You can access our online booking system here.
Our advice line operates Monday to Friday between 9:00am and 4:30pm. One of our team will take your information and ask you some questions about your situation and we will then provide you with advice on your tenancy problem. We are a state-wide service and we know that at times it can be difficult to get through on the advice line, so you may find it easier to use our online booking system.
Please note: We do not provide email advice.
If your situation is very urgent and you need immediate advice, we recommend you try our advice line, or alternatively you can contact your local tenant advocate.
Demand for our services is extremely high. We know there are phone calls on our advice line that are going unanswered, however with our current funding we can't expand our services to assist those people who are missing out.
Tenancy WA is facing a decrease in the level of funding it receives from the Department of Commerce for the provision of tenancy advice and education services in WA. The source of this funding is income earned on residential tenancy bonds paid to the Bond Administrator and held in trust in the Rental Accommodation account. Very low interest rates over a protracted period has reduced the current level of funding available to provide these services.
Rather than cutting our services and in order to protect the level of service we currently offer, we made the decision to introduce a low-cost service fee. This fee can be waived in certain circumstances. Talk to us about your situation if you have concerns.


21-1934 Registered office; registered agent.
21-1935 Change of registered office or registered agent.
21-1936 Resignation of registered agent.
21-19,110 Restated articles of incorporation.
21-19,131 Notice to the Attorney General.
21-19,173 Notice of incorporation, amendment, merger, or dissolution; publication.


She also suggested that Wizkid has not been performing Father's duty towards their child.
With the advent of the new Instagram question sticker, some of Binta's followers on the app had the opportunity to ask her questions. One of her followers asked, "what if Wizkid wants a second baby with you?" and she responded with an emoji that suggests that she would turn down such request.
Next Story → Is Davido finally ready to settle down?


The teaser for the new Netflix animated series, Disenchantment, opens with a commentary telling us that if Futurama showed us the future, and Springfield showed us the modern times, the next obvious step is to go back to the past. Disenchantment takes place in a medieval setting with kings, jesters, and everything that's a very much toned down Game of Thrones world.
Disenchantment is the third animated series created by Matt Groening, who also created the 1999 sci-fi animated sitcom, Futurama and the longest running animated sitcom since 1989, The Simpsons.
Disenchantment is set to premiere in Netflix on August 17.


text:
Calciomercato.com
Ronaldinho warns Milan: 'My future after the World Cup'
Milan sporting director Ariedo Braida, said: "Ronaldinho is staying with us". Adriano Galliani said: "We will not sell our champions". Ronaldinho, now on holiday in Rio de Janeiro, said: "I won't say anything until the end of the World Cup. Nothing personal". Perhaps something between him and the club went wrong.
Ronaldinho has been one of the best players last season and he was expecting a reward from the club. His contract is expiring in 2011 and has not been renewed yet. Milan want to cut his salary and Ronaldinho is now looking for alternatives. Manchester City is no more an option as well as any European club. According to globoesporte.com, Flamengo and Palmeiras are interested. But Ronaldinho is fascinated by the Los Angeles Galaxy of his friend Beckham.
© 1996.22 Calcioinfinito Srl - Tutti i diritti riservati - Codice Fiscale 04154590964
I dati di traffico di Calciomercato.com
sono certificati AudiWeb.


text:
Q: What is the QGIS 2.2 print layout map extent CRS? I have project in ESPG:4326 with 2 layers (both in 4326), and map print layout.
I've chosen current extent for layout map. Map is centered and prints as I expect.
Next, I access this object via python console
iface.activeComposers()[0].composition().getComposerMapById(0).extent()

And it's not in 4326. For Carlsruhe GE I've got

POLYGON((
932814.23699999996460974 6276112.49500000011175871,
934971.30599999998230487 6276112.49500000011175871,
934971.30599999998230487 6277610.67700000014156103,
932814.23699999996460974 6277610.67700000014156103,
932814.23699999996460974 6276112.49500000011175871))

How could I get CRS of print layout map object extent?


text:
Bylaws and Financials
USS Pampanito
Commodore Club
USS Pampanito (SS-383)
The USS Pampanito made six patrols in the Pacific during World War II during which she sank six Imperial Japanese ships and damaged four others. Operated by the Maritime Park Association, Pampanito hosts over 100,000 visitors a year and is one of the most popular historic vessels in the country. In addition to day time visitors, over 1,500 kids a year participate in Pampanito's educational day and overnight programs. Pampanito is a National Historic Landmark.
The USS Pampanito is being restored to a specific point in time, late summer, 1945, to represent the height of WW II submarine development. The Maritime Park Association has scoured the country in search of missing equipment and spare parts. Almost all of the missing items have now been replaced and much of the equipment on board has been restored to operation.
We owe it to future generations to preserve our history, this includes on-going maintenance Pampanito. Museum ships are the only museum artifacts that are regularly stored in a corrosive environment (salt water.) Every seven years Pampanito must be dry-docked in order to inspect, paint and complete vital repairs to her hull. We need your help, and are now seeking funding and preparing for her next preservation drydocking. Please share the drydock brochure.
Donate Tickets Education
History & Crew
After WWII
Pampanito Info
Bringing our maritime heritage to life through education, preservation and philanthropy.
San Francisco Maritime
National Park Association
San Francisco, CA 94147-0310, USA
Tel at
Pampanito: 415-775-1943
Proud Partner of the National Park Service


text:
Computex 2017: AMD Press Event Live Blog
by Ian Cutress on May 30, 2017 8:34 PM EST
Computex 2017
ThreadRipper
09:42PM EDT - AMD is having a press conference here in Taipei for Computex 2017. Starting in 20 minute or so
09:42PM EDT - AMD held it's Financial Analyst Day two weeks ago where they announced a few things like Epyc
09:42PM EDT - so I'm not sure exactly what's on the announcement list today
10:00PM EDT - It's very red in here, as you can see. And we've got the typical fare of AMD-powered systems throughout the room.
10:02PM EDT - We are about to start, oh so it seems. President of AMD's greater China region, Spencer Pan kicking things off.
10:03PM EDT - AMD has been in Taiwan for 30 years. Spencer is promising details about the high end of the PC market.
10:05PM EDT - Lisa Su now taking stage. Reiterating the 30th anniversary in Taiwan, and talking about this region's role in the ecosystem.
10:06PM EDT - Lisa is talking about high performance computing, and its importance in everything AMD does. This is a continuation of what AMD talked about at the Financial Analyst Day.
10:07PM EDT - Markets on this front: Data center (Epyc), Immersive (Vega) and of course PCs. She says we'll be talking about the PC market a bit more today, but starting with data center.
10:09PM EDT - Data center drivers: huge amounts data. But also the data center has heterogenous workload needs -- performance, but also better security and more TCO (total cost of ownerships). Hence, EPYC. Thinking not just about CPU performance but system-wide performance. AMD wants to ensure leadership in two socket. 45% more cores, 122% more memory bandwidth, 60 more I/O.
10:10PM EDT - Then onto single socket designs: 1 EPYC processor is more than 50% of Intel's offerings. But also lower power consumption and operating expense. Striving for 30% TCO advantage.
10:11PM EDT - Showing some of the competitive performance numbers now. Announcing EPYC launch on June 20, 2017 worldwide. Announcing this for the first time here.
10:13PM EDT - Now moving onto Radeon Instinct. Advanced design for compute and scale out performance. About 25 Teraflops of performance (with optimized software workloads).
10:13PM EDT - Showing benchmark in machine learning vs P100 with DeepBench.
10:14PM EDT - More discussion around that combination of EPYC and Radeon Instinct in the data center. Looking forward to hearing more about this.
10:15PM EDT - Recapping Ryzen 7, 5
10:15PM EDT - Ryzen 3 coming in Q3
10:15PM EDT - A few Ryzen OEM systems are on display at the show
10:15PM EDT - All five major OEMs launching systems this quarter
10:15PM EDT - Dell to the stage
10:16PM EDT - Systems on the stage: desktops and all-in-ones
10:16PM EDT - Dell launched three products: two all-in-ones and a desktop
10:16PM EDT - The desktop is designed for gaming
10:16PM EDT - 'Worlds first and only all-in-one with an eight core CPU'
10:17PM EDT - (I don't think he was counting Xeons here'
10:17PM EDT - CPU plus a GPU up to 110W
10:17PM EDT - Infinity edge display
10:17PM EDT - Link: http://www.anandtech.com/show/11455/dell-launches-inspiron-27-7775-aio-ryzen-7-rx-580
10:17PM EDT - 'VR Ready' with RX 570
10:17PM EDT - Now onto the gaming desktops
10:18PM EDT - A large amount of volume dedicated to cooling components
10:18PM EDT - Note that Dell systems use proprietary motherboards
10:18PM EDT - It'd be interesting to see exactly what goes on with them for AM4
10:19PM EDT - Acer (Jerry Kao) now to the stage, president of IT Products Business
10:19PM EDT - 'AMD are energetic like teenagers!'
10:19PM EDT - 'Everyone thinks about gaming and the best of performance'
10:19PM EDT - 'There are a lot of gamers who are casual gamers'
10:20PM EDT - He's holding a laptop with RX560 inside and Ryzen
10:20PM EDT - Look at that bezel
10:20PM EDT - 15-inch it looks like
10:20PM EDT - 15-inch Full-HD with Dolby Audio Premium
10:21PM EDT - 'Acer's best thermal technology'
10:21PM EDT - I'm surprised people are talking about Cooling here. It's as if they're trying to say something
10:21PM EDT - Now showing a desktop with Ryzen 7 and AMD GPU
10:21PM EDT - 'AMD is the only company to provide the combination of CPU and GPU'
10:22PM EDT - 'In an office, this is a powerful PC. It also does gaming'
10:22PM EDT - Wireless charging into the base unit
10:22PM EDT - HP to the stage: Spike Huang (Director HP Omen Product Management)
10:23PM EDT - Stating HP and AMD's partnership, 'based on trust'
10:24PM EDT - Showing desktop on stage with Ryzen
10:24PM EDT - Same chassis design we've seen with Bristol Ridge units
10:24PM EDT - Lenovo to the stage, Tony Chen, Executive Director Consumer PC Product Management
10:25PM EDT - Two media centers with AMD CPUs being announced at the show from Lenovo
10:25PM EDT - 'Ryzen has many threads for gamers'
10:25PM EDT - 'AMD CPU and GPU'
10:25PM EDT - >lots of marketing, but it's AMD showing they have ecosystem partners in place
10:26PM EDT - ASUS to the stage, Derek Yi, Global Marketing Director of ROG
10:27PM EDT - 'ROG is very successful with AMD'
10:27PM EDT - 'AMD Laptops have been missing for a while, so ROG is announcing one with Ryzen'
10:28PM EDT - RX 580, Ryzen 7 CPU
10:28PM EDT - 512GB M.2
10:28PM EDT - ROG Gaming Center
10:28PM EDT - ASUS Strix GL702ZC
10:29PM EDT - rolls off the tongue
10:29PM EDT - Freesync panel
10:29PM EDT - 'VR Ready'
10:29PM EDT - Scores 1410 on Cinebench
10:29PM EDT - So is it a dekstop CPU ?
10:30PM EDT - 'Close to the highest retail laptop score for Cinebench'
10:30PM EDT - Good bezels
10:30PM EDT - Supporting OBS
10:30PM EDT - No details on screen resolution, 1080p likely
10:31PM EDT - Jim Anderson to the stage, SVP and GM of Computing and Graphics
10:31PM EDT - Talking about the past and future of AMD
10:32PM EDT - Talking about the next wave of products for 12-16 months
10:32PM EDT - Ryzen in Mobile for Computex
10:32PM EDT - That's CPU, not APU, at this time
10:33PM EDT - Today has new product updates for notebook and desktops
10:33PM EDT - Goign to talk APUs and Threadripper
10:33PM EDT - Starting with Mobile
10:33PM EDT - APUs coming to consumer premium systems in 2H
10:33PM EDT - Working with OEMs for several months already
10:33PM EDT - In 2-in-1s, convertables and ultraportables
10:34PM EDT - Obviously they're targeting traditional ultraportable markets, because they have such a low market share
10:34PM EDT - APUs coming 2H17 for consumer, Pro APUs for commercial coming 1H18
10:34PM EDT - APUs will have Zen cores and Vega Graphics
10:35PM EDT - focusing on the trifecta: CPU perf, GPU perf and efficiency
10:35PM EDT - Ryzen Mobile APU on stage
10:36PM EDT - Looks like the size of a penny
10:36PM EDT - Kevin Lensing on stage showing a Ryzen 2-in-1 APU engineering sample
10:36PM EDT - sub-15mm notebook
10:36PM EDT - 4 cores and 8 threads plus Vega
10:36PM EDT - so one CCX
10:37PM EDT - AMD are set to tackle Intel's dual core market with quad cores and better graphics. The only question is power
10:37PM EDT - That's Ryzen Mobile, now onto Desktop
10:37PM EDT - Seven Ryzen CPUs in the market
10:38PM EDT - Showing CineBench perf
10:38PM EDT - Showing some of the graphics presented at the Financial Analyst Day
10:41PM EDT - Showing some gaming
10:41PM EDT - Intel vs AMD gaming while streaming - 7600K vs Ryzen 5 1600X
10:41PM EDT - Ryzen 5 isn't dropping frames with 50% CPU, Intel is maxxing the CPU
10:42PM EDT - Announcing today: All Ryzen Desktop CPUs are Oculus Approved (including Ryzen 3)
10:42PM EDT - Now talking ThreadRipper and X399
10:43PM EDT - Coming Summer 2017
10:43PM EDT - Targeting HEDT
10:44PM EDT - All new platform
10:44PM EDT - socket looks fun, too
10:44PM EDT - 16 cores, 32 threads
10:44PM EDT - 64 PCIe 3.0 lanes
10:44PM EDT - YES, 64
10:45PM EDT - that's 60 + 4 for the chipset
10:45PM EDT - Quad channel DRAM
10:45PM EDT - Note, 60 lanes of PCIe 3.0 - that's 3 x16 GPUs and 3x M.2 PCIe 3.0 x4 drives all from the CPU
10:45PM EDT - All four main motherboard partners are set to launch boards
10:46PM EDT - Showing off Threadripper, looks like the Naples package
10:47PM EDT - Showing Blender on Threadripper
10:48PM EDT - That's all on Threadripper - no mention of pricing or release date, except Summer 2017
10:48PM EDT - Lisa back to the stage
10:49PM EDT - Now on to Vega
10:49PM EDT - Showing Vega in a new context
10:49PM EDT - Radeon Vega Frontier announced last week
10:50PM EDT - 64 CUs, 25 TF, 16GB HMB2
10:51PM EDT - Threadripper plus four Vega GPUs running on Blender with Radeon Pro Render plugin
10:51PM EDT - CPU is running 26 threads at 40%
10:52PM EDT - Radeon Vega Frontier Edition, Launching June 27th
10:52PM EDT - Now for gaming: RX Vega
10:53PM EDT - Showing video of Prey at 4K Ultra with Threadripper and two RX Vega GPUs
10:53PM EDT - There's tearing... no Vsync
10:54PM EDT - RX Vega is launching at SIGGRAPH at the end of July
10:54PM EDT - More about Threadripper and Vega over the next couple of months
10:55PM EDT - Wrapping up the press conference. Time to talk to Jim for my samples...
Outlander_04 - Friday, June 2, 2017 - link
Gaming was my sole reason to upgrade so I have an R5 1600
lioncat55 - Friday, June 2, 2017 - link
Actually, that 14% shrinks with both faster memory and higher resolutions.
Dr. Swag - Wednesday, June 14, 2017 - link
Faster memory only applies in certain titles, and even then it only shrinks to 10%.
Yes at higher resolutions the difference is less, but once you upgrade your GPU in the future to something more powerful that difference might be more pronounced and closer to the 10% 1080p difference.
Nem35 - Wednesday, May 31, 2017 - link
HAHA! Gothmoth you made my day.
WorldWithoutMadness - Tuesday, May 30, 2017 - link
raven ridge, raven ridge, please announce raven ridge
JDG1980 - Tuesday, May 30, 2017 - link
When will they shut up about OEMs and get to Vega?!
Terrible presentation so far. We don't listen to Computex to hear bragging about existing products, but to learn something new. So far we haven't learned anything meaningful except the EPYC release date (those Raven Ridge slides were already leaked).
Cygni - Tuesday, May 30, 2017 - link
I don't think AMD really cares why you listen to Computex presentations over the internet.
JDG1980 - Wednesday, May 31, 2017 - link
No, but they will care when financial analysts start talking about the utter lack of meaningful substance in tonight's presentation and the stock price drops as a result.
qasdfdsaq - Wednesday, May 31, 2017 - link
Yeah, that happened... Not.
AMD stocks are up, Intel are down. The market continues to surprise me...